Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么git签出文件的行为类似于先重置暂存文件,然后签出未暂存文件?_Git_Git Checkout_Git Stage_Git Index - Fatal编程技术网

为什么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

我在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 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