git rebase git merge 代码merge整理

git rebase 与 git merge

假设功能1对应的commitID为A,此功能已经开发完成并测试OK。

现在又有新功能开发,新建一个分支bra1,在bra1上开发新功能,其中新功能2的commit ID为B,新功能3的commitID为C。

在新功能3还未完全开发完成时,临时有一个优先级更高的新功能4需要追加,依赖新功能2但是不依赖新功能3,为了不影响新功能3的开发,决定在新功能2即commitID为B的记录上新建另外一个新的分支bra2,作为新功能4的开发分支。

创建方法为:

# 将HEAD指向commit ID B
$ git checkout B

# 新建一个分支bra2,并切换到分支bra2
$ git checkout -b bra2

在已经新建分支bra2,对新功能4开发,并提交,提交的commit ID为D,此时,工程的分支状态为:

master : __A
bra1   :    \__B__C
bra2   :        \__D

master 分支的提交记录为:A
bra1   分支的提交记录为:A-->B-->C
bra2   分支的提交记录为:A-->B-->D

如果新功能2,3,4均开发完毕,需要将bra1与bra2的代码合并到一个分支,则需要引出下面的git rebase 和 git merge了。

1. 直接使用git merge

在bra1分支,合并bra2分支的内容,可直接进行merge:

# 在分支bra1上,执行merge命令
$ git merge bra2

由于bra1与分支bra2虽然有共同的提交记录A和B,但是在新建分支bra2后,bra1仍然后新的提交记录C,因此直接merge会出现一个提示Merge branch 'bra2' into bra1,可修改其内容。确认后,执行merge操作,并生成一个commitID E,其commit log为Merge branch 'bra2' into bra1或自行修改的内容。此时各个分支状态为:

master : __A
bra1   :    \__B__C   __E
                \  \ /
bra2   :         \__D

master 分支的提交记录为:A
bra1   分支的提交记录为:A-->B-->C-->D-->E
bra2   分支的提交记录为:A-->B-->D

此时,已经将分支bra2和分支bra1合并到分支bra1,并新增一个提交记录E。
git log的graph如下:

*   E
|\  
| |
| |
| * D
| |
* | C
|/
|
*   B
|
|
*   A

2. 使用git rebase

在bra1分支,合并bra2分支的内容,可以使用rebase,将bra1的基准commitID进行变更,使其指向bra2分支的最新commitID:

# 在分支bra1上,执行rebase命令
$ git rebase bra2

对bra1进行变基,指向分支bra2的commitID,变基后的分支状态为:

master : __A
bra2   :    \__B__D
bra1   :           \__C

master 分支的提交记录为:A
bra1   分支的提交记录为:A-->B-->D-->C
bra2   分支的提交记录为:A-->B-->D

git log graph如下:

*   C
|
|
*   D
|
|
*   B
|
|
*   A

3. 小节

  1. 提交记录

    • merge: 如果新在bra1分支上新建分支bra2,并且新建分支后,bra1与bra2分支上均有提交,则在bra1上merge bra2时,会产生一个commitID;如果新建分支后,只在bra2上提交,并未在bra1上提交,则在bra1上merge bra2时,不会产生commit ID。
    • rebase: 不会产生新的commit ID。
  2. log graph,参考1 2 小节中的log graph

    • merge: merge命令不会保留merge的分支的commit,提交记录比较繁琐,不直观。
    • rebase: 保留merge的commitID,提交记录比较整洁
  3. 处理冲突方式

    • merge:(一股脑)使用merge命令合并分支,解决完冲突,执行git add .和git commit -m'fix conflict'。这个时候会产生一个commit。
    • rebase:(交互式)使用rebase命令合并分支,解决完冲突,执行git add .和git rebase --continue,不会产生额外的commit。这样的好处是,‘干净’,分支上不会有无意义的解决分支的commit;坏处,如果合并的分支中存在多个commit,需要重复处理多次冲突。

猜你喜欢

转载自www.cnblogs.com/guo-yw/p/13161305.html