git:从功能分支合并多次后,创建干净的历史记录,随后对其进行基础调整

时间:2019-01-19 09:08:44

标签: git rebase

假设我正在分支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
...

这很好。问题是我们希望掌握这一点并拥有良好的历史记录。特别是我们要:

  1. 使用某种变基清理A的历史记录
  2. 使用某种变基清理B的历史
  3. 首先提交A,然后提交B,以掌握上述所有附加合并信息。

我想出的唯一方法是:

  1. 以通常的方式将A重新设置为主节点
  2. Cherry将B的所有非合并提交都选择到master。

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

有更好的方法吗?

2 个答案:

答案 0 :(得分:1)

好吧,您可以自动选择樱桃,而不是手动挑选樱桃,即重新设置基数:

git rebase A B

git将自动:

  • 找出A和B之间的父提交
  • 遍历B中所有要应用到A之上的提交
  • 确定一些提交已经在A中,不需要再次应用。

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

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

答案 1 :(得分:0)

在numpy开发中使用的一种常见技术是将功能分支压缩为单个提交。对于一个较小的项目,这可能不如@Cimbali's answer那样有效,但是对于numpy大小的项目而言,它确实非常有效,其中单个PR的粒度相对于整个项目而言非常小。使用rebase进行清理的一个优点是,您可以在进行任何合并之前将所有内容都很好地移动到有保证的快速转发状态。

标准命令类似于

git rebase -i master

然后为所有提交(除了第一次提交)选择fixup,然后滚动。