1

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

注意:签出“1d739”。

您处于“分离 HEAD”状态。您可以环顾四周,进行实验性更改并提交它们,并且您可以放弃在此状态下所做的任何提交,而不会通过执行另一个签出来影响任何分支。ETC

当我查看文件时,我看到print "1";我添加的仍然存在!
现在在这个结帐版本中,我在文件中附加了另一行:print "2";并保存文件。

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

4

3 回答 3

1

当您签出不同的分支或提交时,会保留本地未提交的更改。引用手册页

git checkout <提交>

准备在 <commit> 之上工作,方法是在其上分离 HEAD(参见“DETACHED HEAD”部分),并更新工作树中的索引和文件。保留对工作树中文件的本地修改,因此生成的工作树将是提交中记录的状态加上本地修改

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

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

于 2013-05-20T12:03:50.103 回答
1

Git 可以防止您丢失所做的更改。如果您想签出另一个分支,您应该先提交或存储您的更改。如果您想丢弃您的更改,您可以使用git reset --hard.

于 2013-05-20T12:06:06.007 回答
1

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

在您进行编辑并提交您的工作后,假设您有一个干净的工作目录(用 勾选git status),您现在位于master分支的“尖端”(HEAD)。

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

如果您不想在 上进行工作,您只需要签出不同的分支master,这似乎是您所在的分支。

于 2013-05-20T18:17:56.073 回答