无法弄清楚结帐如何在git中运行

时间:2013-05-20 11:49:58

标签: git version-control dvcs git-checkout

我创建了一个新的存储库并提交了一个文件a.pl。一切都好。
如果git status我没有添加或未跟踪的更改。我做了一个git log,我在这个存储库中看到了我最后一次(实际上只有)提交的hash
现在我修改a.pl并在文件末尾添加一个新行。 E.g print "1";
我保存了它,如果我git status它会报告未跟踪的更改 现在,如果我这样做:git checkout <commit_id>使用git log中报告的哈希值,我希望转到我提交的版本,因此应该删除我最近未修改的修改。
我做git checkout 1d739我得到:

  

注意:退房'1d739'。

     

你处于'超级HEAD'状态。你可以四处看看,制作   实验性更改并提交它们,您可以丢弃任何   承诺你在这种状态下做出而不影响任何分支   进行另一次结账。等

当我查看文件时,我发现我添加的print "1";仍在那里! 现在在此结帐版本中,我在文件中添加了另一行:print "2";并保存文件。

然后我做:git checkout master。这会让我回到最新的提交,对吧?所以我预计我做的最后一次追加print "2";会丢失 我得到之后:Switched to branch 'master'我看到了该文件,它同时包含print "1";print "2";
这真令人困惑。我现在不应该看到最新的提交吗?这些修改都应该丢失吗?

3 个答案:

答案 0 :(得分:1)

签出不同的分支机构或提交时,会保留本地未提交的更改。 引用the man pages

  

git checkout&lt; commit&gt;

     

准备在&lt; commit&gt;之上工作,方法是将HEAD分离到它(参见“DETACHED HEAD”部分),并更新索引和文件中的文件。   工作树。 对工作树中的文件进行本地修改   保留,以便生成的工作树将成为记录的状态   提交加上本地修改

     

传递--detach在a的情况下强制执行此行为(没有选项,为命令提供分支名称将检查   离开分支,而不是分离HEAD)或当前   如果没有指定,则提交。

如果您要放弃更改,git reset就是您要找的。要在分支中实际看到一些差异,请从master创建一个新分支,对文件进行一些更改,然后提交更改。之后,在主分支和新分支之间签出将产生您期望的结果。

答案 1 :(得分:1)

Git可以防止您丢失更改。如果要签出另一个分支,则应首先提交或存储更改。如果您要放弃更改,可以使用git reset --hard

答案 2 :(得分:1)

根据您描述的工作流程,您无需结帐master;你还在上面。

在您进行编辑并提交您的工作后,假设您有一个干净的工作目录(请与git status一起检查),您现在处于master分支的“提示”(HEAD)。 / p>

您仍然看到您的修改的原因是您有一个脏的工作目录;即你已经对被跟踪的文件(或已添加到索引或已提交)进行了更改。

如果您不想在master上工作,您只需要查看其他分支,这似乎是您所在的分支。