我可以回到“git checkout”状态之前吗?

时间:2017-09-02 00:07:29

标签: git

这是我目前的情况。我创建了另一个分支并在分支上修改了我的代码。然后我git在分支上提交。

现在,当我尝试将提交推送到我的云存储库时,它显示“所有最新”。然后我注意到我忘了回到主分支,所以我尝试了“git checkout master”。

现在,所有的代码修改以及临时创建的分支似乎已经消失了。现在,“git branch”只显示“master”。

在这种情况下,我可以重新获得我在另一个分支上进行的代码修改吗?我不知道“git checkout”会破坏我在另一个分支上修改的所有代码,因为我认为它只是切换到另一个分支......

1 个答案:

答案 0 :(得分:1)

  

这是我目前的情况。我创建了另一个分支并在分支上修改了我的代码。然后我git在分支上提交。

嗯,是的,不是。见What exactly do we mean by "branch"?

正如你问题中的评论一样,你做了:

git checkout <some-hash-ID>

检出特定提交,作为一种回溯到当前提交操作的时间。 Git称这种git checkout a&#34;分离的HEAD&#34;并且打印出一个巨大的警告(在任何现代的Git-very Git,1.7时代,我记得相当安静),因为在这种情况下它很容易开始承诺。

然后你做了新的提交。在Git中,这是你可以做的事情,即使你不在任何分支上,也就是说,如果你处于这种分离的HEAD模式。 Git继续前进并进行新的提交,并且 - 就像其他问题一样 - 这些新提交形成一种分支,我喜欢有时称之为DAGlet。

因为没有涉及名称,所以这些新提交的唯一名称是他们的原始哈希ID,或者 - 至少目前 - HEAD 。名称HEAD一直有效,直到您通过运行git checkout master重新附加HEAD为止。

重新连接HEAD后(HEAD只意味着master,这意味着分支的提示命名为 {{1} }),名称master停止工作意味着当你把你的头盔抱在怀里时所作的承诺,就像某种食尸鬼追逐Ichabod Crane

我们可以画出这样的情况。你可能做过HEAD,所以我们知道提交的哈希ID;我认为git checkout 7830210是您创建的新提交。还有更多提交的ID我们都不知道,并且真的不关心,我们可以将其表示为圆点e4c58...。所以当你的HEAD松散地滚动时:-)你有这个:

o

然后你告诉Git将...--o--7830210...--o--o <-- master \ e4c58... <-- HEAD 重新附加到HEAD,并给予:

master

要更普遍地操纵新提交,您需要为其命名。 Git是Git,有很多方法可以做到这一点。最简单的是使用...--o--7830210...--o--o <-- master (HEAD) \ e4c58... [no name -- abandoned] ,它可以在给定提交哈希ID时创建新分支:

git branch

给了我们:

$ git branch xyzzy-branch e4c58

(请注意,您的...--o--7830210...--o--o <-- master (HEAD) \ e4c58... <-- xyzzy-branch 仍然未受影响,因此它仍然附加在HEAD上。

DAGlet 是一个发明的词,故意用真实的单词aglet进行双击,这意味着其中一个塑料覆盖的鞋带提示,例如,DAG加上{{3 }}。 DAG是Directed Acyclic Graph的常用计算机科学首字母缩略词。 DAGlet只是更大DAG的任何有用片段。我们只关心以指向它的名称结尾的片段,或者在某些情况下 - no 名称不再指向它们,就像在这种特殊情况下一样。通过将它们包裹在隐喻塑料中,我们可以轻松抓住它们并使用它们:瞧,DAGlets。)

据我所知,我发明了这个词。我在diminutive suffix -let中也看到了DAGlet这个词,但我之前用过它。 (它也是一个地方名称的一部分 - 它似乎是阿尔及利亚撒哈拉沙漠中的一个小绿洲:an IEEE paper。)尽管如此,这个小小的后缀仍然是一种明显的形态。