乐趣区

关于git:git分支管理的策略和冲突问题

备注:

本文参考于廖雪峰老师的博客 Git 教程。按照其博客进行学习和记录,感激其自私分享,也欢送各位查看原文。

知识点

  • git log --graph --pretty=oneline --abbrev-commit查看分支合并状况
  • git log --graph查看分支合并图
  • 当两个分支批改同一个文件时,可能产生两个分支不能主动合并的问题,须要手动解决抵触(合并时,Git 将抵触标识了进去),而后再次提交,即可实现合并。
  • 应用参数 --no-ff 禁用快合并模式,git merge --no-ff -m"merge with no-ff" dev,合并

对于分支中的抵触

如下,新建一个分支 dev2,并且在新分支上开发:

$ git checkout -b dev2
切换到一个新分支 'dev2'

批改 readme.txt,增加一行。

Creating a new branch is quick AND simple.
  • 在 dev2 分支进行提交,
$ git add readme.txt
$ git commit -m"add new line at readme on dev2"
[dev2 4a097db] add new line at readme on dev2
 1 file changed, 1 insertion(+)
  • 切换到 master 分支,同时在 master 上批改 readme 文件(增加域 dev2 分支上文件不同的内容,Creating a new branch is quick & simple.),并且提交
git checkout master
切换到分支 'master'
您的分支当先 'origin/master' 共 1 个提交。(应用 "git push" 来公布您的本地提交)
$ git add readme.txt
$ git commit -m"add new line at readme on master"
[master d562bf7] add new line at readme on master
 1 file changed, 1 insertion(+)

如上,Git 会主动提醒以后 master 分支比近程 origin/master 分支当先一个提交

当初 master 分支和 dev2 分支都有了各自新的提交,在这种状况下,Git 无奈执行“疾速合并”,只能试图把各自的批改合并起来,因为同时都批改了同一行内容,此时会有抵触。

$ git merge dev2
主动合并 readme.txt
抵触(内容):合并抵触于 readme.txt
主动合并失败,修改抵触而后提交修改的后果。

Git 提醒主动合并存在抵触,抵触文件是 readme,须要修改抵触而后提交修改后的后果

如果用 git status 查看看以后状态

$ git status
位于分支 master
您的分支当先 'origin/master' 共 2 个提交。(应用 "git push" 来公布您的本地提交)您有尚未合并的门路。(解决抵触并运行 "git commit")未合并的门路:(应用 "git add < 文件 >..." 标记解决方案)单方批改:readme.txt

批改尚未退出提交(应用 "git add" 和 / 或 "git commit -a")

如上,提醒单方批改

  • 查看 readme.txt 的内容
$ cat readme.txt

`this is a test that I learn and use git version control system
this is a beginning
wofaidognyixie dognxi
create two new branch
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> dev2
  • Git 用 <<<<<<<=======>>>>>>> 标记出不同分支的内容,咱们批改如下后保留
Creating a new branch is quick and simple.
  • 批改抵触后提交
$ git add readme.txt
$ git commit -m"conflict fixed"
[master 8f69de8] conflict fixed

Git 提醒抵触曾经修复,当初 masterdev2分支均指向了当初工作区的状态。

  • 应用 git log --graph --pretty=oneline --abbrev-commit 能够查看分支的合并状况
$ git log --graph --pretty=oneline --abbrev-commit
*   8f69de8 conflict fixed
|\
| * 4a097db add new line at readme on dev2
* | d562bf7 add new line at readme on master
|/
* 03d07d2 modify readme.txt at branch
* 036ced2 a push test
* 6a0f133 remove test.txt
* b5c87d4 add a test file
* d5b84bf modifya readme file
* 3033dda add a readme file

如上,分支合并和抵触记录

  • 此时能够删除 dev2 分支
$ git branch -d dev2
已删除分支 dev2(曾为 4a097db)。

抵触解决实现

分支治理的策略

通常,合并分支时 Git 应用 Fast forward 模式疾速合并。然而疾速模式删除分支,会失落分支信息。

强制禁用 Fast forward 模式,Git 会将 merge 记录为一个新的提交,同时分支历史会记录分支信息。

  • 切换到 dev 分支,并批改 readme 文件,同时提交commit
$ git checkout -b dev
切换到一个新分支 'dev'
$ git add readme.txt
$ git commit -m"a new branch"
[dev 44dffc0] a new branch
 1 file changed, 1 insertion(+)
  • 切换到 master 分支
$ git checkout master
切换到分支 'master'
您的分支当先 'origin/master' 共 4 个提交。(应用 "git push" 来公布您的本地提交)
  • 应用 --no-ff 参数合并分支 dev 到以后 master, 本次合并要创立一个新的commit,所以加上-m 参数形容
$ git merge --no-ff -m"merge with no-ff" dev
Merge made by the 'recursive' strategy.
 readme.txt | 1 +
 1 file changed, 1 insertion(+)
  • 应用 git log 查看分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
*   7c4d427 merge with no-ff
|\
| * 44dffc0 a new branch
|/
*   8f69de8 conflict fixed
|\
| * 4a097db add new line at readme on dev2
* | d562bf7 add new line at readme on master
|/
* 03d07d2 modify readme.txt at branch
* 036ced2 a push test
* 6a0f133 remove test.txt
* b5c87d4 add a test file
* d5b84bf modifya readme file
* 3033dda add a readme file

分支策略

理论开发中,分支治理应依照以下几点:

  1. master分支是稳固分支,用来公布最新稳固版本,开发中不须要批改它
  2. 开发中尽量在 dev 中开发,扩大新性能、修复 bug 等,等到正式版公布时,在将 dev 分支合并到 master 上。
  3. 开发人员在 dev 分支上开发,每个人都有本人的分支,并且往 dev 分支上合并。

退出移动版