在修改了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
已经合并并且令人满意。
下面是最后一个问题的答案:
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的列表中)。