2017-03-22 173 views
0

我有一个文件,说foo.txt。我在它上面添加一行,以便它现在看起来像:Git rebase重新排列提交涉及相同的文件

*existing content* 
Line 1 

我用消息“First change”提交它。现在我再次打开相同的文件,并在末尾添加另一条线,所以它现在的样子:

*existing content* 
Line 1 
Line 2 

这我消息“二改”承诺。如预期的那样,git log显示“第二次变化”作为最上面的变化,然后显示“第一次变化”。现在我想扭转这两个提交,所以“第一个cange”出现在顶部,而“Second change”出现在第二个顶部。

我试着用git rebase -i这样做,我得到了连续的合并冲突,我正在解决这个问题。但在此之后,我剩下的只有一个提交,“第二次更改”,我想在最上面的“第一次更改”提交现在丢失了。

我该怎么做?

回答

1

您可能需要展示更多流程。

我创建了一个小库和文件foo.txt,在两次提交加入这两条线,跑git rebase -i和交换它们:

pick f196c5b second change 
pick 8d6ad6a first change 

导致:

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; 和我相互冲突,导致:

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

我应该如何解决这个问题?我认为答案是保持Line 2 from HEAD,同时还保留Line 18d6ad6a... first change。这是给我什么样的顺序把这些线路进入,但我想我会用:

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

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

这样就完成了rebase,这个文件现在是我上次解决冲突时的形式。


|||||||通过=======部出现,因为我有merge.conflictStyle设置为diff3。这向我展示了共同的祖先是什么。这在真正合并时最为有用 - 樱桃选择的“合并基础”有点怀疑 - 但我喜欢随时保持它。

由于它们与最终结果无关,所以我省略了编写新会话的编辑器会话,以供旧提交的新副本使用。 (请记住,git rebase复制提交一旦完成重设,ORIG_HEAD记得原始,预重新复制,提交;当前分支名称现在发现新的后复制提交。)