git checkout
的手册页上说
git checkout [<tree-ish>] [--] <pathspec>…
通过替换其中的内容来覆盖工作树中的路径 索引或
<tree-ish>
中的索引(通常是一次提交)。 当<tree-ish>
已给出,与匹配的路径已更新 在索引和工作树中。
如果没有给出<tree-ish>
会发生什么? <tree-ish>
默认为HEAD
吗?
我在存储库中有一个文件:
$ git status
On branch abcd
nothing to commit, working tree clean
$ cat branchfile
feature2
hello
我修改了文件
$ echo abcd > branchfile
$ cat branchfile
abcd
$ git add branchfile
git checkout -- branchfile
为什么不覆盖已修改的文件:
$ git checkout -- branchfile
$ cat branchfile
abcd
$ git status
On branch abcd
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: branchfile
git checkout HEAD -- branchfile
呢?
$ git checkout HEAD -- branchfile
$ cat branchfile
feature2
hello
$ git status
On branch abcd
nothing to commit, working tree clean
谢谢。
答案 0 :(得分:2)
不。如联机帮助页所述,它“通过替换索引中的内容 或
因此它使用索引内容。如果(且仅当)您尚未暂存该文件的更改时,它们将与HEAD相同。否则,将是分阶段的更改。
因此,当您修改(并添加文件)后,git checkout --
将签出分阶段的更改。
答案 1 :(得分:2)
首先,我们检查索引
的定义“索引”保存工作树内容的快照,并且 该快照被用作下一次提交的内容。
使用git add
时,索引将被更新
回到您的问题, 手册页上说
通过替换内容中的内容覆盖工作树中的路径 中的索引或(通常是一次提交)
所以,当你这样做
<tree-ish>
分支文件将还原到索引(上次添加)
如果您这样添加git checkout -- branchfile # or: git checkout branchfile
<tree-ish>
它将还原到提交 HEAD (您的最后一次提交)