关于Git我们上面讲了好几个章节,Git基本操作:增删改查,还有版本回退。
这一节我们学习Git最强大的功能-分支。
什么是分支
分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,能在同一个数据库里可以同时进行多个修改。当然分叉的分支也可以合并。
其实几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。在很多版本控制系统中,比如SVN,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间。
Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。和许多其他版本控制系统不同,Git 鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。理解分支的概念并熟练运用后,你才会意识到为什么 Git 是一个如此强大而独特的工具,并从此真正改变你的开发方式。
正常情况,在版本库进行最初的init后, Git都会创建一个名为master的分支。因此之后的提交,在创建和切换分支之前都会添加到master分支里。
分支创建
您可以通过branch命令来创建分支。
$ git branch <branchname>
具体创建如下:
codemaxi@codemaxi-PC:~/git_test$ git branch
* master
codemaxi@codemaxi-PC:~/git_test$ git branch develop
codemaxi@codemaxi-PC:~/git_test$ git branch
develop
* master
直接输入git branch
不指定参数直接执行branch命令的话,可以显示分支列表。 前面有*
的就是现在的分支。运行git branch 命令,仅仅是建立了一个新的分支,而不会自动切换到这个分支中去。
分支切换
若要切换分支,使用checkout命令操作。进行checkout时,git会从工作树还原向目标分支提交的修改内容。checkout之后的提交记录将被追加到目标分支。
git checkout branchName
该命令会将当前工作分支切换到branchName。另外,可以通过下面的命令在新分支创建的同时切换分支:
git checkout -b newBranch
该命令相当于下面这两条命令的执行结果:
git branch newBranch
git checkout newBranch
测试如下:
codemaxi@codemaxi-PC:~/git_test$ git branch
develop
* master
codemaxi@codemaxi-PC:~/git_test$ git checkout develop
M test.txt
切换到分支 'develop'
codemaxi@codemaxi-PC:~/git_test$ git branch
* develop
master
codemaxi@codemaxi-PC:~/git_test$ git checkout -b develop_v2
M test.txt
切换到一个新分支 'develop_v2'
codemaxi@codemaxi-PC:~/git_test$ git branch
develop
* develop_v2
master
codemaxi@codemaxi-PC:~/git_test$
分支合并
一般情况,在新分支 newBranch开发的功能已完成并已提交后;接下来走测试流程需要将代码合并会主干master分支。执行merge命令以合并分支。
// 切换到develop分支
git checkout master
// 合并newBranch代码
git merge newBranch
测试如下:
codemaxi@codemaxi-PC:~/git_test$ echo "develop v2" >> developv2.txt
codemaxi@codemaxi-PC:~/git_test$ ls
developv2.txt test2.txt test.txt
codemaxi@codemaxi-PC:~/git_test$ git add -A
codemaxi@codemaxi-PC:~/git_test$ git commit -m "commit develop v2"
[develop_v2 458c20f] commit develop v2
2 files changed, 2 insertions(+)
create mode 100644 developv2.txt
codemaxi@codemaxi-PC:~/git_test$ git checkout master
切换到分支 'master'
codemaxi@codemaxi-PC:~/git_test$ git branch
develop
develop_v2
* master
codemaxi@codemaxi-PC:~/git_test$ git merge develop_v2
更新 a8d38c4..458c20f
Fast-forward
developv2.txt | 1 +
test.txt | 1 +
2 files changed, 2 insertions(+)
create mode 100644 developv2.txt
codemaxi@codemaxi-PC:~/git_test$ ls
developv2.txt test2.txt test.txt
上面主要操作是将指定分支的修改导入到HEAD指定的分支。先切换master分支,然后把develop_v2分支导入到master分支。合并成功后master分支指向的提交移动到和develop_v2同样的位置。这个是fast-forward(快进)合并。
我们用git log看看master分支有没有我们再develop_v2分子上提交的内容
codemaxi@codemaxi-PC:~/git_test$ git log --stat
commit 458c20f47618ecc37f8dc6656647a9b465f1dc00 (HEAD -> master, develop_v2)
Author: codemaxi <374867193@qq.com>
Date: Fri May 28 06:44:04 2021 +0800
commit develop v2
developv2.txt | 1 +
test.txt | 1 +
2 files changed, 2 insertions(+)
很明显看到 developv2.txt 文件也已经合并到master分支上了。
合并冲突
大多数情况下合并分支总是没那么顺利的,因为可能会存在某些文件合并时冲突。举个例子,A同学再分支develop上修改了1.txt文件,B同学在aster分支上也同样修改了1.txt文件,这时如果想合并develop分支到master上,基本上会出现合并冲突。
测试如下:
codemaxi@codemaxi-PC:~/git_test$ git status
位于分支 master
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: developv2.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
codemaxi@codemaxi-PC:~/git_test$ svn diff developv2.txt
Command 'svn' not found, but can be installed with:
sudo apt install subversion
codemaxi@codemaxi-PC:~/git_test$ git diff developv2.txt
diff --git a/developv2.txt b/developv2.txt
index 213d25a..ac9ec10 100644
--- a/developv2.txt
+++ b/developv2.txt
@@ -1 +1 @@
-develop v2
+develop testtestetsteste(master) v2
codemaxi@codemaxi-PC:~/git_test$ git add developv2.txt
codemaxi@codemaxi-PC:~/git_test$ git commit -m "master commit"
[master 9cabe03] master commit
1 file changed, 1 insertion(+), 1 deletion(-)
codemaxi@codemaxi-PC:~/git_test$ git checkout develop
develop develop_v2
codemaxi@codemaxi-PC:~/git_test$ git checkout develop_v2
切换到分支 'develop_v2'
codemaxi@codemaxi-PC:~/git_test$ ls
developv2.txt test2.txt test.txt
codemaxi@codemaxi-PC:~/git_test$
codemaxi@codemaxi-PC:~/git_test$
codemaxi@codemaxi-PC:~/git_test$ git diff develop
develop develop_v2
codemaxi@codemaxi-PC:~/git_test$ git status
位于分支 develop_v2
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: developv2.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
codemaxi@codemaxi-PC:~/git_test$ git diff developv2.txt
diff --git a/developv2.txt b/developv2.txt
index 213d25a..6bcd858 100644
--- a/developv2.txt
+++ b/developv2.txt
@@ -1 +1 @@
-develop v2
+develop mermemrememre(develop_v2) v2
codemaxi@codemaxi-PC:~/git_test$ git add developv2.txt
codemaxi@codemaxi-PC:~/git_test$ git commit -m "developv2 commit"
[develop_v2 2fc888c] developv2 commit
1 file changed, 1 insertion(+), 1 deletion(-)
codemaxi@codemaxi-PC:~/git_test$ git checkout master
切换到分支 'master'
codemaxi@codemaxi-PC:~/git_test$ git merge
merge mergetool
codemaxi@codemaxi-PC:~/git_test$ git merge
develop develop_v2 HEAD master ORIG_HEAD v1.0
codemaxi@codemaxi-PC:~/git_test$ git merge develop
develop develop_v2
codemaxi@codemaxi-PC:~/git_test$ git merge develop_v2
自动合并 developv2.txt
冲突(内容):合并冲突于 developv2.txt
自动合并失败,修正冲突然后提交修正的结果。
codemaxi@codemaxi-PC:~/git_test$
上面的操作是分别切换到master和develop_v2分支,然后都对 developv2.txt的同一个地方进行了修改,最后回到master分支进行merge,从输出也却是看到合并冲突了,这时候通过git status可以看到“双方修改”这个状态:
codemaxi@codemaxi-PC:~/git_test$ git status
位于分支 master
您有尚未合并的路径。
(解决冲突并运行 "git commit")
(使用 "git merge --abort" 终止合并)
未合并的路径:
(使用 "git add <文件>..." 标记解决方案)
双方修改: developv2.txt
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
codemaxi@codemaxi-PC:~/git_test$
我们再用git diff developv2.txt看下合并冲突时文件内容如何保存:
codemaxi@codemaxi-PC:~/git_test$ git diff developv2.txt
diff --cc developv2.txt
index ac9ec10,6bcd858..0000000
--- a/developv2.txt
+++ b/developv2.txt
@@@ -1,1 -1,1 +1,5 @@@
++<<<<<<< HEAD
+develop testtestetsteste(master) v2
++=======
+ develop mermemrememre(develop_v2) v2
++>>>>>>> develop_v2
codemaxi@codemaxi-PC:~/git_test$
“HEAD"到”="之间为当前分支改动, "=“到”>>>>>>> develop_v2"为待合并分支的改动;
这种情况下就需要我们手动修改该文较,到底需要保留谁的修改,确认修改后,使用如下命令即可完成合并
git add developv2.txt
git commit -m "fix merge" developv2.txt
分支删除
既然 develop_v2分支的内容已经顺利地合并到master分支了,现在可以将其删除了。
在branch命令指定-d选项执行,以删除分支。
$ git branch -d <branchname>
执行以下的命令以删除 develop_v2分支。
codemaxi@codemaxi-PC:~/git_test$ git branch -d develop_v2
已删除分支 develop_v2(曾为 2fc888c)。
codemaxi@codemaxi-PC:~/git_test$ git branch
develop
* master
codemaxi@codemaxi-PC:~/git_test$
好了,今天的内容就到这里了。