我创建了一个新的存储库并提交了一个文件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";
。
这真令人困惑。我现在不应该看到最新的提交吗?这些修改都应该丢失吗?
答案 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
上工作,您只需要查看其他分支,这似乎是您所在的分支。