我创建了一个新文件 foo.rb
。
$ git add -p foo.rb
$ 没有更改。
然而,不使用 -p
的添加有效。这是一个错误还是一个特性?我希望它能让我暂存文件的部分内容。
我创建了一个新文件 foo.rb
。
$ git add -p foo.rb
$ 没有更改。
然而,不使用 -p
的添加有效。这是一个错误还是一个特性?我希望它能让我暂存文件的部分内容。
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
时,该文件已知,并提供了一个真正的补丁。
-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
如何工作?提问者已经知道它如何工作,但是对如何将一个新的、之前未被暂存的文件与其一起使用感兴趣。 - pokes
(split)) - axelduch您正在执行的操作是添加新文件,唯一的撤销操作是删除整个文件,因为-p
允许您应用部分暂存,所以在您的情况下无法这样做。
请记住,提交是对文件(或一组文件,每个文件1个操作)的单个操作,您的操作将意味着执行添加+修改的操作。
git add foo.rb
然后又执行了git reset -p foo.rb
,会发生什么?我猜测这是因为该文件之前从未被跟踪过,所以无法取消暂存一个不能被修改的东西,因为它实际上还没有被添加。 - axelduch