为什么 Git 在我检出最近的提交时撤消变基过程?

Why is Git undoing the rebase process when I'm checking out to the most recent commit?

亲爱的,

我想删除 git 存储库上的一个非常旧的提交,但是在执行变基过程并检出存储库的最后一个分支后,该过程正在撤消。所以,这就是我正在做的事情:

git log
abcdef - Last repo commit (master)
...
... # many many commits
...
222333 - A
111222 - B <-- I want to delete this
000111 - C

更改 HEAD,只是为了提高可读性:

git checkout 222333
git rebase -i 000111

此时,我编辑rebase显示的待办事项,将文本从pick更改为edit。

pick 222333 - A
pick 111222 - B (change to edit)
pick 000111 - C

现在我正在提交中对文件内容进行修改。在此之后:

git add .
git commit --amend
git rebase --continue

毕竟,使用 git loggitk 检查时一切正常。但是当我return掌握git checkout master时,所有的过程都被撤销了,再检查的时候!有谁知道为什么?

环境:

问题是这一行,你说你这样做“只是为了可读性”:

git checkout 222333

这使您处于“分离的头”状态:您的工作副本在那个版本上,而不是在任何分支上

在该状态下,您重新设置了一些提交的基础,这会创建一个由新提交组成的新历史记录。通常,这也会移动当前分支指针以指向那些新提交,但是您没有当前分支,因此不会移动任何指针。

最后,你 运行 git checkout master 切换到名为“master”的分支。一个分支只是一个指针,这个分支并不指向 git rebase 生成的新提交,它指向它之前指向的任何地方。新创建的提交被“孤立”,没有指向它们的分支。

还有另一个问题:git 中的提交是 不可变的,因此对历史的任何编辑都必须从该点向前创建新的提交 。您在日志摘要中显示的“许多提交”都需要重写,因此它们都需要列在交互式 rebase 待办事项列表中。

(如果你看过足够多的科幻电影,git中的“改变历史”就像时间旅行的形式,你不改变自己的过去,你创造了一个平行宇宙不同的过去,相应地不同的未来。)

所以忘记让它“可读”,只是 运行 这个:

git checkout master
git rebase -i 000111

标记为“pick”的许多行都是将要重新创建的行;只需滚动过去并删除您想要而不是重新创建的那个。