我的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
我做错了什么?
答案 0 :(得分:3)
您可以使用
查看您的refloggit reflog
应该看到像
这样的行b9778dc HEAD@{x}: rebase -i (finish): returning to refs/heads/master
92a366c HEAD@{y}: merge origin/master: Recursive
这些行中的每一行都会显示移动HEAD
的时间(commit
,merge
,rebase
等)。您可以在那里搜索提交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或者只保留两者。