当我运行git add -p
时,有没有办法让git选择新制作的文件作为难以选择?
因此,如果我创建一个名为foo.java
的新文件,然后运行git add -p,git将不允许我选择要添加到索引中的文件内容。
答案 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 --cached
” (man)应该能够使用“ git diff-files
”,并且应该等效于路径“ git add
” ,但该命令无法在这样的路径上执行此操作。
请见commit 4c025c6的commit e3cc41b,commit 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 -p
” (man)在记录了添加意图的情况下尝试从文件暂存块时失败。这更改了
check_to_create()
中的逻辑,该逻辑以两种方式检查索引中是否已存在条目:
- 首先,我们仅在
ok_if_exists
为假的情况下才搜索索引条目;- 第二,我们检查找到的所有索引条目上的
CE_INTENT_TO_ADD
标志,并在设置了索引后继续进行申请。
并且:
在Git 2.29(2020年第四季度)中,“ add -p
”现在允许编辑仅按意图添加的路径。
请参见commit 75a009d的Phillip 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 .
在一行中完成此操作
行为相同,但避免重复。