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

参考

posted @ 2024-02-20 10:46  董少奇  阅读(26)  评论(0)    收藏  举报