如何调和分离头和原点/主人?已经检查出旧哈希

时间:2018-02-14 22:33:19

标签: git github git-detached-head

简介和搜索

所以我认为我犯了一个严重的错误而且我很担心。我已经解析了分离头的论坛,我已经接近找到了答案,但这些场景太具体了,不适用于我所处的位置。如果您找到回答我问题的特定主题,请链接我。

例如:How can I reconcile detached HEAD with master/origin?

这家伙已经完成git rebase -i,我没有。我尝试过变调,但它没有解决我的问题。

小背景

  • 我是git的新手;我只用自己使用git
  • 我拥有远程存储库
  • 需要旧的代码集,这是时间敏感的问题
  • 我选择了一些编程,并且在没有其他人编码的工作场所使用它(所以我不能请求帮助)

问题:

要使用工作代码访问旧提交,我做了(可能是错误的):

git log
git checkout <hash-of-desired-old-commit>

我继续完成代码。谢谢版本控制!但是拍摄,为什么git这么复杂?我该如何保存这项工作?我现在处于一个超然的头脑中。 Origin / Master在将来的某些提交中最好全部删除。

我尝试了什么

  • 将整个文件夹复制并粘贴到其他地方,仅用于备份
  • git add -A后跟git commit -m "oh shit, detached head commit"git rebase master
  • git reset --hard HEAD~3每个建议:Checkout old commit and make it a new commit

问题:如何将我的分离头与原点/主人调和?一旦调和,我是否需要git push --force或其他东西(特别是--force标志)?在这个独立的头上有工作,我读过我等待的时间越长,垃圾收集可能会来吃我失去的分支。对不起,我缺少git的正式培训...我几乎准备好检查原始主人,然后重写代码。

提前谢谢。

1 个答案:

答案 0 :(得分:3)

如果您处于分离的HEAD并且想要保存HEAD当前所处的状态,只需创建一个分支:

git branch save-this-head

现在,你有一个指向那个确切分离的HEAD的分支,所以你可以安全地检查它而不会丢失东西:

git checkout save-this-head

现在,你已经不再处于独立的HEAD状态了。您和您的更改是安全的!如果你有任何待定的更改,你现在应该提交,所以我们可以自由移动。

之后,您可以将这个新分支重新绑定到其他内容上,例如主分支:

git rebase master

那应该重播master上缺少的提交。因此,自分离的HEAD以来所做的更改将被恢复。

如果你只是想留在那个save-this-head状态,然后扔掉以前的主人,你可以结账主人,然后将其重置为保存状态:

git checkout master
git reset --hard save-this-head

这会使master等同于save-this-head,从而丢弃master上的所有其他更改。如果你想推动它,你可能不得不强行推送,以便从遥控器中删除提交。

  

我读过我等待的时间越长,垃圾收集可能会来吃掉我失去的分支

首先,只要你保持该状态,HEAD将指针将继续查看该提交对象(这就是为什么它首先被称为“分离的HEAD”)。这将阻止任何垃圾收集删除该提交对象(及其所有父对象)。

即使你不小心离开了分离的HEAD状态,让你提到的是“悬空”提交的提交,Git会将对象保持数周,甚至考虑允许对象为垃圾集。并且仅仅因为它受垃圾收集的影响并不意味着GC将实际运行,特别是当您不与存储库交互时。

顺便说一下。在将来,无论何时你想回到历史中的提交并希望某些事情(除了寻找),你应该只创建一个分支。即使它只是一个临时的,拥有它将允许你更自由地四处走动,你不会因为那个独立的HEAD状态做任何事情而气馁:

git checkout -b fix-something <some-old-hash>