分支管理
# 概述
分支在实际中有什么用呢? 假设您准备开发一个新功能,但是需要两周才能完成,第一周您写了 50% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 现在有了分支,就不用怕了。您创建了一个属于您自己的分支,别人看不到,还继续在原来的分支上正常工作,而您在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。 其他版本控制系统如 SVN 等都有分支管理,但是用过之后您会发现,这些版本控制系统创建和切换分支比蜗牛还慢,简直让人无法忍受,结果分支功能成了摆设,大家都不去用。 但 Git 的分支是与众不同的,无论创建、切换和删除分支,Git 在 1 秒钟之内就能完成! 无论您的版本库是 1 个文件还是 1 万个文件。
# 创建与合并分支
HEAD 指针 --> 分支指针(master/dev) --> 提交
git checkout 命令加上 -b 参数表示创建并切换,相当于以下两条命令:
git branch dev
# nothing
git checkout dev
Switched to branch 'dev'
2
3
4
然后,用 git branch 命令查看当前分支:
git branch
* dev
master
2
3
git branch 命令会列出所有分支,当前分支前面会标一个 * 号。
git checkout master就可以切换回 master 分支
我们把 dev 分支的工作成果合并到 master 分支上:
git merge dev
Updating d46f35e..b17d20e
Fast-forward
readme.txt | 1 +
1 file changed, 1 insertion(+)
2
3
4
5
git merge 命令用于合并指定分支到当前分支。
注意到上面的 Fast-forward 信息,Git 告诉我们,这次合并是 “快进模式”,也就是直接把 master 指向 dev 的当前提交,所以合并速度非常快。当然,也不是每次合并都能 Fast-forward。合并完成后,就可以放心地删除 dev 分支了:
git branch -d dev
Deleted branch dev (was b17d20e).
2
删除后,查看 branch,就只剩下 master 分支了:
git branch
* master
2
因为创建、合并和删除分支非常快,所以 Git 鼓励您使用分支完成某个任务,合并后再删掉分支,这和直接在 master 分支上工作效果是一样的,但过程更安全。
# 分支小结
- 查看分支:
git branch - 创建分支:
git branch <name> - 切换分支:
git checkout <name> - 创建+切换分支:
git checkout -b <name> - 合并某分支到当前分支:
git merge <name> - 删除分支:
git branch -d <name>
# 冲突
master 分支和 feature1 分支各自都分别有新的提交,Git 无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突,我们试试看:
git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
2
3
4
果然冲突了! Git 告诉我们,readme.txt 文件存在冲突,必须手动解决冲突后再提交。git status 也可以告诉我们冲突的文件:
git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: readme.txt
no changes added to commit (use "git add" and/or "git commit -a")
2
3
4
5
6
7
8
9
10
11
12
13
14
15
我们可以直接查看 readme.txt 的内容:
Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
2
3
4
5
6
7
8
9
Git 用 <<<<<<<,=======,>>>>>>> 标记出不同分支的内容,我们修改如下后保存:
Creating a new branch is quick and simple.
再提交:
git add readme.txt
# nothing
git commit -m "conflict fixed"
[master cf810e4] conflict fixed
2
3
4
用带参数的 git log 也可以看到分支的合并情况:
git log --graph --pretty=oneline --abbrev-commit
* cf810e4 (HEAD -> master) conflict fixed
|\
| * 14096d0 (feature1) AND simple
* | 5dc6824 & simple
|/
* b17d20e branch test
* d46f35e (origin/master) remove test.txt
* b84166e add test.txt
* 519219b git tracks changes
* e43a48b understand how stage works
* 1094adb append GPL
* e475afc add distributed
* eaadf4e wrote a readme file
2
3
4
5
6
7
8
9
10
11
12
13
14
最后,删除 feature1 分支:
git branch -d feature1
Deleted branch feature1 (was 14096d0).
2
# 冲突小结
- 当 Git 无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把 Git 合并失败的文件手动编辑为我们希望的内容,再提交。
- 用 git log --graph 命令可以看到分支合并图。