在修改了一个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(显然)*?
2条答案
按热度按时间t40tm48m1#
以下是最后一个问题的答案:
这应该行得通,没有冲突需要解决。当然,你正在失去(和重写)历史,但我认为这是最终目标,对吗?
nzk0hqpo2#
这里有几个问题,让我们来解决简单的问题.
您希望看到:
这是不可能发生的。好吧...只有一部分会发生,第二次选择...但是你不会得到第一次,因为那是你在交互式调用中用作基础的提交...那个提交是 not rebased的。如果你做了
git rebase -i 6c3fa102c2~
,那么你会看到那个提交出现在列表中。然后,第二个提交有点棘手,我 * 认为 *
55c602ed1c
是一个合并提交(你能用git log --oneline --graph
检查吗?).父提交之一是6c3fa102c2
...所以,git rebase -i 6c3fa102c2
将列出合并提交的另一边的提交(并且假设55c602ed1c
是一个合并提交,并且你没有使用--rebase-merges
,它不会出现在要变基的提交列表中)。