git - 如何在合并到master之前清理复杂的分支?

时间:2017-04-26 15:21:56

标签: git merge

通常我git rebase -i master在将分支合并到master之前压缩或修复一些提交(例如提交消息只是" refactor"),但是我可以用更大,更复杂的分支做什么那些主人和孩子在不同阶段合并了?我相信rebase适用于这个简单的场景(基于谷歌搜索):

  * (newest commit)
  |\
  * |
  | * grandchild
  * |
  |/
  * child
  |
 / 
|
* master (oldest commit)

但是这个呢?

  *  (newest commits)
  |\
  * |
 /| * grandchild
* * |
| |/
| * child
* |
|/ 
|
* master (oldest commit)

有没有办法在没有大量工作的情况下简化这段历史?我只试过git rebase -i master并且存在很多冲突(其中一些是空白的,这要归功于rerere我认为,但有些冲突难以解决)。要清楚,这是我想要的结果(显然我们可以在master中运行追赶合并,我们将有一个线性历史记录;子分支中的最终提交数是任意的):

  * (newest commit)
  |
  * child
  |
 / 
|
* master (oldest commit, though newest in master)

如果这是一个重复的问题我很道歉,因为它可能是(但我找不到具体解决我的问题的问题)。

1 个答案:

答案 0 :(得分:1)

有几个选择。

首先,rebase -i 可能工作。值得一试 - 这是git,所以如果需要你可以回到以前的状态。 (如果您在启动rebase时遇到branch-X,并且一切都出错了,您知道(a)rebase仅更改branch-X ref,并且(b)reflog可以是曾经把它搬回来,所以

git reset --hard branch-X@{1}

并且没有造成任何伤害。)

现在,如果以某种特定的方式失败,或者似乎难以做到正确,那么这就是一个更明智的(和IMO更好)问题的起点。

那就是说,我认为对于这个特殊情况,它可能更容易做到

git checkout child
git merge --squash branch-X
git commit
git branch -f branch-X

作为"壁球合并"就是用一次提交来替换合并中涉及的任何拓扑结构。

请注意,无论采用哪种方式 - 实际上任何方式,这样做 - 如果您要更换的提交已被推送到远程,那么最佳做法就是不要这样做。这通常被称为关于变基的警告,但它适用于任何修改历史的操作。