“git rm”的意外行为

Max*_*ann 1 git

给定一个 Git 存储库和一个提交的文件a

我使用 O/S 命令删除文件: $ rm a

调用git status返回:

On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        deleted:    a

no changes added to commit (use "git add" and/or "git commit -a")
Run Code Online (Sandbox Code Playgroud)

接下来,我调用git rm其次是git status哪个产生:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        deleted:    a
Run Code Online (Sandbox Code Playgroud)

Git 的手册页对命令的描述git rm

从索引或从工作树和索引中删除文件。

根据我的理解,上述命令序列中发生的事情是git rm 删除文件的更改放入暂存区(我与index同义使用),而不是从中删除某些内容。

我在这里有什么误解?

pok*_*oke 5

什么git rm更改添加到索引以从工作目录中删除文件。因此,您正在暂存文件的删除。这听起来可能有点奇怪,但这是您能想到的最清晰的方式。

提交包含更改,即您之前暂存的更改。通常的更改包括新文件和文件更改,还包括文件删除。因此,删除文件被视为更改,通过调用git rm更改添加到索引中。

这是顺便说一句。为什么你可以使用的东西,喜欢它的原因git add -u,以增加所有未决的改变,也有删除的文件包括:文件去除挂起的更改,所以当你它,你所添加的变化,以删除该文件。


此外,git rm它还从工作目录中物理删除文件。因此,如果您没有rm先使用删除文件,Git 也会将其从工作目录中删除。如果文件已经被删除,那么 Git 只会暂存删除​​更改。与此相关的是git rm --cached这也将暂存文件的删除,但不会从工作目录中物理删除文件。因此,这只会暂存更改以删除文件(尽管该更改尚未实际执行)。

  • 哇。你们有教科书吗? (2认同)
  • 这*不是*考虑`git rm`功能的最清晰方式,因为它错误地将索引视为更改列表。该指数不是增量。两者都不是提交。这两个都是常见的误解。 (2认同)