Git学习笔记:分支管理

关于Git我们上面讲了好几个章节,Git基本操作:增删改查,还有版本回退。
这一节我们学习Git最强大的功能-分支。

什么是分支

分支是为了将修改记录的整体流程分叉保存。分叉后的分支不受其他分支的影响,能在同一个数据库里可以同时进行多个修改。当然分叉的分支也可以合并。
其实几乎每一种版本控制系统都以某种形式支持分支。使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作。在很多版本控制系统中,比如SVN,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间。
Git 的分支可谓是难以置信的轻量级,它的新建操作几乎可以在瞬间完成,并且在不同分支间切换起来也差不多一样快。和许多其他版本控制系统不同,Git 鼓励在工作流程中频繁使用分支与合并,哪怕一天之内进行许多次都没有关系。理解分支的概念并熟练运用后,你才会意识到为什么 Git 是一个如此强大而独特的工具,并从此真正改变你的开发方式。

正常情况,在版本库进行最初的init后, Git都会创建一个名为master的分支。因此之后的提交,在创建和切换分支之前都会添加到master分支里。
image-20210527215551514

分支创建

您可以通过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$ 

好了,今天的内容就到这里了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值