前言: 每个人对于git的理解不同,本文只简要概述分支的一些操作,并不会针对去描述分支的具体细节,比如分支的指针指向是怎样的。
1.分支创建与删除
创建:git branch <branchName>
删除:git branch -d <branchName>
2.分支切换
git checkout <branchName>
在分支切换的过程中提交版本,会出现分叉的情况,可以简单地使用 git log 命令查看分叉历史。 运行git log --oneline --decorate --graph --all
,它会输出你的提交历史、各个分支的指向以及项目的分支分叉情况。
通常我们会在创建一个新分支后立即切换过去,这可以用 git checkout -b <newbranchname>
一条命令搞定。
3. 分支合并
git merge <branchName> 将当前分支与命令中的branch合并。合并后,可删除两个其中的一个分支,因为此时两个分支是等效的。
当分支合并的时候,会有两种情况出现:
3.1 同一分支
当master和hotfix处于同一条路径上,则两者合并后,会将master指针指向hotfix指向的区域,随后我们可以删除hotfix分支。
3.2 不同分支
下面的master分支和iss53分支处于分叉的场景,这种情况下,Git 会使用两个分支的末端所指的快照(C4和C5)以及这两个分支的公共祖先(C2),做一个简单的三方合并。
合并:
和之前将分支指针向前推进所不同的是,Git 将此次三方合并的结果做了一个新的快照并且自动创建一个新的提
交指向它。 这个被称作一次合并提交,它的特别之处在于他有不止一个父提交。
4.分支冲突
当不同的分支对于同一个文件的部分内容都作出了修改,则会出现合并冲突。此时 Git 做了合并,但是不会自动地创建一个新的合并提交。 Git 会暂停下来,等待你去解决合并产生的冲突。你可以在合并冲突后的任意时刻使用 git status 命令来查看那些因包含合并冲突而处于未合并。
在你解决了所有文件里的冲突之后,对每个文件使用 git add 命令来将其标记为冲突已解决。 一旦暂存这些原本有冲突的文件,Git 就会将它们标记为冲突已解决。
如果你想使用图形化工具来解决冲突,你可以运行 git mergetool,该命令会为你启动一个合适的可视化合并工具,并带领你一步一步解决这些冲突
如果你对结果感到满意,并且确定之前有冲突的的文件都已经暂存了,这时你可以输入 git commit 来完成合 并提交
5.分支管理
git branch 命令不只是可以创建与删除分支。 如果不加任何参数运行它,会得到当前所有分支的一个列表:
$ git branch
iss53
* master
testing
注意 master 分支前的 * 字符:它代表现在检出的那一个分支。
如果需要查看每一个分支的最后一次提交,可以运行 git branch -v 命令:
$ git branch -v
iss53 93b412c fix javascript issue
* master 7a98805 Merge branch 'iss53'
testing 782fd34 add scott to the author list in the readmes
--merged 与 --no-merged 这两个有用的选项可以过滤这个列表中已经合并或尚未合并到当前分支的分支。 如果要查看哪些分支已经合并到当前分支,可以运行 git branch --merged:
$ git branch --merged
iss53
* master
因为之前已经合并了 iss53 分支,所以现在看到它在列表中。 在这个列表中分支名字前没有 * 号的分支通常可以使用 git branch -d 删除掉;你已经将它们的工作整合到了另一个分支,所以并不会失去任何东西。
查看所有包含未合并工作的分支,可以运行 git branch --no-merged:
$ git branch --no-merged
testing
这里显示了其他分支。 因为它包含了还未合并的工作,尝试使用 git branch -d 命令删除它时会失败,如果真的想要删除分支并丢掉那些工作,如同帮助信息里所指出的,可以使用 -D 选项强制删除它。