结帐后Git丢弃了未提交的更改

时间:2015-07-07 10:40:43

标签: git git-commit git-checkout git-revert

据我所知git checkout我们不允许我们签出分支,直到我们提交所有先前的更改,但我的更改已被丢弃。

我执行了git status命令,它显示了修改过的文件列表。 然后我执行了git checkout .(点)命令,但它没有提示我先提交我之前的更改并放弃所有更改并检查我本地计算机上的master分支。

有人可以指导我为什么git checkout .以这种方式行事? 以及如何在本地计算机上移回我以前的代码(使用修改和未提交的更改)?为什么要放弃我的更改?

2 个答案:

答案 0 :(得分:5)

不幸的是,git checkout是一个具有几个非常不同含义的命令,这导致了您的问题:通过结帐,您可以切换分支,创建分支,使用特定版本或HEAD更新工作目录文件分支。

执行:git checkout <branchname>时,您要求git 切换分支,因此如果您有可以删除,存储或提交的未提交更改,它会发出警告。

执行:git checkout <pathname>时,您要求git 使用版本更新文件,因此您要求git使用存储库中已有的内容覆盖可能的修改;这就是git所做的。

希望它会有所帮助。对不起您的遗弃变更。这就是UI的简单性很重要的地方。

答案 1 :(得分:0)

以下是更多信息,以补充Christophe的答案并帮助理解git checkout的作用:

git-checkout - 签出一个或多个工作树的路径

分支

git checkout <branch>用于通过更新工作树中的索引和文件,并将HEAD指向指定的分支来切换分支。

保留对工作树中文件的任何更改,以便以后可以将它们提交到<branch>

pathspec

git checkout <pathspec>更新处理索引(临时区域)版本的文件而不是其他分支。

从手册页:

git checkout [-p|--patch] [<tree-ish>] [--] <pathspec>...
  

提供<paths>--patch时,git checkout不会切换   分支机构。它从索引更新工作树中的命名路径   文件或来自命名的<tree-ish>(通常是提交)。

如果使用git add将文件更改添加到索引(也称为暂存区域),则git checkout .不会丢失其更改,因为此命令使用index中存储的更改1}}更新指定的路径。

如果您所做的更改是偶然的,例如,如果您删除了工作目录中的目录,然后意识到您确实需要保留它,那么运行git checkout <dirname>会恢复所有(跟踪) )索引中该目录中的文件。

很遗憾,当用户通过不可逆转地丢弃任何更改来更新文件和目录时,它不会警告用户。