如何重新创建由git rebase销毁的合并

时间:2016-06-15 12:45:43

标签: git merge rebase

我的git历史是

A-B---D-------H-I-J
   \         /
    C---E-F-G

当我决定在提交git rebase -i A后立即执行F移动提交B时。

现在我

A-B-----------F-C-D-E-F-G-I-J
   \
    C---E---G

这不是我想要的。

我怎样才能到达

A-B-F-D-------H-I-J
   \         /
    C---E---G

我做错了什么?

2 个答案:

答案 0 :(得分:3)

您可以使用

查看您的reflog
git reflog

应该看到像

这样的行
b9778dc HEAD@{x}: rebase -i (finish): returning to refs/heads/master
92a366c HEAD@{y}: merge origin/master: Recursive

这些行中的每一行都会显示移动HEAD的时间(commitmergerebase等)。您可以在那里搜索提交J。显然你不会知道提交的SHA1,所以你需要猜一点。合并后是两次提交,所以它可能看起来像

[...]
1e53f16 HEAD@{x}: commit: J commit message
f8577d2 HEAD@{y}: commit: I commit message
e8969e2 HEAD@{z}: merge e8969e2: Recursive

如果你那么做。

git reset --hard HEAD@{x}

您最终应HEAD J并恢复旧图。

请注意,选择错误的提交不会破坏事情。没有任何提交被删除,并且每个git reset只会添加另一行到reflog:

1e53f16 HEAD@{0}: reset: moving to HEAD@{x}
[...]
1e53f16 HEAD@{x+1}: commit: J commit message
f8577d2 HEAD@{y+1}: commit: I commit message
e8969e2 HEAD@{z+1}: merge e8969e2: Recursive

含义

git reset --hard HEAD@{1}

将取消您最后一次移动。

答案 1 :(得分:-1)

由于git cherry-pick有点棘手,我更喜欢1.git checkout -b new_branch 2.git reset B --hard A-B->new_branch HEAD 3.git cherry-pick F D A-B-F'-D'->new_branch HEAD 4.git checkout -b side_branch E A-B-F'-D'->new_branch \ C-E->side_branch HEAD 5.git cherry-pick G A-B-F'-D'->new_branch \ C-E-G'->side_branch HEAD 6.git checkout new_branch A-B-F'-D'->new_branch HEAD \ C-E-G'->side_branch 7.git merge side_branch A-B-F'-D'---H'->new_branch HEAD \ / C-E-----G'->side_branch 8.git cherry-pick I J A-B-F'-D'---H'-I'-J'->new_branch HEAD \ / C-E-----G'->side_branch

{{1}}

现在new_branch就是你想要的,你可以删除你以前的分支并重命名new_branch或者只保留两者。