笔记一的链接:有关Git本地仓库的操作(笔记二)
6.Git分支
Git分支的基础知识
-
HEAD
- HEAD是唯一的
- HEAD所指向的分支,就是当前所在分支
- 通过
git log可以查看HEAD现在所指向的分支是哪一个
-
master分支
- master分支是
git init命令执行后就会自动生成,master是Git的默认分支 - 它会在每次提交中自动前移,其余分支也是如此
- 它与其它分支并无区别,只是在创建时默认生成,多数人愿意将其称为主分支(实际并无主次)
- master分支是
-
其它分支
- 由自己创建
-
分支是团队项目的基础,灵魂
Git分支相关的操作和命令
-
git branch- 查看所有分支,分支前面有 * 号的分支就是当前所处分支
-
git branch [branchName]- [branchName] 是自己创建分支名称
-
git checkout [branchName]- 切换分支到自己想要到的分支名称上
-
git checkout -b [branchName]- 该语句用于创建分支,并且将分支切换到新创建的这个分支上
*
git log --decorate --oneline - 用于查看分支上有哪些提交操作
- 该语句用于创建分支,并且将分支切换到新创建的这个分支上
*
Git分支的合并操作和命令
-
合并时需要先切换回自己的主分支(一般以master为主分支),然后进行合并
-
git merge [branchName]- 该命令,将名为[branchName]的这个分支合并到当前分支上来
- 如果master在需要合并的[branchName]分支上,并没有分叉出去将会发生快速前移,快速迁移后,HEAD指针将会同时指向两个分支,不友好,所以需要用以下命令阻止快速前移。
git merge --no-ff -m '这是一次合并操作' [branchName]- 快速前移在历史(
git log)中,不会有我们操作过合并分支的记录,不够友好,所以,有了上述的阻止快速前移命令。
- 快速前移的图例:
- 快速前移合并前:
- 快速前移合并后:
- 快速前移合并前:
-
git log --oneline --decorate --all --graph-
该命令,将目前所有的提交命令显示出来,并且会在左侧生成一个树状图
-
--oneline:将当前命令显得简短一些(短哈希)
-
--decorate:打印出分支的信息
-
--all:不仅仅打印当前分支,打印所有分支
-
--graph:生成树状图
形如:
-
-
分支冲突
- master和branch1处于同一条commit路径上(并且属于直接祖先关系),master和branch1将会自动直接合并,不会冲突。(branch1是指的自己需要合并的分支,这里的合并方式也指的是快速前移)
- 如果不是直接祖先关系,就会判断是否有相同文件中有不同内容,如果有不同的内容话,就需要自己手动处理后再次提交,或则放弃合并,或则撤销(后面有撤销相关笔记)。
- 手动处理:提交警告后,打开警告相关文件,然后进行手动选择需要保留的部分和删除不需要的部分,解决完后再次提交。
- 取消合并:
git merge --abort,直接取消本次合并,回退到合并之前的操作
删除分支
git branch -d [branchName]- 合并完成后,分支的意义就不会太大,可以通过该语句删除分支。
- 如果分支从未合并,但是如果仍要删除,需要使用命令:
git branch -D [branchName]强制删除 - HEAD所指向的分支,无法删除。
7.撤销
git checkout [fileName]- fileName:文件名,该命令会撤销本次的文件的修改(如果文件进入了已修改状态,即可用该命令撤回本次的文件修改)
- 该命令只适用于没有放入暂存区,没有提交的文件
- 原理是:它会自动去将你所指定的文件,回退到与上一次提交的内容去,也就是将你此次的修改给回退了。(目前我知道这是不可逆的,谨慎适用)
git reset HEAD fileNmae- 取消掉已经在暂存区中的文件
git commit -m '描述' --amend- 该命令会将上一次的提交的描述内容进行覆盖操作。(紧接着操作才可以)
- 该命令适用于发现自己描述写错的时候使用
git commit --amend- 该命令会将这次的提交和上次的提交用同一个描述(也就是合并上一次的提交)
- 该命令适合于发现自己上次提交的内容中还需要补充一些提交内容
Reset
git reset "HEAD[^]"- 撤销命令,^的个数相当于当前位置向前撤销几条
git reset "HEAD~[Number]"- 当希望撤消3步的时候,写法变为:
git reset "HEAD~3",Number为所需要回退的步数
- 当希望撤消3步的时候,写法变为:
git reset [哈希值]- 撤销是不等于是丢失(也就是commit的东西是仍然存在的),可以通过哈希返回。假如撤销了哈希为4fs5a4f的快照,或者撤销了它之前的很多操作想回到哈希为4fs5a4f的快照的提交,那么通过:
git reset 4fs5a4f即可返回之前的提交。
- 撤销是不等于是丢失(也就是commit的东西是仍然存在的),可以通过哈希返回。假如撤销了哈希为4fs5a4f的快照,或者撤销了它之前的很多操作想回到哈希为4fs5a4f的快照的提交,那么通过:
git reflog- 查看日志历史提交记录,有每一次的提交的哈希值,可以结合
git reset [哈希值]命令的操作。
- 查看日志历史提交记录,有每一次的提交的哈希值,可以结合
git reset "HEAD[^]" --hard- 该命令会撤销,并且删除掉工作区所有操作,清空暂存区(不建议适用)。
git reset "HEAD[^]" --soft- 该命令会撤销,不删除掉工作区操作,不会清空暂存区。
git reset "HEAD[^]" --mixed(默认)- 该命令会撤销,不删除掉工作区操作,但是会清空暂存区。
Checkout和Reset的区别
-
checkout的移动只会带着HEAD进行移动,而Reset的移动,会带着分支一起移动
-
reset会带着master指针(分支的指针)一起移动,对
git log有影响 -
checkout只会移动HEAD不会带着master指针一起移动,这样的移动,打印出来的日志
git log并没有变化 -
所以常用checkout来切换分支,因为他不会带上master指针(分支的指针)
-
为了便于理解,所以附图如下:
-
移动前:
-
移动后:
-
-
8.存储
-
git stash- 存储暂存区以及工作目录中的修改文件
- 该命令执行后,会生成一个新的存储,后续将其取出来使用即可
- 适用情景:当切换分支时,不希望暂存区和工作区的操作一并带过去时就可以适用存储
-
git statsh -u- 该命令的意思是将为追踪的文件也同时放入到存储当中(默认是不会将未追踪文件一并加入的)
-
git statsh list-
通过该命令打印所有的存储内容,也是为后续指定取出打印出相应信息(stashName)
-
红框部分即为stashName:
-
-
git stash apply [stashName]- [stashName]是上方打印出来的
- 取出对应储存放入工作区(没有进入暂存区)
-
git stash apply [stashName] --index- 取出对应储存并且放入暂存区等待提交
-
git stash drop- 移除储存,后面可以跟对应的名称,指定删除
- 默认删除一个(第一个),也就是第一次存储的内容
9.rabase(变基)
-
变基和merge一样都是分支合并,变基更加注重过程,而merge更加注重结果
-
git rabase master-
该命令执行前,需要将HEAD移动到需要合并的分支上,这里假设需要合并的分支为branch1,然后执行语句后,branch1上的所有提交操作,将会放到master分支的后方,然后执行以下命令进行快速前移完成合并。
-
git checkout master //将HEAD指向master分支的指针 git merge branch1 //执行merge命令快速前移,完成合并 -
需要注意的是,合并后,原branch1上的记录并没有马上删除,所以,master后方衔接上的部分,不会和branch1上的哈希值相同。在我们长期未操作后,Git才会自动回收原branch1上的分支。(短时间内可以通过
git relog查看原branch1上的快照)
-
9.其它操作
-
tag标签:
-
虽然commit可以写描述,但是哈希太长,没有规律,所以适用tag来进行版本标注,tag不会自动前移
-
下列列举有关标签的操作命令:
git tag v1.0 //git标签,默认在最近一次提交上 git tag v0.2 [哈希值] //该条命令是给指定哈希值添加标签 git tag //查看所有标签 git tag -a v1.0 -m "描述" [哈希值] //添加标签,并且添加详细描述 git show v1.0 //查看标签1.0的详细信息 git tag -d v1.0 //删除指定标签
-
-
git config --global alias.co checkout- 该命令的作用取别名。
- git config:设置配置。
- --global:设置在全局(可以改为--local设置为当前文件)。
- alias.co checkout:这一段的意思是,将checkout取别名为co。(alias:别名)
-
忽略文件
-
在命令行中生成文件:
touch .gitignore -
然后再该文件中直接配置即可
-
需要注意的是:.gitignore文件只能忽略哪些没有被跟踪(track)的文件夹,如果某些文件已经纳入了版本管理,那么修改.gitignore是无效的,解决办法是:
git rm -r --cached .:删除暂存区的文件,而不是删除工作区文件(-r删除文件夹及其子目录)git add .:添加到暂存区git commit -m 'update gitignore':提交
-