Git中的分支
Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件,所以创建和销毁一个分支就变得非常廉价。说白了,新建一个分支就是向一个文件写入 41 个字节(外加一个换行符)那么简单。
分支的新建与切换
git branch [branch_name] #这个命名说的是新建一个分支,分支的名称可以自己制定
git checkout [branch_name] #这个命令说的是切换到新建的分支
上面两个命令也可以合并成一个命令
git checkout -b [branch_name]
分支的删除
git branch -d [branch_name]
解决冲突
如果在不同的分支中都修改了同一个文件的同一部分,Git 就无法干净地把两者合到一起(译注:逻辑上说,这种问题只能由人来裁决。)。如果你在解决问题 #53 的过程中修改了 hotfix 中修改的部分,将得到类似下面的结果:
$ git merge iss53
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed;
fix conflicts and then commit the result.
Git 作了合并,但没有提交,它会停下来等你解决冲突。要看看哪些文件在合并时发生冲突,用 git status 查阅:
$ git status
On branch master
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add..." to mark resolution)
both modified:
index.html
no changes added to commit (use "git add" and/or "git commit -a")
任何包含未解决冲突的文件都会以未合并(unmerged)的状态列出。Git 会在有冲突的文件里加入标准的冲突解决标记,可以通过它们来手工定位并解决这些冲突。可以看到此文件包含类似下面这样的部分:
<<<<<<< HEAD
contact : email.support@github.com
=======
please contact us at support@github.com
>>>>>>> iss53
可以看到 ======= 隔开的上半部分,是 HEAD(即 master 分支,在运行 merge 命令时所切换到的分支)中的内容,下半部分是在 iss53 分支中的内容。解决冲突的办法无非是二者选其一或者由你亲自整合到一起。比如你可以通过把这段内容替换为下面这样来解决:
please contact us at email.support@github.com
这个解决方案各采纳了两个分支中的一部分内容,而且我还删除了 <<<<<<<,======= 和 >>>>>>> 这些行。在解决了所有文件里的所有冲突后,运行 git add 将把它们标记为已解决状态(译注:实际上就是来一次快照保存到暂存区域。)。因为一旦暂存,就表示冲突已经解决。如果你想用一个有图形界面的工具来解决这些问题,不妨运行 git mergetool,不过事先需配置。
退出合并工具以后,Git 会询问你合并是否成功。如果回答是,它会为你把相关文件暂存起来,以表明状态为已解决。再运行一次 git status 来确认所有冲突都已解决:
$ git status
On branch master
Changes to be committed: (use "git reset HEAD..." to unstage)
modified: index.html
所有冲突都已解决,也就是进入了暂存区,就可以用 git commit 来完成这次合并提交,有必要略加注解。
几个实用的分支管理指令
列出所有本地分支 git branch
列出所有分支包括远程 git branch -a
若要查看各个分支最后一个提交对象的信息, git branch -v
查看哪些分支已被并入当前分支(译注:也就是说哪些分支是当前分支的直接上游。) git branch --merged
查看尚未合并的工作 git branch --no-merged