在推送的分支中压缩历史提交

Squashing history commits in a pushed branch

背景

我有一个 GitHub project 我目前正在研究,同时我也在学习 Git。今天我读到了有关使用 rebase 命令进行压缩的内容,并想在几天前推送的一些提交上尝试一下。

我想要处理的提交是 2b1671032fef8e。在我的本地存储库主分支日志看起来是这样的:

* f49573f - (21 hours ago) [#12] Add durability icons - KamilPacanek (origin/enh/12-durability, enh/12-durability)
* 1c9fec4 - (21 hours ago) [#12] Move reactor parts handling to ReactorPanel - KamilPacanek
*   d68bebe - (2 days ago) Merge branch 'enh/7-introducing-clock-ticks' - KamilPacanek (HEAD -> master, origin/master)
|\
| * 2b16710 - (2 days ago) [#7] Refactors - KamilPacanek
| * 32fef8e - (2 days ago) [#7] Implements game ticks - KamilPacanek
|/
*   f699930 - (2 days ago) Merge branch 'enh/28-oper-icons-rework' - KamilPacanek
|\
| * ffb3672 - (2 days ago) [#28] Reactor icon animates when reactor is working - KamilPacanek

如您所见,在提交之后我创建了一个功能分支 (enh/12-durability)。

我想做什么

我尝试了以下方法 - checkout 大师,做了一个实验分支并执行了以下命令来压缩提交。

git rebase -i f699930

我用 fixup 标记了 2b16710 并生成了以下树:

* a7641cc - (2 days ago) [#7] Implements game ticks - KamilPacanek (HEAD -> exp-squash)
| * f49573f - (21 hours ago) [#12] Add durability icons - KamilPacanek (origin/enh/12-durability, enh/12-durability)
| * 1c9fec4 - (21 hours ago) [#12] Move reactor parts handling to ReactorPanel - KamilPacanek
| *   d68bebe - (2 days ago) Merge branch 'enh/7-introducing-clock-ticks' - KamilPacanek (origin/master, master)
| |\
|/ /
| * 2b16710 - (2 days ago) [#7] Refactors - KamilPacanek
| * 32fef8e - (2 days ago) [#7] Implements game ticks - KamilPacanek
|/
*   f699930 - (2 days ago) Merge branch 'enh/28-oper-icons-rework' - KamilPacanek
|\
| * ffb3672 - (2 days ago) [#28] Reactor icon animates when reactor is working - KamilPacanek

在那之后,我做了一些差异以确保 a7641cc 包含与这两个压扁的相同的更改并且确实如此。

接下来,我试图弄清楚如何将这些更改合并到我的 master 并最终推送到 origin 以重写历史记录,但是:

  1. 我担心 enh/12-durability 分支 - 我是唯一的贡献者,所以我可以完全控制该过程,但首先我必须知道如何将新历史应用到分支(或者我可能没有不必这样做,因为我将在工作完成后将其与 master 合并)
  2. 我不知道为什么它一直以这种方式向我显示树 - 我认为压缩会重写提交,所以我将有一个而不是两个。所以我想我需要一个解释是我的理解是错误的还是在一些强制推动之后看起来像这样。

我想实现这样的事情(注意没有2b16710提交):

* f49573f - (21 hours ago) [#12] Add durability icons - KamilPacanek (origin/enh/12-durability, enh/12-durability)
* 1c9fec4 - (21 hours ago) [#12] Move reactor parts handling to ReactorPanel - KamilPacanek
*   d68bebe - (2 days ago) Merge branch 'enh/7-introducing-clock-ticks' - KamilPacanek (HEAD -> master, origin/master)
|\
| * 32fef8e - (2 days ago) [#7] Implements game ticks - KamilPacanek
|/
*   f699930 - (2 days ago) Merge branch 'enh/28-oper-icons-rework' - KamilPacanek
|\
| * ffb3672 - (2 days ago) [#28] Reactor icon animates when reactor is working - KamilPacanek

我走在正确的轨道上吗?我觉得我需要挑选一些提交来使它正确..但我不知道。

您创建了一个实验分支 exp-squash 并对其进行了处理。到目前为止,只有exp-squash的历史被改写了。 masterenh/12-durability 不变。

如果你 运行 git rebase -i f699930master 上,图形看起来几乎相同,除了 HEAD->master 将修饰新生成的提交,假设 abc1234,像这样:

* abc1234 - (2 days ago) [#7] Implements game ticks - KamilPacanek (HEAD -> master)
| * f49573f - (21 hours ago) [#12] Add durability icons - KamilPacanek (origin/enh/12-durability, enh/12-durability)
| * 1c9fec4 - (21 hours ago) [#12] Move reactor parts handling to ReactorPanel - KamilPacanek
| *   d68bebe - (2 days ago) Merge branch 'enh/7-introducing-clock-ticks' - KamilPacanek (origin/master)
| |\
|/ /
| * 2b16710 - (2 days ago) [#7] Refactors - KamilPacanek
| * 32fef8e - (2 days ago) [#7] Implements game ticks - KamilPacanek
|/
*   f699930 - (2 days ago) Merge branch 'enh/28-oper-icons-rework' - KamilPacanek
|\
| * ffb3672 - (2 days ago) [#28] Reactor icon animates when reactor is working - KamilPacanek

这样,master的历史就被改写了。它的头从 d68bebe 移动到 abc1234abc1234 包含与压扁的 2b1671032fef8e 相同的更改。 d68bebe,作为合并提交且没有 -p,已被删除。您不需要将 abc1234 应用或合并到 master,因为它已经在 master.

至于 enh/12-durability 或从早于 d68bebe 的提交创建的任何其他分支,您可以选择不将 abc1234 合并到它们,因为它们已经包含等效更改到历史上 abc1234 的人。

enh/12-durability 仍然包含一些属于 master32fef8e2b16710d68bebe 的旧历史的提交。如果您稍后将 enh/12-durability 合并到新的 master,这些提交将再次引入 master。所以最好也重写enh/12-durability

git rebase --onto abc1234 d68bebe enh/12-durability

图形如下:

* abc3333 - (21 hours ago) [#12] Add durability icons - KamilPacanek (HEAD->enh/12-durability)
* abc2222 - (21 hours ago) [#12] Move reactor parts handling to ReactorPanel - KamilPacanek
* abc1234 - (2 days ago) [#7] Implements game ticks - KamilPacanek (master)
*   f699930 - (2 days ago) Merge branch 'enh/28-oper-icons-rework' - KamilPacanek
|\
| * ffb3672 - (2 days ago) [#28] Reactor icon animates when reactor is working - KamilPacanek

然后您需要强制推送 masterenh/12-durability 以更新远程存储库中的对应项。

你想要实现的最后一个图表是不可能的。至少你不能在重写历史后保持提交哈希值不变。无论散列如何,都可以使用 git rebasegit reset --hardgit cherry-pick.

构建这样的图