为什么git checkout行为不一致?

时间:2011-07-12 22:11:56

标签: git

如果我删除工作目录的整个内容,然后尝试使用git checkout将其恢复。我收到了两种不同的行为,具体取决于我提供的命令行参数:

git checkout master

我只收到所有已删除文件和目录的列表,但没有任何真正签出。

但是当我这样做时:

git checkout <directory 1 in master>
git checkout <directory 2 in master>
git checkout <directory 3 in master>
git checkout <directory 4 in master>
git checkout <directory 5 in master>
git checkout <directory 6 in master>
git checkout <directory 7 in master>

只有这样,git才能恢复缺失的东西。

为什么?

为什么“结帐”在git中有两个含义?

3 个答案:

答案 0 :(得分:6)

它没有,但是你给它两个不同的命令:

git checkout <branch>

git checkout <directory>

当你做第二个时,git假设默认分支(在你的情况下它看起来像是“master”),当你做第一个时,它不会结账,因为有本地更改(你消灭的所有文件) )在更改之前需要提交给该分支。

如果您想查看所有内容(并删除本地更改),您可以执行以下操作:

git checkout -f

迫使结账。

希望这有帮助

答案 1 :(得分:1)

恢复缺失的更快捷方法是执行git reset --hard

git checkout不会覆盖你在工作树中所做的更改,除非你告诉它。

如果你给它一个路径,你告诉它更新那条路径上的工作树。

如果你没有给它一个路径,你告诉它将索引更改为指定的分支而根本不更新工作树。它假定所有丢失的文件都是您对工作树所做的更改,您可能希望在索引中进行更改然后提交。

答案 2 :(得分:1)

来自manual page of git-checkout

  

更新工作树中的文件以匹配索引或指定树中的版本。如果没有给出路径,git checkout也会更新HEAD以将指定的分支设置为当前分支。

     

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