首页 > 解决方案 > git:从功能分支多次合并后创建一个干净的历史记录,该分支随后被重新设置

问题描述

假设我正在开发分支 B 中的某个功能。我的功能依赖于我的同事在分支 A 中开发的另一个功能。

我和我的同事密切合作,所以在开发过程中他会经常用我在 B 中需要的新东西来更新 A。我得到他的改变的方式就是与他的分支合并。所以我在 B 中所做的事情如下:

git checkout master
git checkout -b B
..
git commit Some work
..
git commit More work
..
git fetch origin
git merge origin/A
..
git commit Event more work
..
git fetch origin
git merge origin/A
..
git commit And even more work
..
git fetch origin
git merge origin/A
...

这很好用。问题是我们想把它变成 master 并拥有一个干净的历史。我们特别希望:

  1. 使用某种变基清理 A 的历史
  2. 使用某种变基清理 B 的历史
  3. 首先提交 A,然后提交 B 到 master,而不需要上面的所有额外合并。

我能想到的唯一方法是:

  1. 以通常的方式将 A 变基为 master
  2. Cherry 从 B 中挑选所有非合并提交到 master 上。

一个问题是我必须手动挑选非合并提交。

有没有更好的办法?

标签: gitrebase

解决方案


好吧,您可以自动挑选樱桃,而不是手动挑选樱桃,即变基:

git rebase A B

git 会自动:

  • 找出 A 和 B 之间的父提交
  • 遍历 B 中的所有提交以应用于 A 之上
  • 找出一些提交已经在A并且不需要再次应用。

但是,您可能会在此过程中遇到很多冲突。

我建议,如果合并时的干净历史记录向您导入,您将工作流程调整为 havegit rebase origin/A而不是git merge origin/A,这意味着您的历史记录将保持干净。您可能还想稍微了解一下 git rebase 工作流程。


推荐阅读