git分支新建与合并
简介
这里介绍git的分支管理。
演示
建立演示的git仓库
mkdir tmp
cd tmp
git init
touch test1
touch test2
git add -A
git commit -m 'first time'
建立分支
不同的分支用于开发不同的功能模块
#新建分支br1和br2
git branch br1
git branch br2
#查看分支,带*的表示当前所在分支
git branch -v
合并分支
#切换到br1(将br1指向的快照节点的文件提取到工作区)更新test1,并提交
git checkout br1
echo "test1" > test1
git add -A
#commit会导致生成新的快照节点,且br1指向新的快照节点
git commit -m 'on br1, update test1'
#切换到br2更新test2,并提交
git checkout br2
echo "test2" > test2
git add -A
git commit -m 'on br2, update test2'
#这时候可以使用git checkout br1(或br2)切换到不同的分支查看文件内容。
#查看分支状态
[root@testdsq tmp]# git log --oneline --decorate --graph --all
* e4bf205 (br2) on br2, update test2
| * c45f33d (HEAD -> br1) on br1, update test1
|/
* a73ba54 (master) first time
#合并br1到master
git checkout master
git merge br1
#查看分支状态
[root@testdsq tmp]# git log --oneline --decorate --graph --all
* e4bf205 (br2) on br2, update test2
| * c45f33d (HEAD -> master, br1) on br1, update test1
|/
* a73ba54 first time
#删除被合并的br1(br1和master合并后,br1和master指向同一个节点)
git branch -d br1
git branch -v
#合并分支br2并删除br2
git checkout master
git merge br2
git branch -d br2
#查看分支记录
[root@testdsq tmp]# git log --oneline --decorate --graph --all
* 8934984 (HEAD -> master) t branch -d br2Merge branch 'br2'
|\
| * 0c90bbd on br2, update test2
* | e78bf8f on br1, update test1
|/
* 7ee8f02 first time
合并冲突处理
如果br1和br2都是修改test1,合并的时候就会告警。
git是通过检查文件内容生成的hash来判断文件是否修改的,git认为只有更新文件内容才会导致需要提交。
#br1
echo 'br1' > test1
#br2
echo 'br2' > test1
git checkout master
git merge br1
[root@testdsq tmp]# git merge br2
Auto-merging test1
CONFLICT (content): Merge conflict in test1
Automatic merge failed; fix conflicts and then commit the result.
#test1中记录了master和br2存在冲突的地方
[root@testdsq tmp]# cat test1
<<<<<<< HEAD
br1
=======
br2
>>>>>>> br2
#编辑test1,消除冲突
[root@testdsq tmp]# cat test1
br1
br2
#重新提交
git add -A
git commit -m 'merge br1 and br2 update'
git branch -d br2
#查看分支历史记录
[root@testdsq tmp]# git log --oneline --decorate --graph --all
* 3fe8913 (HEAD -> master) merge br1 and br2 update
|\
| * b1d04cc update on br2
* | 348540d update on br1
|/
* c21ebe9 first time
rebase变基
rebase和merge操作的最终快照结果都是一样的,只不过历史记录更加清晰,历史变成了串行操作,没有了分支。
变基准则:如果提交存在与你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基。
#合并br2的时候使用rebase操作rebase的实际原理就是将br2的记录的文件变更在master上再次应用
git rebase master br2
[root@testdsq tmp]# git log --oneline --decorate --graph --all
* b059589 (HEAD -> br2) on br2, update test2
* 2951280 (master) on br1, update test1
* 056ec86 first time
git checkout master
git merge br2
git branch -d br2
#没有了分支
[root@testdsq tmp]# git log --oneline --decorate --graph --all
* b059589 (HEAD -> master) on br2, update test2
* 2951280 on br1, update test1
* 056ec86 first time
总结
git branch brname
git checkout brname
git branch -v
git branch -d brname
git merge brname
git rebase master branchname

浙公网安备 33010602011771号