二、分支管理

1.创建与合并分支

  • git把我们之前每次提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前只有一条时间线,在git里,这个分支叫主分支,即master分支。
  • HEAD严格来说不是指向提交,而是指向master,master才是指向提交的,所以,HEAD指向的就是当前分支。
  • (1)一开始的时候,master分支是一条线,git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。
  • (2)当我们创建新的分支,例如dev时,git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上。
    • git创建一个分支很快,因为除了增加一个dev指针,改变HEAD的指向,工作区的文件都没有任何变化。
  • (3)不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变。
  • (4)假如我们在dev上的工作完成了,就可以把dev合并到master上。git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并。
    • git合并分支也很快,就改改指针,工作区内容也不变。
  • (5)合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支。
1.1案例
  • (1)执行如下命令可以查看当前有几个分支并且看到在哪个分支下工作。
[root@db_server ~]# cd /data1/git/
[root@db_server git]# git branch
* master
  • (2)下面创建一个分支dev并切换到其上进行工作。
[root@db_server git]# git branch dev
[root@db_server git]# git branch
  dev
* master
[root@db_server git]# git checkout dev
切换到分支 'dev'
[root@db_server git]# git branch
* dev
  master
  • (3)下面我们修改test.go内容,在里面添加一行,并进行提交。
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
aaaaaaaaaaaaaaaaaaaaa
add line dev branch !  #新添加的一行内容
[root@db_server git]# git add test.go 
[root@db_server git]# git commit -m 'r9:dev branch'
[dev 9584263] r9:dev branch
 1 file changed, 1 insertion(+)
  • (4)dev分支的工作完成,我们就可以切换回master分支:
  • 查看test.go,发现添加的内容没有了。因为那个提交是在dev分支上,而master分支此刻的提交点并没有变:
[root@db_server git]# git checkout master
切换到分支 'master'
[root@db_server git]# git branch
  dev
* master
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
aaaaaaaaaaaaaaaaaaaaa
  • (5)现在,我们把dev分支的工作成果合并到master分支上:
  • git merge命令用于合并指定分支到当前分支。合并后,再查看test.go的内容,就可以看到,和dev分支的最新提交是完全一样的。
  • 注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。
[root@db_server git]# git merge dev
Updating 78db8ea..9584263
Fast-forward
 test.go | 1 +
 1 file changed, 1 insertion(+)
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
aaaaaaaaaaaaaaaaaaaaa
add line dev branch !
  • (6)合并完成后,就可以放心地删除dev分支了,删除后,查看branch,就只剩下master分支了。
[root@db_server git]# git branch -d dev
Deleted branch dev (was 9584263).
[root@db_server git]# git branch
* master
  • 查看分支:git branch
  • 创建分支:git branch
  • 切换分支:git checkout
  • 创建+切换分支:git checkout -b
  • 合并某分支到当前分支:git merge
  • 删除分支:git branch -d

2.解决冲突

  • (1)修改test.go内容,再创建一个新分支dev并进行提交。
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
在dev branch add line   ##新增的一行
[root@db_server git]# git checkout -b dev
M	test.go
切换到一个新分支 'dev'
[root@db_server git]# git branch
* dev
  master
[root@db_server git]# git add test.go 
[root@db_server git]# git commit -m 'dev branch commit'
[dev e206de7] dev branch commit
 1 file changed, 1 insertion(+)
  • (2)切换回master分支。在master的test.go添加一行内容并进行提交。
[root@db_server git]# git checkout master
切换到分支 'master'
[root@db_server git]# git branch
  dev
* master
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
[root@db_server git]# vi test.go 
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
在master branch add line
[root@db_server git]# git add test.go 
[root@db_server git]# git commit -m 'master branch commit'
[master b3502e6] master branch commit
 1 file changed, 1 insertion(+)
  • (3)现在,master分支dev分支各自都分别有新的提交,git无法执行“快速合并”,只能试图把各自的修改合并起来,但这种合并就可能会有冲突。
  • 执行如下命令尝试将dev分支合并到master分支上来。
[root@db_server git]# git branch
  dev
* master
[root@db_server git]# git merge dev
自动合并 test.go
冲突(内容):合并冲突于 test.go
自动合并失败,修正冲突然后提交修正的结果。
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
<<<<<<< HEAD
在master branch add line
=======
在dev branch add line
>>>>>>> dev
[root@db_server git]# git status
位于分支 master
您有尚未合并的路径。
  (解决冲突并运行 "git commit")
  (使用 "git merge --abort" 终止合并)

未合并的路径:
  (使用 "git add <文件>..." 标记解决方案)

	双方修改:   test.go

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

	.code.go.swp

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
  • (4)git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容,我们删除,再提交。
[root@db_server git]# vi test.go 
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
在master branch add line
在dev branch add line
[root@db_server git]# git add test.go 
[root@db_server git]# git commit -m '解决冲突'
[master eb0a5a7] 解决冲突
[root@db_server git]# git status
位于分支 master
未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

	.code.go.swp

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@db_server git]# git log --graph --pretty=oneline
*   eb0a5a74deecf199bd74d8339669510e38e26b5b (HEAD -> master) 解决冲突
|\  
| * e206de7032addf1556b295eecd52e98427d7084b (dev) dev branch commit
* | b3502e6e12dc7ae5a11a210afae9e815320f2b9c master branch commit
|/  
* 6624d97c1ae1870cddc473080e40d5ee84664059 r13
...
* a57f919f12ec7097fce16ad67fa14fc075c94e2b 版本1
[root@db_server git]# git branch -d dev
已删除分支 dev(曾为 e206de7)。
[root@db_server git]# git branch
* master

3.分支管理策略

  • 通常,合并分支时,如果可能,git会用fast forward模式,但是有些快速合并不能成功而且合并时没有冲突,这个时候会合并之后并做一次新的提交。
  • (1)创建切换到dev分支下。新建一个文件test3.go编辑内容如下,并提交一个commit。
[root@db_server git]# git checkout -b dev
切换到一个新分支 'dev'
[root@db_server git]# touch test3.go 
[root@db_server git]# vi test3.go 
[root@db_server git]# cat test3.go 
33333333333333333333333333
[root@db_server git]# git add test3.go 
[root@db_server git]# git commit -m 'add test3.go'
[dev 53329c0] add test3.go
 1 file changed, 1 insertion(+)
 create mode 100644 test3.go
  • (2)切换回master分支,编辑test.go并进行一个提交。
[root@db_server git]# git checkout master
切换到分支 'master'
[root@db_server git]# vi test.go 
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
333333333333333333333   ##新添加一行
[root@db_server git]# git add test.go 
[root@db_server git]# git commit -m 'test.go add line'
[master 1d9951a] test.go add line
 1 file changed, 1 insertion(+)
  • (3)合并dev分支的内容到master分支。出现如下提时
  • 因为这次不能进行快速合并,所以git提示输入合并说明信息,输入之后合并内容之后git会自动创建一次新的提交。
  • 请注意–no-ff参数,表示强制禁用fast forward模式:git merge --no-ff -m ‘禁用fast-forward’ dev
  • 因为合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
[root@db_server git]# git merge dev

Merge branch 'dev'

# 请输入一个提交信息以解释此合并的必要性,尤其是将一个更新后的上游分支
# 合并到主题分支。
#
# 以 '#' 开头的行将被忽略,而且空提交说明将会终止提交。
[root@db_server git]# git branch -d dev
已删除分支 dev(曾为 53329c0)。

4.Bug分支

  • 软件开发中,bug就像家常便饭一样。每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
  • (1)当你接到一个修复一个代号001的bug的任务时,你想创建一个分支bug-001来修复它,但是,等等,当前正在dev上进行的工作还没有提交:
  • 并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?
  • git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:
[root@db_server git]# git checkout -b dev
切换到一个新分支 'dev'
[root@db_server git]# vi test.go 
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
333333333333333333333
444444444444444444444
555555555555555555555
aaaaaaaaaaaaaaaaaaaaa  ##新添加行
bbbbbbbbbbbbbbbbbbbbb  ##新添加行
[root@db_server git]# git status
位于分支 dev
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     test.go

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

	.code.go.swp

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
[root@db_server git]# git stash
保存工作目录和索引状态 WIP on dev: e453496 dev添加新行
  • (2)首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:
  • 现在修复bug,把test.go最后3行删掉,然后提交。
[root@db_server git]# git checkout master 
切换到分支 'master'
[root@db_server git]# git checkout -b bug-001
切换到一个新分支 'bug-001'
[root@db_server git]# git branch
* bug-001
  dev
  master
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
333333333333333333333
444444444444444444444
555555555555555555555
[root@db_server git]# vi test.go 
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
[root@db_server git]# git add test.go
[root@db_server git]# git commit -m 'bug-001修复'
[bug-001 70d1a9a] bug-001修复
 1 file changed, 3 deletions(-)
  • (3)修复完成后,切换到master分支,并完成合并,最后删除bug-001分支。
[root@db_server git]# git checkout master
切换到分支 'master'
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
333333333333333333333
444444444444444444444
555555555555555555555
[root@db_server git]# git merge --no-ff -m "bug-001解决" bug-001
Merge made by the 'recursive' strategy.
 test.go | 3 ---
 1 file changed, 3 deletions(-)
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
[root@db_server git]# git branch -d bug-001
已删除分支 bug-001(曾为 70d1a9a)。
  • (4)现在bug-001修复完成,是时候回到dev分支接着干活了!
  • 当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,恢复工作现场。
[root@db_server git]# git checkout dev
切换到分支 'dev'
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
333333333333333333333
444444444444444444444
555555555555555555555
[root@db_server git]# git status
位于分支 dev
未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

	.code.go.swp

提交为空,但是存在尚未跟踪的文件(使用 "git add" 建立跟踪)
[root@db_server git]# git stash list
stash@{0}: WIP on dev: e453496 dev添加新行
[root@db_server git]# git stash pop
位于分支 dev
尚未暂存以备提交的变更:
  (使用 "git add <文件>..." 更新要提交的内容)
  (使用 "git checkout -- <文件>..." 丢弃工作区的改动)

	修改:     test.go

未跟踪的文件:
  (使用 "git add <文件>..." 以包含要提交的内容)

	.code.go.swp

修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (57bd52d14703d77732a39d5ccba93d135cf6d3a1)
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
333333333333333333333
444444444444444444444
555555555555555555555
aaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbb
  • (5)现在dev分支的活也干完了,提交、合并到master分支上
[root@db_server git]# git add test.go 
[root@db_server git]# git commit -m 'dev branch'
[dev 34ef37d] dev branch
 1 file changed, 2 insertions(+)
[root@db_server git]# git checkout master
切换到分支 'master'
[root@db_server git]# git merge dev
自动合并 test.go
冲突(内容):合并冲突于 test.go
自动合并失败,修正冲突然后提交修正的结果。
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
<<<<<<< HEAD
=======
333333333333333333333
444444444444444444444
555555555555555555555
aaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbb
>>>>>>> dev
[root@db_server git]# vi test.go 
[root@db_server git]# cat test.go 
111111111111111111111
222222222222222222222
aaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbb
[root@db_server git]# git add test.go 
[root@db_server git]# git commit -m 'ok'
[master f34c6ae] ok
[root@db_server git]# git branch -d dev
已删除分支 dev(曾为 34ef37d)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值