【问题标题】:Git discarded uncommitted changes after checkoutGit 在结帐后丢弃未提交的更改
【发布时间】:2015-09-24 19:22:54
【问题描述】:

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

我执行了git status 命令,它显示了修改文件的列表。 然后我执行了git checkout . (dot) 命令,但它没有提示我首先提交我之前的更改并丢弃我的所有更改并在我的本地机器上签出 master 分支。

谁能指导我为什么git checkout .会这样? 以及如何在本地机器上回到我以前的代码(修改和未提交的更改)?为什么它放弃了我的更改?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    希望它会有所帮助。对于您放弃的更改,我们深表歉意。这就是 UI 的简单性很重要的地方。

    【讨论】:

    • 感谢您的快速回复。但我只使用了git checkout . 意味着我没有指定您在此处指定的任何路径git checkout <pathname>。那么它将使用哪个版本更新我的文件?
    • . 是一个路径名;它指的是当前目录。很好的答案,顺便说一句。
    • 那么,使用.,它会通过丢弃我的所有本地更改而在服务器上用一个代码覆盖我的代码,而无需任何提示?干得好 GIT
    • 请询问 Linus Torvarld :) 在结帐时您明确指定了路径(文件/文件夹,甚至 .)那么为什么 git 需要提示警告?最佳做法是使用结帐 HEAD 并且不提供任何路径。
    【解决方案2】:

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

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

    分支

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

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

    路径规范

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

    来自手册页:

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

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

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


    如果您所做的更改是意外的,此命令会很有帮助,例如,如果您删除了工作目录中的一个目录,然后意识到您确实需要保留它,运行 git checkout &lt;dirname&gt; 将恢复所有(跟踪的)文件从索引中的那个目录中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      • 2011-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 2012-03-16
      相关资源
      最近更新 更多