为什么git签出文件的行为类似于先重置暂存文件,然后签出未暂存文件?
我在git文档中遇到过这样一种说法:为什么git签出文件的行为类似于先重置暂存文件,然后签出未暂存文件?,git,git-checkout,git-stage,git-index,Git,Git Checkout,Git Stage,Git Index,我在git文档中遇到过这样一种说法: Checking out a file is similar to using git reset with a file path, except it updates the working directory instead of the stage 链接: 部分:“Git签出文件” 现在假设我有一个repo和一个文件test.txt 首先,工作目录是干净的: On branch master nothing to commit, working t
Checking out a file is similar to using git reset with a file path, except it updates the working directory instead of the stage
链接:
部分:“Git签出文件”
现在假设我有一个repo和一个文件test.txt
首先,工作目录是干净的:
On branch master
nothing to commit, working tree clean
现在我修改test.txt
,运行git add
,git status
现在显示:
On branch master
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: test.txt
git状态的输出
:
On branch master
nothing to commit, working tree clean
根据文档,索引中的test.txt
版本应保持不变,工作目录中的版本应更改回其头部所指提交中的版本,导致工作目录和索引之间的文件版本不同-->在这种情况下,git status
不应该输出什么吗?但是git status
没有显示这一点-为什么
通常,要从暂存文件到清理工作树,我必须对该文件使用git reset HEAD
,然后使用git checkout HEAD
,但在这里它似乎同时执行这两个操作
我很困惑
编辑-另一个有趣的是,如果在暂存文件test.txt
后,我运行git checkout test.txt
而不是git checkout HEAD test.txt
我会得到:
Updated 0 paths from the index
即使这两种形式在前者默认为HEAD
的情况下应该是等效的(?)
我再次感到困惑首先,这不是官方文件,在我看来,Atlassian对两个命令之间的比较非常肤浅。 有时,就像这次一样,同一个git命令根据您使用的选项执行非常不同的操作。这样你就可以找到深入主题的好答案 为了回答您的问题,以下是官方文件所述: 覆盖与pathspec匹配的文件的内容。当
(通常是提交)未给出,覆盖工作树
包含索引中的内容。当给出
时,
将索引和工作树都覆盖为
在第二种情况下,给出了
(HEAD
),这是预期的行为:索引和工作目录都被旧版本的test.txt
覆盖
相反,如果您使用的是git checkout test.txt
,并且test.txt
已经被暂存,那么工作目录或索引都不会改变,因为您基本上是用索引版本替换工作目录版本,但显然是相同的
Atlassian文章想说的是:
主要在工作目录上操作(如果提供了git checkout
,索引上也会操作)
仅对索引进行操作git reset
产生误解的原因是,在
git reset
中,
默认为HEAD
。相反,git checkout
在指定或不指定
时表现不同。首先,这不是官方文档,在我看来,Atlassian对两个命令之间的比较非常肤浅。
有时,就像这次一样,同一个git命令根据您使用的选项执行非常不同的操作。这样你就可以找到深入主题的好答案
为了回答您的问题,以下是官方文件所述:
覆盖与pathspec匹配的文件的内容。当
(通常是提交)未给出,覆盖工作树
包含索引中的内容。当给出
时,
将索引和工作树都覆盖为
在第二种情况下,给出了
(HEAD
),这是预期的行为:索引和工作目录都被旧版本的test.txt
覆盖
相反,如果您使用的是git checkout test.txt
,并且test.txt
已经被暂存,那么工作目录或索引都不会改变,因为您基本上是用索引版本替换工作目录版本,但显然是相同的
Atlassian文章想说的是:
主要在工作目录上操作(如果提供了git checkout
,索引上也会操作)
仅对索引进行操作git reset
产生误解的原因是,在
git reset
中,
默认为HEAD
。相反,git checkout
在指定或不指定
时表现不同。答案非常清楚。非常感谢。答案很清楚。非常感谢。
Updated 0 paths from the index