Git在切换分支后丢弃了未提交的更改。

3
据我所知,git checkout 不允许我们在提交之前切换到其他分支,但是我的更改已经被舍弃了。
我执行了 git status 命令,它显示了我修改过的文件列表。然后我执行了 git checkout .(点)命令,但它没有提示我先提交以前的更改,而是舍弃了所有更改并检出了本地机器上的主分支。
请问有人能指导我为什么 git checkout . 会这样行事吗?如何回退到我在本地机器上的以前代码(包括已修改但未提交的更改)?为什么它舍弃了我的更改?
2个回答

6
很不幸,git checkout是一个有多种不同含义的命令,这导致了你的问题:使用checkout可以切换分支、创建分支、使用特定版本或分支的HEAD更新工作目录文件。

当你执行:git checkout <branchname>时,你要求git 切换分支,所以它会警告你是否有未提交的更改,你可以删除、存储或提交。

当你执行:git checkout <pathname>时,你要求git用一个版本更新你的文件,所以你要求git覆盖可能的修改,以使用存储在仓库中的内容;这就是git所做的。

希望对你有所帮助。对于你被丢弃的更改我很抱歉。这就是UI简单性的重要性所在。

谢谢您的快速回复。但是我只使用了 git checkout .,这意味着我没有像您在这里指定的那样指定任何路径 git checkout <pathname>。那么它会更新我的文件到哪个版本? - Bilal Ahmed Yaseen
2
“.” 是一个路径名;它指的是当前目录。顺便说一句,回答得很好。 - Anthony Geoghegan
所以,使用 . 将覆盖我的代码,并且不会提示我放弃所有本地更改而使用服务器上的代码?GIT 做得好。 - Bilal Ahmed Yaseen
请问Linus Torvalds :),在checkout中您需要明确指定路径(文件/文件夹,甚至是.),那么为什么git需要提示警告呢?最佳实践是使用checkout HEAD并不提供任何路径。 - Nghia Bui

0

这里有更多的信息来补充Christophe的答案,帮助理解git checkout的作用:

git-checkout - 检出分支或路径到工作树

分支

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

工作树中文件的任何更改都会被保留,以便稍后提交到<branch>

路径规范

git checkout <pathspec> 使用索引(暂存区)中的版本更新工作树中的文件,而不是从另一个分支中获取。

来自man页面:

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

当使用<paths>--patch参数时,git checkout不会切换分支。它会将工作树中的已命名路径从索引文件或已命名的<tree-ish>(通常为提交)更新。
如果使用git add将文件更改添加到了索引(也称为暂存区),则这些更改不会被git checkout .覆盖,因为该命令使用索引中存储的更改来更新指定的路径。

如果您的更改是意外的,例如,如果您在工作目录中删除了一个目录,然后意识到您真的需要保留它,运行git checkout <dirname>将从索引中恢复该目录中的所有(已跟踪)文件。

遗憾的是,它不会在更新文件和目录更改时警告用户,并且会不可逆地丢弃任何更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接