压榨历史在推入的分支中提交

时间:2019-04-19 09:46:21

标签: git squash git-squash

背景

我有一个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

我用2b16710标记了fixup,结果得到了下面的树:

* 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

我走对了吗?我感觉我需要挑选一些提交来使其正确..但我不知道。

1 个答案:

答案 0 :(得分:2)

您创建了一个实验分支exp-squash并对其进行了工作。到目前为止,仅exp-squash的历史记录已被重写。 masterenh/12-durability不变。

如果您在git rebase -i f699930上运行master,则图形将几乎相同,只是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来构造这样的图。