在推送的分支中压缩历史提交
Squashing history commits in a pushed branch
背景
我有一个 GitHub project 我目前正在研究,同时我也在学习 Git。今天我读到了有关使用 rebase
命令进行压缩的内容,并想在几天前推送的一些提交上尝试一下。
我想要处理的提交是 2b16710
和 32fef8e
。在我的本地存储库主分支日志看起来是这样的:
* 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
以重写历史记录,但是:
- 我担心
enh/12-durability
分支 - 我是唯一的贡献者,所以我可以完全控制该过程,但首先我必须知道如何将新历史应用到分支(或者我可能没有不必这样做,因为我将在工作完成后将其与 master 合并)
- 我不知道为什么它一直以这种方式向我显示树 - 我认为压缩会重写提交,所以我将有一个而不是两个。所以我想我需要一个解释是我的理解是错误的还是在一些强制推动之后看起来像这样。
我想实现这样的事情(注意没有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
的历史被改写了。 master
和 enh/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
移动到 abc1234
。 abc1234
包含与压扁的 2b16710
和 32fef8e
相同的更改。 d68bebe
,作为合并提交且没有 -p
,已被删除。您不需要将 abc1234
应用或合并到 master
,因为它已经在 master
.
至于 enh/12-durability
或从早于 d68bebe
的提交创建的任何其他分支,您可以选择不将 abc1234
合并到它们,因为它们已经包含等效更改到历史上 abc1234
的人。
enh/12-durability
仍然包含一些属于 master
、32fef8e
、2b16710
和 d68bebe
的旧历史的提交。如果您稍后将 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
然后您需要强制推送 master
和 enh/12-durability
以更新远程存储库中的对应项。
你想要实现的最后一个图表是不可能的。至少你不能在重写历史后保持提交哈希值不变。无论散列如何,都可以使用 git rebase
或 git reset --hard
和 git cherry-pick
.
构建这样的图
背景
我有一个 GitHub project 我目前正在研究,同时我也在学习 Git。今天我读到了有关使用 rebase
命令进行压缩的内容,并想在几天前推送的一些提交上尝试一下。
我想要处理的提交是 2b16710
和 32fef8e
。在我的本地存储库主分支日志看起来是这样的:
* 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
以重写历史记录,但是:
- 我担心
enh/12-durability
分支 - 我是唯一的贡献者,所以我可以完全控制该过程,但首先我必须知道如何将新历史应用到分支(或者我可能没有不必这样做,因为我将在工作完成后将其与 master 合并) - 我不知道为什么它一直以这种方式向我显示树 - 我认为压缩会重写提交,所以我将有一个而不是两个。所以我想我需要一个解释是我的理解是错误的还是在一些强制推动之后看起来像这样。
我想实现这样的事情(注意没有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
的历史被改写了。 master
和 enh/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
移动到 abc1234
。 abc1234
包含与压扁的 2b16710
和 32fef8e
相同的更改。 d68bebe
,作为合并提交且没有 -p
,已被删除。您不需要将 abc1234
应用或合并到 master
,因为它已经在 master
.
至于 enh/12-durability
或从早于 d68bebe
的提交创建的任何其他分支,您可以选择不将 abc1234
合并到它们,因为它们已经包含等效更改到历史上 abc1234
的人。
enh/12-durability
仍然包含一些属于 master
、32fef8e
、2b16710
和 d68bebe
的旧历史的提交。如果您稍后将 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
然后您需要强制推送 master
和 enh/12-durability
以更新远程存储库中的对应项。
你想要实现的最后一个图表是不可能的。至少你不能在重写历史后保持提交哈希值不变。无论散列如何,都可以使用 git rebase
或 git reset --hard
和 git cherry-pick
.