Git rebase 以重新安排涉及同一文件的提交

Git rebase to rearrange commits involving same file

我有一个文件,比如说foo.txt。我向其中添加一行,现在它看起来像:

*existing content*
Line 1

我提交消息 "First change"。现在我再次打开同一个文件,并在末尾添加另一行,现在它看起来像:

*existing content*
Line 1
Line 2

我在消息 "Second change" 中承诺了这一点。 git log 将 "Second change" 显示为最上面的更改,其次是 "First change",正如预期的那样。现在我想颠倒这两个提交,这样 "First cange" 排在最前面,"Second change" 排在第二位。

我尝试用 git rebase -i 来做,我遇到了连续的合并冲突,我正在解决。但在那之后,我只剩下一个提交,"Second change",我想要在顶部的 "First change" 提交现在丢失了。

我该怎么做?

您可能需要展示更多您的过程。

我创建了一个小存储库和一个文件 foo.txt,在两次提交中添加了这两行,运行 git rebase -i 并交换了它们:

pick f196c5b second change
pick 8d6ad6a first change

导致:1

1
2
3
4
5
6
existing content
<<<<<<< HEAD
||||||| parent of f196c5b... second change
Line 1
=======
Line 1
Line 2
>>>>>>> f196c5b... second change

我现在必须手动解决。我应该选择什么作为结果?我认为是这样的:

1
2
3
4
5
6
existing content
Line 2

所以我编辑文件以得到它并退出编辑器,git add foo.txt 和 运行 git rebase --continue;2 然后我得到另一个冲突,导致:

1
2
3
4
5
6
existing content
<<<<<<< HEAD
Line 2
||||||| parent of 8d6ad6a... first change
=======
Line 1
>>>>>>> 8d6ad6a... first change

我应该如何解决这个问题?我认为答案是让 Line 2 远离 HEAD,同时让 Line 1 远离 8d6ad6a... first change。这些行的顺序由我决定,但我想我会使用:

1
2
3
4
5
6
existing content
Line 2
Line 1

所以我将其写入文件,退出编辑器,git add foo.txtgit rebase --continue

这完成了变基,文件现在是我上次解决冲突时的格式。


1出现 |||||||======= 部分是因为我将 merge.conflictStyle 设置为 diff3。这向我展示了共同祖先中的内容。它在真正的合并过程中最有用——cherry-pick 的 "merge base" 有点可疑——但我喜欢一直保持它。

2我省略了为旧提交的新副本编写新提交消息的编辑器会话,因为它们与最终结果无关。 (请记住,git rebase 复制 提交。一旦 rebase 完成,ORIG_HEAD 会记住原始的、预复制的提交;当前的 b运行ch 名称现在可以找到新的 post-复制提交。)