为什么 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 log
或 gitk
检查时一切正常。但是当我return掌握git checkout master
时,所有的过程都被撤销了,再检查的时候!有谁知道为什么?
环境:
- Windows 10
- Git 2.31.1.windows.1
问题是这一行,你说你这样做“只是为了可读性”:
git checkout 222333
这使您处于“分离的头”状态:您的工作副本在那个版本上,而不是在任何分支上。
在该状态下,您重新设置了一些提交的基础,这会创建一个由新提交组成的新历史记录。通常,这也会移动当前分支指针以指向那些新提交,但是您没有当前分支,因此不会移动任何指针。
最后,你 运行 git checkout master
切换到名为“master”的分支。一个分支只是一个指针,这个分支并不指向 git rebase
生成的新提交,它指向它之前指向的任何地方。新创建的提交被“孤立”,没有指向它们的分支。
还有另一个问题:git 中的提交是 不可变的,因此对历史的任何编辑都必须从该点向前创建新的提交 。您在日志摘要中显示的“许多提交”都需要重写,因此它们都需要列在交互式 rebase 待办事项列表中。
(如果你看过足够多的科幻电影,git中的“改变历史”就像时间旅行的形式,你不改变自己的过去,你创造了一个平行宇宙不同的过去,相应地不同的未来。)
所以忘记让它“可读”,只是 运行 这个:
git checkout master
git rebase -i 000111
标记为“pick”的许多行都是将要重新创建的行;只需滚动过去并删除您想要而不是重新创建的那个。
亲爱的,
我想删除 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 log
或 gitk
检查时一切正常。但是当我return掌握git checkout master
时,所有的过程都被撤销了,再检查的时候!有谁知道为什么?
环境:
- Windows 10
- Git 2.31.1.windows.1
问题是这一行,你说你这样做“只是为了可读性”:
git checkout 222333
这使您处于“分离的头”状态:您的工作副本在那个版本上,而不是在任何分支上。
在该状态下,您重新设置了一些提交的基础,这会创建一个由新提交组成的新历史记录。通常,这也会移动当前分支指针以指向那些新提交,但是您没有当前分支,因此不会移动任何指针。
最后,你 运行 git checkout master
切换到名为“master”的分支。一个分支只是一个指针,这个分支并不指向 git rebase
生成的新提交,它指向它之前指向的任何地方。新创建的提交被“孤立”,没有指向它们的分支。
还有另一个问题:git 中的提交是 不可变的,因此对历史的任何编辑都必须从该点向前创建新的提交 。您在日志摘要中显示的“许多提交”都需要重写,因此它们都需要列在交互式 rebase 待办事项列表中。
(如果你看过足够多的科幻电影,git中的“改变历史”就像时间旅行的形式,你不改变自己的过去,你创造了一个平行宇宙不同的过去,相应地不同的未来。)
所以忘记让它“可读”,只是 运行 这个:
git checkout master
git rebase -i 000111
标记为“pick”的许多行都是将要重新创建的行;只需滚动过去并删除您想要而不是重新创建的那个。