Life, half is memory, half is to continue.
Git合并策略
By Vincent. @2024.5.29
Git合并策略

合并

合并(Merge)是将一个分支的更改合并到另一个分支的操作。在Git中,有几种合并策略可以使用,具体取决于你想要实现的合并结果。

快进合并

快进合并(Fast-forward merge)当一个分支的提交历史可以直接应用到另一个分支时,Git会执行快进合并。这种合并不会创建新的合并提交,而是简单地将目标分支指向源分支的最新提交。这种合并只适用于目标分支没有自己的新提交的情况。

# 切换到目标分支
git checkout main
​
# 执行快进合并
git merge Feature

普通合并

普通合并(Regular merge)当两个分支都有新的提交时,Git会执行普通合并。这种合并会创建一个新的合并提交,它有两个父提交,代表了两个分支的更改。在合并过程中,Git会尝试自动解决冲突,但如果有冲突无法自动解决,你需要手动解决冲突后再进行提交。

# 切换到目标分支
git checkout main
​
# 执行普通合并
git merge Feature

递归合并

递归合并(Recursive merge)是一种特殊的普通合并,它在多个分支之间存在合并关系时使用。当你在一个分支上合并另一个分支,而另一个分支又合并了其他分支时,就会发生递归合并。在这种情况下,Git会创建一个新的递归合并提交,它有多个父提交,代表了多个分支的更改。

# 切换到目标分支
git checkout Main
​
# 执行递归合并
git merge Fix_Bug Feature

需要注意的是,合并可能会引起冲突, 特别是当两个分支在相同的文件的相同位置进行了不兼容的更改时。在这种情况下,Git会标记冲突,并将冲突的文件标记为未解决状态,你需要手动解决冲突,然后使用git add命令将解决后的文件标记为已解决,最后执行git commit提交合并结果。

变基

变基(rebase)操作是 Git 中的一种常见操作,它允许将一个分支的提交应用于另一个分支上,从而改变提交历史的结构,变基操作实际上是通过将一系列提交复制到另一个基准上来实现的

在变基操作中,你会选择一个基准分支,以及目标分支,然后将基准分支的提交复制到目标分支上。这样可以使目标分支的提交看起来好像是基于基准分支的最新状态进行开发的。

下面是变基操作的一般步骤:

  1. 确保你在基准分支上进行操作:首先,确保你位于要进行变基操作的基准分支上(假设你要将dev变基到main,那么你应该位于dev分支),可以使用 git branch 命令查看当前分支,并使用 git checkout 命令切换到基准分支。
  2. 执行变基操作:运行 git rebase 命令,指定要进行变基操作的目标分支。例如,你要将dev变基到main,那么你应该位于dev分支,并且运行 git rebase main
  3. 解决冲突(如果有):在变基过程中,如果存在冲突,Git 会暂停变基操作,并提示你解决这些冲突。你需要手动编辑文件,解决冲突后,使用 git add 命令将文件标记为已解决。
  4. 完成变基操作:当所有冲突都解决完毕后,使用 git rebase --continue 命令继续变基操作,或者使用 git rebase --abort 命令放弃变基操作。
  5. 合并分支:切换分支到目标分支,然后执行git merge命令,指定要合并的基准分支。例如你要将dev变基到main,这个步骤中,你应该位于main分支,并且运行 git merge dev

交互式变基

通过 git rebase --interactive 命令,你可以打开一个文本编辑器进行交互式变基操作,文本编辑器将显示当前分支的提交历史,并允许你对每个提交进行操作,例如修改提交消息、合并、删除或重新排序提交等

命令的语法如下:

git rebase --interactive <branch>

运行该命令后,Git 将打开一个文本编辑器,并显示一个类似于以下的界面:

pick 3f4b03e Commit message 1
pick b2a5c1d Commit message 2
pick 8de1a2f Commit message 3
​
# ...

每个提交都以 pick 开头,后面是提交的哈希值和提交消息。在编辑器中,你可以对每个提交进行以下操作:

在编辑器中进行适当的修改后,保存并关闭编辑器,Git 将按照你的修改执行相应的操作,并重新应用提交历史。

高级变基操作

假设我们有一个示例存储库,其分支如下:

o---o---o---o---o  main
     \
      o---o---o---o---o  featureA
           \
            o---o---o  featureB

featureB 基于 featureA,但是featureB 其实并不依赖于 featureA 的任何更改,我们想要把featureB从feature A分离出来,应用到main分支中。此时就需要使用--onto高级变基命令!

// 切换到featureB分支
git rebase --onto main featureA featureB
// 切换到main分支
git merge featureB

执行高级变基操作后,分支如下:

                  o---o---o  featureB
                 /
o---o---o---o---o  main
     \
      o---o---o---o---o  featureA

高级变基命令的语法如下:

git rebase --onto <newbase> <oldbase> <branch>
扫码分享收藏
扫码分享收藏