在成功地从损坏的git rebase中恢复后,再次调用git rebase将无法正常工作

nzkunb0c  于 2023-04-10  发布在  Git
关注(0)|答案(2)|浏览(132)

在修改了一个git rebase -i之后,我最终使代码进入了我想要的状态。

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

提交55c602ed1c完全正确。
然而,当我现在调用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来摆脱它,这使得分支处于正确的状态,但仍然无法变基。
我怎样才能恢复正常的变基函数?
编辑:
删除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

并且需要手动解决冲突。
我尝试过转换到this answer to a similar question中建议的公共祖先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 Mage 上看到它)

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提交55c602ed1c仍然没有在底部列出。如果我继续使用该选择进行变基,55c602ed1c将被忽略,并要求我再次解决冲突,显然我不想这样做,因为55c602ed1c已经合并并令人满意。
新的问题是 * 我如何删除HEAD和共同祖先之间的提交,但不包括HEAD和共同祖先,同时保留HEAD(显然)*?

t40tm48m

t40tm48m1#

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

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

这应该行得通,没有冲突需要解决。当然,你正在失去(和重写)历史,但我认为这是最终目标,对吗?

nzk0hqpo

nzk0hqpo2#

这里有几个问题,让我们来解决简单的问题.
您希望看到:

pick 6c3fa102c2
pick 55c602ed1c

这是不可能发生的。好吧...只有一部分会发生,第二次选择...但是你不会得到第一次,因为那是你在交互式调用中用作基础的提交...那个提交是 not rebased的。如果你做了git rebase -i 6c3fa102c2~,那么你会看到那个提交出现在列表中。
然后,第二个提交有点棘手,我 * 认为 * 55c602ed1c是一个合并提交(你能用git log --oneline --graph检查吗?).父提交之一是6c3fa102c2 ...所以,git rebase -i 6c3fa102c2将列出合并提交的另一边的提交(并且假设55c602ed1c是一个合并提交,并且你没有使用--rebase-merges,它不会出现在要变基的提交列表中)。

相关问题