'git add --patch'包括新文件?


104

当我运行时git add -p,git有没有办法选择新创建的文件作为选择的文件?

因此,如果我创建一个名为的新文件foo.java,然后运行git add -p,则git不会让我选择要添加到索引中的文件内容。

Answers:


77

要对每个新文件执行此操作,可以运行:

git add -N .
git add -p

如果您想经常使用它,可以在您的中创建一个别名~/.bashrc

alias gapan='git add --intent-to-add . && git add --patch'

注意:如果将此文件与一个空的新文件一起使用,则git将无法对其进行修补并跳至下一个文件。


13
对于任何想知道该怎么git add -N做的人,它只会将指定的未跟踪文件添加到索引中,但是没有内容。
奥丁,

112

当我尝试git add -p someNewFile.txt一个新文件(一个未跟踪的文件)时,git只会输出No changes.并停止。我必须告诉git我打算先跟踪新文件。

git add -N someNewFile.txt
git add -p

但是,由于该文件未跟踪,因此将显示为一个无法拆分的巨型块(因为它是全新的!)。所以,然后我需要将大块编辑成更小的位。如果您不熟悉,请查阅此参考资料以开始使用。

更新-大块编辑信息 ,如果以上参考消失了,我想更新此信息由于未跟踪新文件,因此git add -p会将文件中的每一行显示为一个新行。然后它将询问您要如何处理该块,并显示以下提示:

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

假设您不想提交整个块​​(因此,也不想提交整个文件;因为我不确定为什么要git add -p在这种情况下使用?),您将想要指定选项e来告诉git您要编辑大块头。

一旦告诉git您想要编辑块,它就会把您放到您选择的编辑器中,以便您进行更改。所有行应以a为前缀,+并且git #在文件末尾带有一些解释性注释(以a 开头)。只需删除文件初始提交中不需要的任何行。然后保存并退出编辑器。

Git对git的大块选项的解释:

y - stage this hunk
n - do not stage this hunk
q - quit; do not stage this hunk or any of the remaining ones
a - stage this hunk and all later hunks in the file
d - do not stage this hunk or any of the later hunks in the file
g - select a hunk to go to
/ - search for a hunk matching the given regex
j - leave this hunk undecided, see next undecided hunk
J - leave this hunk undecided, see next hunk
k - leave this hunk undecided, see previous undecided hunk
K - leave this hunk undecided, see previous hunk
s - split the current hunk into smaller hunks
e - manually edit the current hunk
? - print help

1
请有人总结一下。
伊南克·古姆斯

5
总之,git add -N someNewFile.txt其次是git add -p
CatShoes

7

git add -p 实际上是关于对已跟踪的文件添加更改。

以交互方式选择要添加的文件的命令是git add -i。例如:

$ git add -i

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> a
  1: another-new.java
  2: new.java
Add untracked>> 2
  1: another-new.java
* 2: new.java
Add untracked>> 
added one path

*** Commands ***
  1: status   2: update   3: revert   4: add untracked
  5: patch    6: diff     7: quit     8: help
What now> q
Bye.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        new file:   new.java

Untracked files:
  (use "git add <file>..." to include in what will be committed)

        another-new.java

(真正的命令具有我无法在此处剪切和粘贴的颜色,因此它比看起来更好)

实际上,p的ATCH命令git add -i不一样git add -p,所以第二个是第一个的子集(尽管我承认我爱add -p和恨add -i我自己!)。


“我承认我喜欢自己添加-p而讨厌自己添加-i!” 这就是为什么git add then patch是我喜欢的解决方案的原因:它仍然允许您检查要添加的新文件的内容(因为您将它们与空版本进行了比较)以及已编辑的补丁文件!
Ulysse BN

如果我错了,请纠正我,但是即使在交互模式下,补丁仍会No changes.在新文件上输出。OP正在询问如何从新文件而不是整个文件中添加块。我相信--intent-to-add这里仍然是必需的。
杰夫·普基特

add -p仅此一项是行不通的,但是此答案表明add -i可以。
Matthieu Moy

我不满意,因为我对此一无所知git add -i。但是,您可以与进行非交互操作git add -N
疯狂物理学家,

4

还有一种非常类似的方法利用--cached标志...

1)像添加文件一样,将未暂存的更改变为暂存的。

git add edited-file.txt
git add new-file.txt
git add directory-of-changes/

2)查看差异(注意:您可以同时包含编辑和新文件)。

git diff --cached

3)创建补丁。

git diff --cached > my_patch_file.patch

不幸的是,这不会实现相同的目的。我喜欢的git add -p是它不会添加所有内容,但让我选择要添加的内容。此解决方案会盲目添加所有内容。
亚历山大·伯德

好吧,您可以选择添加的内容!我将更新答案。
doublejosh

1
谢谢:所有的东西:这对我来说很有效
macool
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.