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

时间:2013-01-24 00:09:49

标签: git shell git-add

当我运行git add -p时,有没有办法让git选择新制作的文件作为难以选择?

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

6 个答案:

答案 0 :(得分:100)

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

git add -N someNewFile.txt
git add -p

然而,由于该文件未被跟踪,它将显示为一个无法拆分的巨型大块(因为它全新!)。那么,我需要将hunk编辑成更小的位。如果您对此不熟悉,请结帐this reference以开始使用。

更新 - Hunk编辑信息 我希望在以上引用消失的情况下更新此内容。由于新文件未跟踪,git add -p会将文件中的每一行显示为一个大块中的新行。然后它将询问您对该块的想法,并给出以下提示:

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

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

一旦你告诉git你想要编辑hunk,它应该让你进入你选择的编辑器,这样你就可以进行更改。所有行都应以+为前缀,git在文件末尾有一些解释性注释(前缀为#)。只需删除初始提交文件时不需要的任何行。然后保存并退出编辑器。

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 :(得分:40)

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

git add -N .
git add -p

如果您想经常使用它,可以在~/.bashrc

中创建别名
alias gapan='git add --intent-to-add . && git add --patch'

N.B :如果你使用一个空的新文件,git将无法修补它并跳到下一个。

答案 2 :(得分:4)

Catshoes的答案包括:

当我在新文件(未跟踪的文件)上尝试git add -p someNewFile.txt时,git只会输出无变化。停下来
我不得不告诉git我打算先跟踪新文件。

git add -N someNewFile.txt
git add -p

随着Git 2.29(2020年第四季度)的出现,这种情况很快就会改变。

git diff-files”的最新版本man将“意图添加”路径的索引和工作树之间的差异显示为“新文件”补丁;
git apply --cachedman应该能够使用“ git diff-files”,并且应该等效于路径“ git add” ,但该命令无法在这样的路径上执行此操作。

请见commit 4c025c6commit e3cc41bcommit 7cfde3f(2020年8月8日)和Raymond E. Pasco (juped)(2020年8月6日)。
(由Junio C Hamano -- gitster --commit ca81676中合并,2020年8月17日)

apply:在i-t-a条目上允许“新文件”补丁

帮助者:Junio C Hamano
签名人:Raymond E. Pasco

diff-files最近进行了更改,将对索引中标记为“打算添加”的路径的更改视为新文件差异,而不是来自空blob的差异。

但是,apply拒绝在现有索引条目的顶部应用新文件差异,除非是重命名。
这会导致使用“ apply”的“ git add -pman在记录了添加意图的情况下尝试从文件暂存块时失败。

这更改了check_to_create()中的逻辑,该逻辑以两种方式检查索引中是否已存在条目:

  • 首先,我们仅在ok_if_exists为假的情况下才搜索索引条目;
  • 第二,我们检查找到的所有索引条目上的CE_INTENT_TO_ADD标志,并在设置了索引后继续进行申请。

并且:

在Git 2.29(2020年第四季度)中,“ add -p”现在允许编辑仅按意图添加的路径。

请参见commit 75a009dPhillip Wood (phillipwood)(2020年9月9日)。
(由Junio C Hamano -- gitster --commit 458205f中合并,2020年9月22日)

add -p:修复了要添加意图的路径

签名人:Phillip Wood
报告人:托马斯·沙利文
报道人:Yuchen Ying

部分暂存新文件的一种流行方法是运行git add -N <path> man,然后使用git add -p man选择用户希望暂存的文件部分。

85953a3187起(“差异文件--raw:显示意图添加文件的正确后映像”,2020年7月1日,Git v2.28.0-rc0-{{3} } merge中列出的位置)已停止工作,因为意图添加路径现在显示为新文件,而不是更改为空的blob和batch #7 git apply)< / sup>拒绝为标记为要添加的路径应用创建补丁。 man(“应用:在i-t-a条目上允许“新文件”补丁”,2020-08-06)解决了应用问题,但仍然无法正确编辑添加的块。

7cfde3fa0f(“ checkout -p:正确处理新文件”,2020-05-27,2c8bd8471a中列出的Git v2.28.0-rc0-merge)先前将add -p更改为可处理新文件,但未正确实施补丁编辑。
Perl版本只是禁止编辑,而C版本则使用完整的diff而不是仅打开块来打开编辑器,这意味着用户必须手动编辑块头才能使其正常工作。

问题的根本原因是,添加的文件将diff头文件与大块数据一起存储,而不是像其他更改那样将两者分开。更改添加的文件以分别存储diff头可解决编辑问题,但必须以特殊情况下的空添加为代价,因为它们不再具有与它们关联的任何块,而仅是diff头。

所做的更改将一些现有代码移入有条件的更改缩进中,最好使用--color-moved-ws=allow-indentation-change(或--ignore-space-change可以很好地了解更改概述)

答案 3 :(得分:3)

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

(真正的命令有颜色,我不能在这里剪切和粘贴,所以它看起来比它看起来更好)

实际上,git add -i p atch命令与git add -p的命令相同,所以第二个是第一个的子集(即使我承认我喜欢add -p 1}}并且自己讨厌add -i!)。

答案 4 :(得分:2)

使用--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

答案 5 :(得分:-1)

您可以使用 git add --intent-to-add -p . 在一行中完成此操作 行为相同,但避免重复。