如何在较早的提交之间放置错误修复提交

How to place a bugfix commit between earlier commits

我的存储库中有以下结构:

|-commit9 [bugfix]
|-commit8
|-commit7
|-commit6
|-commit5 [branch-2]
|-commit4
|-commit3
|-commit2 [branch-1]
|-commit1
o-master

错误修复应用在其他提交之上。如何将 commit8commit9 移动到较早的点,例如,立即在 master 之上?


我按照此处的说明进行操作: 现在我的存储库如下所示:

|-commit7
|-commit6
|-commit5
|-commit4
|-commit3
|-commit2
|-commit1
|-commit9 [bugfix]
|-commit8
| |-commit9 [bugfix]
| |-commit8
| |-commit7
| |-commit6
| |-commit5 [branch-2]
| |-commit4
| |-commit3
| |-commit2 [branch-1]
| |-commit1
|/
o-master

所以 commit8commit9 是我最初打算的地方,但是其余的提交是重复的,我当然没有分支名称。

我现在如何获得 "linear" 历史记录?

好吧,你到了那里。

首先,推送到远程或在另一个地方克隆您的本地存储库。只是要确定。之后让我们修复那个主分支。在我们继续之前,请确保您在那个分支上。

git checkout master

现在我们不需要其他提交,只需要 8 和 9。因为它们已经存在,我们可以简单地将主分支重置为提交 9 并删除其他提交。不用担心,您的提交仍在分支中,因此不会丢失任何内容。
[commit9@master] 替换为您提交的 sha。

git reset --hard [commit9@master]

现在继续检查 bugfix 分支并将其重置为提交 7,就像我们对 master 分支所做的那样。

git checkout bugfix
git reset --hard [commit7@bugfix]

现在,为了恢复线性流程的最后一部分,您可以将您的修补程序合并回 master 并将您的所有工作放在同一个地方。

git checkout master
git merge bugfix

回答原来的问题

我想最简单的方法是检查您的 master 分支。 Cherry-pick 您想要移动的两个提交。返回到您的原始分支并将其重置为两次提交。后者可以通过使用

来完成
git reset --hard HEAD^2

这意味着从我当前的位置删除两个提交。

小警告: 移动提交可能很危险。由于您是根据特定的变更集进行提交的,因此相同的代码在其新位置上的行为可能会有所不同。看到您移动的代码可能取决于代码不再存在。