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.txt
,git rebase --continue
。
这完成了变基,文件现在是我上次解决冲突时的格式。
1出现 |||||||
到 =======
部分是因为我将 merge.conflictStyle
设置为 diff3
。这向我展示了共同祖先中的内容。它在真正的合并过程中最有用——cherry-pick 的 "merge base" 有点可疑——但我喜欢一直保持它。
2我省略了为旧提交的新副本编写新提交消息的编辑器会话,因为它们与最终结果无关。 (请记住,git rebase
是 复制 提交。一旦 rebase 完成,ORIG_HEAD
会记住原始的、预复制的提交;当前的 b运行ch 名称现在可以找到新的 post-复制提交。)
我有一个文件,比如说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.txt
,git rebase --continue
。
这完成了变基,文件现在是我上次解决冲突时的格式。
1出现 |||||||
到 =======
部分是因为我将 merge.conflictStyle
设置为 diff3
。这向我展示了共同祖先中的内容。它在真正的合并过程中最有用——cherry-pick 的 "merge base" 有点可疑——但我喜欢一直保持它。
2我省略了为旧提交的新副本编写新提交消息的编辑器会话,因为它们与最终结果无关。 (请记住,git rebase
是 复制 提交。一旦 rebase 完成,ORIG_HEAD
会记住原始的、预复制的提交;当前的 b运行ch 名称现在可以找到新的 post-复制提交。)