没有给出`<tree-ish>`时,`git checkout [<tree-ish>] [-] <pathspec>`有什么作用?

时间:2019-01-24 14:43:46

标签: git

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

谢谢。

2 个答案:

答案 0 :(得分:2)

不。如联机帮助页所述,它“通过替换索引中的内容 中的工作树中的路径”。 (强调我。)

因此它使用索引内容。如果(且仅当)您尚未暂存该文件的更改时,它们将与HEAD相同。否则,将是分阶段的更改。

因此,当您修改(并添加文件)后,git checkout --将签出分阶段的更改

答案 1 :(得分:2)

首先,我们检查索引

的定义
  

“索引”保存工作树内容的快照,并且   该快照被用作下一次提交的内容。

使用git add时,索引将被更新

回到您的问题, 手册页上说

  

通过替换内容中的内容覆盖工作树中的路径   中的索引或(通常是一次提交)

所以,当你这样做

<tree-ish>

分支文件将还原到索引(上次添加)

如果您这样添加git checkout -- branchfile # or: git checkout branchfile

<tree-ish>

它将还原到提交 HEAD (您的最后一次提交)