从git rebase失败中成功恢复后,再次调用git rebase不能正常工作



在修改了git rebase -i之后,我最终使代码达到了我想要的状态。

$ git log
55c602ed1c (HEAD -> main) 
6c3fa102c2 (detached-branch) 
6ec87486d1 
89dd40a86a 
f6f4b6edb2 
77742d9d69 
32b67d2a01 
...

commit55c602ed1c是完全正确的。

然而,当我现在调用git rebase -i 6c3fa102c2时,我得到意想不到的编辑内容:

pick 77742d9d69
pick f6f4b6edb2
pick 89dd40a86a
# Rebase 6c3fa102c2..55c602ed1c onto 6c3fa102c2 (3 commands)
#
# Commands:
# ...

我当然期待看到

pick 6c3fa102c2
pick 55c602ed1c
# Rebase 6c3fa102c2..55c602ed1c onto 6c3fa102c2 (3 commands)
#
# Commands:
# ...

现在我退出编辑器没有保存,得到一个消息和错误:

Auto-merging ...
CONFLICT ... 
<more conflicts>

所以我做git rebase --abort来摆脱这种情况,这使分支处于正确的状态,但仍然无法重新定位。

如何恢复正常的重基函数?


EDIT:
删除reflog输出,并删除问题,同时添加新内容和问题。

$ git log --oneline --graph
*   55c602ed1c (HEAD -> main)
r|g  
r|   * 6c3fa102c2 (detached-branch) 
r|   * 6ec87486d1
*  g| 89dd40a86a
*  g| f6f4b6edb2
*  g| 77742d9d69 
r|g/  
* 32b67d2a01

实际的图形输出是红色和绿色的,所以我在|/前面加了一个字母来表示实际的颜色。

根据记录,用于创建最终的、好的、提交的55c602ed1c的命令有:

git checkout main
git merge detached-branch

需要手动解决冲突

我已经尝试重新基于共同祖先32b67d2a01,这是在这个类似问题的答案中建议的,但奇怪的是,HEAD提交55c602ed1c和共同祖先32b67d2a01都没有出现在编辑器中显示的列表中:

git rebase -i 32b67d2a01

弹出编辑器

pick 77742d9d69 
pick f6f4b6edb2 
pick 89dd40a86a 
pick 6ec87486d1 
pick 6c3fa102c2
# Rebase 32b67d2a01..55c602ed1c onto 6ec87486d1 (5 commands)
#
# Commands:

在@eftshift0给出的提示中使用波浪线(没有理解其背后的原理,也没有在git man image中看到它的rebase)

git rebase -i 32b67d2a01~

pick 32b67d2a01
pick 77742d9d69 
pick f6f4b6edb2 
pick 89dd40a86a 
pick 6ec87486d1 
pick 6c3fa102c2
# Rebase db737eb68b..55c602ed1c onto 89dd40a86a (6 commands)
#
# Commands:

但是,HEAD commit55c602ed1c没有列在底部。如果我继续使用该选择进行重置,55c602ed1c将被忽略,并要求我再次解决冲突,显然我不想这样做,因为55c602ed1c已经合并并且令人满意。

新的问题是我如何删除提交之间但不包括HEAD和共同祖先,同时保持HEAD(显然)?

下面是最后一个问题的答案:

git reset --soft 32b67d2a01
git commit -m "everything past 32b67d2a01 in a single shot"

应该可以工作,没有冲突需要解决。您正在丢失(并重写历史,当然,但我认为这是最终的目标,对吗?

这里有一些东西。让我们解决简单的那个。

你期望看到:

pick 6c3fa102c2
pick 55c602ed1c

那是不可能的。嗯…只有一部分会发生,第二个选择……但您将不会获得第一个,因为这是您在交互调用....中用作基础的提交该提交是而不是重基的。如果您执行了git rebase -i 6c3fa102c2~,那么您将看到提交显示在列表中。

然后,第二个有点棘手。我认为55c602ed1c是合并提交(你可以使用git log --oneline --graph检查吗?)。其中一个家长是6c3fa102c2…因此,git rebase -i 6c3fa102c2将列出合并提交的其他部分的提交(并且考虑到55c602ed1c是合并提交,并且您没有使用--rebase-merges,它不会显示在提交到rebase的列表中)。

最新更新