当我在 Git 中修改一个文件时,如何只提交其中的一部分更改?
例如,如果我在文件中修改了 30 行,我只想提交其中的 15 行,应该怎么办呢?
当我在 Git 中修改一个文件时,如何只提交其中的一部分更改?
例如,如果我在文件中修改了 30 行,我只想提交其中的 15 行,应该怎么办呢?
你可以使用:
git add --patch <filename>
或简称:
git add -p <filename>
Git会将您的文件分解为它认为合理的“块”(文件的部分)。然后,它会提示您这个问题:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
以下是每个选项的描述:
#
替换+
/-
来手动编辑hunk(感谢veksen)如果文件尚未在存储库中,您可以首先运行git add -N <filename>
。 然后,您可以继续运行git add -p <filename>
。
之后,您可以使用以下命令:
git diff --staged
检查您是否已准备好正确的更改git reset -p
取消暂存错误添加的hunkgit commit -v
在编辑提交消息时查看您的提交。请注意,这与git format-patch
命令大不相同,其目的是将提交数据解析为.patch
文件。
参考文献:Git 工具 - 交互式添加
git diff
命令一样。我会将其翻译为:文件已经暂存,只会显示未暂存的更改,与 git diff
命令相同。 - Eugen Konkove
后,您可以通过将 +
或 -
替换为 #
来手动编辑代码块。 - veksengit commit file
时,它提交了所有内容而不仅仅是我想要的特定更改(即使git diff --staged
只显示了我想要的特定更改)。编辑:使用git commit -p
可以选择“块”并一次性提交;而且它确实只提交了特定的更改。 - Rafagit add --interactive
或git add -p <文件>
,之后使用git commit
(而不是git commit -a
);请参阅git-add手册中的交互模式,或者按照指示操作。git commit --interactive
(以及git commit --patch
,这是交互式提交中补丁选项的快捷方式)。如果你只想添加块中的某些行,你也可以选择它们,然后右键单击:为提交暂存块
为提交暂存行
我个人认为这比使用git add -i
更容易。其他像QGit或GitX这样的git GUI也可能具有此功能。
git gui 在差异视图下提供了此功能。只需右键单击您感兴趣的行,就会看到一个“将此行暂存以进行提交”菜单项。
gitk
,但它包含在Git Bash for Windows中;你应该有一个开始菜单项或可以使用命令git gui
启动它。还有一个名为“stage this hunk”的选项,可能比“stage this line”更有用。自从10年前创建了此答案后,可能已经更新过了。 - Chris我认为git add -e myfile
是最简单的方法(至少是我偏爱的方法),因为它只是打开一个文本编辑器,让您选择要暂存的行和不想暂存的行。
关于编辑命令:
添加内容:
添加的内容以“+”开头的行表示。您可以通过删除这些行来防止将任何添加行暂存。
删除内容:
删除的内容以“-”开头的行表示。您可以将“-”转换为空格,以防止暂存其删除。
修改内容:
修改的内容由“-”行(删除旧内容)和“+”行(添加替换内容)组成。您可以通过将“-”行转换为空格并删除“+”行来防止暂存修改。请注意,仅修改其中一半很可能会向索引中引入混乱的更改。
有关git add
的所有详细信息都可以在git --help add
上找到。
-e
相当于 --edit
。 - Kolyunyagit --help add
中的“编辑补丁”部分。 - Randalls
使块变小,从而添加/删除每行的问题。 - cdosborngit add -e
)并不会改变磁盘上的文件内容,它只是将部分更改从未暂存的状态转移到了已暂存的状态(索引)。 - Penghe Geng值得注意的是,如果要对新文件使用git add --patch
命令,您需要先使用git add --intent-to-add
将其添加到索引中:
git add -N file
git add -p file
我强烈建议使用Atlassian的SourceTree。(它是免费的。) 它使得这个琐碎的工作变得容易。你可以快速轻松地分阶段提交单独的代码块或单独的代码行。
当我有很多更改,并且最终要从这些更改中创建一些提交时,我希望在暂存这些更改之前临时保存我的起点。
像这样:
$ git stash -u
Saved working directory and index state WIP on master: 47a1413 ...
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 1st commit"
$ git checkout -p stash
... step through patch hunks
$ git commit -m "message for 2nd commit"
$ git stash pop
Whymarrh的回答是我通常所做的,但有时候有很多变化,我可以感觉到在暂存事物时可能会犯错,因此我希望有一个已提交的状态,以便我可以进行第二次尝试。
在之前的回答基础上,如果您更喜欢使用命令行,输入 git add -e myfile
将会让您可以逐行选择要提交的内容,因为这个命令会打开一个编辑器显示差异,如下所示:
您可能已经知道以 +
开头的行是添加的,以 -
开头的行是删除的。所以:
-
替换为空格
。关于这种方式(补丁文件)添加文件,git add -h
上有这样的说明:
添加的内容 添加的内容以“+”开头的行表示。您可以通过删除它们来防止暂存任何添加的行。
删除的内容: 删除的内容以“-”开头的行表示。您可以通过将“-”转换为“ ”(空格)来防止暂存它们的删除。
修改的内容: 修改的内容以“-”行(删除旧内容)后面跟着“+”行(添加替换内容)表示。您可以通过将“-”行转换为“ ”来防止暂存修改
注意:不要更改文件的内容,这不是更改文件内容的好地方。只需更改已删除或添加行的运算符即可。同时要注意删除“-”行并移除“+”行会导致索引混乱。
git gui
=git add -e
>git add -i -p
;就方便性而言:git gui
>git add -i -p
>git add -e
。因此:当您可以访问X时,请选择git gui
。对于简单的东西和当您没有或不想使用X时,请选择git add -i -p
。对于复杂的暂存操作而无需X,请选择git add -e
。 - Penghe Geng