为什么 `git add -p` 命令不能将未跟踪的文件添加到暂存区?

3

我创建了一个新文件 foo.rb

$ git add -p foo.rb

$ 没有更改。

然而,不使用 -p 的添加有效。这是一个错误还是一个特性?我希望它能让我暂存文件的部分内容。


如果你执行了 git add foo.rb 然后又执行了 git reset -p foo.rb,会发生什么?我猜测这是因为该文件之前从未被跟踪过,所以无法取消暂存一个不能被修改的东西,因为它实际上还没有被添加。 - axelduch
3个回答

6

git add --patch的文档描述如下:

它实际上运行的是 add --interactive 命令,但它跳过了初始命令菜单,直接进入补丁子命令。

git add --interactive 仅添加已修改的更改,如下所述:

交互式地将工作树中已修改的内容添加到索引中。

所以这种行为是有意设计的。

使用补丁方式添加新文件也没有太多意义,因为整个文件添加只是一个单独的块,它可以被提交或不提交(或者您需要手动编辑补丁)。所以要么是 git add foo.rb 要么不用添加。

您可以使用 git add --intent-to-add file 或缩写形式 git add -N file 来添加空文件。这会将一个文件名为空的文件进行暂存,因此下次运行 git add -p 时,该文件已知,并提供了一个真正的补丁。


1

-p--patch命令可以比较暂存区和工作树,并让您有可能只暂存文件的部分内容而不是整个文件。如果您想将文件更改拆分为单独的提交,而不是一个大的提交,则此交互式命令特别有用。但是,如果您的文件未被跟踪,则这没有意义,因为它尚未成为您的工作树的一部分。因此不会有任何更改。 add是一个多功能命令。如果您在文件成为工作树的一部分之前使用git add命令,则它将按预期工作。

在使用git add命令后,运行git add -p实际上会显示diff并给您几个选项进行操作。

Stage this hunk [y,n,q,a,d,/,e,?]?

以下是这些选项的man页面的一小部分摘录。

  • y - 暂存此块
  • n - 不暂存此块

为什么要解释 git add -p 如何工作?提问者已经知道它如何工作,但是对如何将一个新的、之前未被暂存的文件与其一起使用感兴趣。 - poke
我以为如果他知道 git add -p 如何工作,他就不需要问这个问题了。你甚至引用了文档。 - oshell
@poke请注意,修改后的文件中可用的选项比添加的文件中更多。(@see s (split)) - axelduch
@aduch Split 只会将可以拆分的块进行拆分。如果是一个连续的更改,则无法拆分。 - poke
@poke 同意,但我假设在文件添加过程中不会发生这种情况,如果我错了,请指出。 - axelduch
如我在回答中所解释的那样,您不能简单地进行补丁添加以添加新文件,如果这样做,您只有一个单独的块。 - poke

0

您正在执行的操作是添加新文件,唯一的撤销操作是删除整个文件,因为-p允许您应用部分暂存,所以在您的情况下无法这样做。

请记住,提交是对文件(或一组文件,每个文件1个操作)的单个操作,您的操作将意味着执行添加+修改的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接