如果您位于分离的 HEAD 上并且想要保存 HEAD 当前所处的任何状态,只需创建一个分支:
git branch save-this-head
现在,你有一个分支指向那个确切的分离头,所以你可以安全地检查它而不会丢失东西:
git checkout save-this-head
现在,你不再处于分离的 HEAD 状态。您和您的更改都是安全的!如果您有任何待处理的更改,您应该立即提交这些更改,以便我们可以自由移动。
之后,您可以将这个新分支重新设置为其他分支,例如主分支:
git rebase master
这应该会重放 master 上缺少的提交。因此,自分离 HEAD 以来所做的更改将被恢复。
如果你只是想继续下去save-this-head
状态,并扔掉以前的master,你可以只checkout master,然后将其重置为saves状态:
git checkout master
git reset --hard save-this-head
这将使master
相当于save-this-head
,丢弃所有其他更改master
。如果你想推送它,你可能必须强制推送才能从远程删除提交。
我读到,我等待的时间越长,垃圾收集可能会来吃掉我丢失的树枝
首先,只要您保持在该状态,HEAD 指针就会继续查看该提交对象(这就是为什么它首先被称为“分离的 HEAD”)。这将防止任何垃圾收集删除该提交对象(及其所有父对象)。
即使您不小心离开了分离的 HEAD 状态,也使您引用的提交成为“悬空”提交后,Git 会将对象保留数周,然后再考虑允许对象被垃圾收集。仅仅因为它受到垃圾收集并不意味着 GC 会实际运行,特别是当您不与存储库交互时。
顺便提一句。将来,每当您想返回历史记录中的提交并期望do某些东西(不仅仅是查看),您应该创建一个分支。即使这只是暂时的,拥有它也会让你更自由地走动,并且你不会因为这种分离的 HEAD 状态而气馁做任何事情:
git checkout -b fix-something <some-old-hash>