分支管理
1 创建与合并分支(这里以 master
为例)
最开始 master
分支只是一条线,Git用 master
指向最新的提交,再用 HEAD
指向 master
。就能确定当前分支以及当前分支的提交点了。
每次提交 master
都会向前走一步, master
这个分支的线也会越来越长。
当我们创建新的分支的时候,例如 dev
时,Git创建一个新的指针叫 dev
,指向 master
相同的提交, 再把 HEAD
指向 dev
,这就表示当前分支在 dev
上。
接下来,对工作区的修改和提交就是针对 dev
分支了,比如新提交一次后, dev
指针向前走一步,但是 master
指针不变:
当我们在 dev
上完成工作后,通过直接吧 master
指针指向 dev
的当前提交就可以完成 dev
到 master
分支的合并了。
接下来进行实战:
-
创建
dev
分支,并切换到该分支。$ git checkout -b dev Switched to a new branch 'dev'
git checkout
命令加上-b
参数表示创建并切换,相当于以下两条命令:$ git branch dev $ git checkout dev Switched to branch 'dev'
-
查看当前分支
$ git branch * dev main
-
修改文件,然后提交
$ git add readme.txt $ git commit -m "branch test"
-
然后切换回
main
分支,发现刚刚的修改不见了。
-
进行分支合并
$ git merge dev Updating a3158c5..b6ea9c3 Fast-forward readme.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
git merge
命令用于合并指定的分支到当前分支。合并后,文件就会相同了。注意到上面的
Fast-forward
信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master
指向dev
的当前提交,所以合并速度非常快。当然不是每次合并都能Fast-forward
。 -
合并完成后,就可以删除分支啦
$ git branch -d dev Deleted branch dev (was b6ea9c3).
-
switch
我们这里使用了
git checkout <branch>
来切换分支,前面讲过的撤销修改则是git checkout -- <file>
,相同的命令不同的用法有些模糊。最新版本的Git提供了git switch
命令用来切换分支。创建并切换到新的
dev
分支,可以使用:$ git switch -c dev
直接切换到已有的
master
分支,可以使用:$ git switch main
2 解决冲突
当我们在不同分支对同一个文件进行修改而进行合并的时候,这种情况下,Git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。
准备新的分支,然后修改 readme.txt, 然后提交。
$ git switch -c feature1
切换回 main
分支,然后再修改 readme.txt 的同一行,然后提交。
我们尝试合并:
$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.
这是 git status
也会显示冲突。我们这时候查看 readme.txt 文件。
Git用<<<<<<<
,=======
,>>>>>>>
标记出不同分支的内容,我们将冲突内存删除,保存,然后进行提交。
$ git add readme.txt
$ git commit -m "conflict fixed"
[main a70aa75] conflict fixed
用带参数的git log
也可以看到分支的合并情况:
$ git log --graph --pretty=oneline --abbrev-commit
* a70aa75 (HEAD -> main) conflict fixed
|\
| * c28d724 (feature1) feature
* | b33a7d9 main
* | f2edd24 & simple
|/
* 68e9b13 AND simple
* b6ea9c3 branch test
* a3158c5 (origin/main) remove test.txt
* f57c096 add test.txt
* dfed0cf git tracks changes
* 65b2fa1 append GPL
* 6cd35de 修改readme
* b2fe4ff wrote a readme file
git log --graph
可以查看分支合并图。
引用
廖雪峰的官方网站