clo*_*ead 3496
你可以使用git add --patch <filename>(或-p简称),git将开始将你的文件分解为它认为合理的"帅哥"(文件的一部分).然后它会提示您这个问题:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
Run Code Online (Sandbox Code Playgroud)
以下是每个选项的说明:
如果文件尚未存储在存储库中,您可以先执行此操作git add -N <filename>.之后你可以继续git add -p <filename>.
之后,您可以使用:
git diff --staged 检查您是否进行了正确的更改git reset -p 不要错误地添加帅哥git commit -v 在编辑提交消息时查看提交.请注意,这与git format-patch命令有很大不同,命令的目的是将提交数据解析为.patch文件.
未来参考:Git工具 - 交互式分段
Ion*_*tan 138
git gui在diff视图下提供此功能.只需右键单击您感兴趣的行,您就会看到"暂存此行提交"菜单项.
the*_*ana 72
我相信这git add -e myfile是最简单的方法(至少我的偏好),因为它只是打开一个文本编辑器,让你选择你想要分段的那一行和你不选择哪一行.关于编辑命令:
添加内容:
添加的内容由以"+"开头的行表示.您可以通过删除它们来阻止暂存任何添加行.
删除内容:
删除的内容由以" - "开头的行表示.您可以通过将" - "转换为""(空格)来阻止转移它们.
修改内容:
修改后的内容由" - "行(删除旧内容)后跟"+"行(添加替换内容)表示.您可以通过将" - "行转换为""并删除"+"行来阻止暂存修改.请注意,仅修改对中的一半可能会对索引引入令人困惑的更改.
每个细节git add都可以在git --help add
小智 28
我强烈建议使用Atlassian的SourceTree.(它是免费的.)这使得这个微不足道.您可以快速轻松地分发各个代码或各行代码.

use*_*062 24
值得注意的是,要git add --patch用于新文件,您需要首先将文件添加到索引git add --intent-to-add:
git add -N file
git add -p file
Run Code Online (Sandbox Code Playgroud)
jds*_*ion 22
当我有很多更改,并最终会从更改中创建一些提交时,我想在暂存之前暂时保存我的起点.
像这样:
$ 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
Run Code Online (Sandbox Code Playgroud)
Whymarrh的答案就是我通常所做的,除非有时候会有很多变化,我可以告诉我在进行事情时可能会犯错误,我想要一个忠诚的状态,我可以再次使用.
San*_*eva 13
首先,我们可以看看有哪些变化。
git diff <file>
Run Code Online (Sandbox Code Playgroud)
如果它显示在不同的块中,我们可以使用
git add -p <file>
Run Code Online (Sandbox Code Playgroud)
通过接受或拒绝更改(y 或n)。
如果没有,我们仍然可以借助 VS Code 来完成
Hol*_*ndl 10
Intellij IDEA(我猜这个系列的所有其他产品)自v2018.1以来内置了对部分提交的支持
就像jdsumsion的回答一样,你也可以隐藏你当前的工作,但是然后使用像meld这样的difftool从存储中提取选定的更改.这样你甚至可以很容易地手动编辑帅哥,这在以下情况下会有点痛苦git add -p:
$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop
Run Code Online (Sandbox Code Playgroud)
在提交之前,使用stash方法可以让您有机会测试代码是否仍然有效.
对于那些使用Git Extensions的人:
在"提交"窗口中,选择要部分提交的文件,然后在右窗格中选择要提交的文本,然后右键单击选择并从上下文菜单中选择"显示所选行".
如果您使用的是 Visual Studio Code (VSCode),那么您很幸运。选择要暂存的范围,然后用于Git: Stage Selected Ranges暂存它们,并根据需要提交。
我录制了一个 gif 来演示我的意思:
vim-gitgutter插件可以在不离开vim编辑器的情况下使用
:GitGutterStageHunk
Run Code Online (Sandbox Code Playgroud)
除此之外,它还提供了其他很酷的功能,例如在一些现代IDE中的diff标志列
如果只有部分hunk应该上传vim-fugitive
:Gdiff
Run Code Online (Sandbox Code Playgroud)
允许视觉范围选择,:'<,'>diffput或者:'<,'>diffget分阶段/恢复单独的线条变化.
尝试了git add -p filename.x,但在Mac上,我发现gitx(http://gitx.frim.nl/或https://github.com/pieter/gitx)更容易提交我想要的行.
使用 TortoiseGit:
右键单击该文件并使用
Context Menu ? Restore after commit. 这将按原样创建文件的副本。然后您可以编辑文件,例如在 TortoiseGitMerge 中并撤消您不想提交的所有更改。保存这些更改后,您可以提交文件。
在上一个答案的基础上,如果您更喜欢使用命令行,请输入git add -e myfile来逐行选择要提交的内容,因为此命令将打开具有差异的编辑器,如下所示:
您可能知道以开头的行+是加法,以开头的行-是删除。所以:
-为space即可。这就是git add -h有关以这种方式添加文件(修补文件)的说明:
添加的内容 添加的内容由以“ +”开头的行表示。您可以通过删除它们来防止暂存任何附加行。
删除的内容: 删除的内容由以“-”开头的行表示。您可以通过将“-”转换为“”(空格)来防止分段删除它们。
修改后的内容: 修改后的内容由“-”行(删除旧内容)和“ +”行(添加替换内容)表示。您可以通过将“-”行转换为“”并删除“ +”行来防止进行修改。请注意,仅修改一对中的一半可能会给索引带来混乱的变化。
注意:请勿更改文件的内容,这不是一个好地方。只需更改已删除或已添加行的运算符。
问这个问题已经10年了。我希望这个答案对某人有用。正如这里的答案中提到的,在 GUI 不是一个选项的情况下,Andrew Shadura 的Crecord 扩展有助于带来一个 ncurses 窗口,我们可以在其中选择要提交的行。
设置扩展如下:
git clone https://github.com/andrewshadura/git-crecord
cd git-crecord
./setup.py install
ln -s $PWD/git-crecord ~/.local/bin/git-crecord
Run Code Online (Sandbox Code Playgroud)
cd 到您的 git repo 并按如下方式调用它:
git crecord
Run Code Online (Sandbox Code Playgroud)
这将打开 ncurses 界面,可以使用如下所示的界面。在 ncurses 窗口中按以下键将执行某些操作:
f hunk toggle fold (arrow keys can also be used)
space toggle hunk selection
a toggle commit or amend
c confirm and open commit window
Run Code Online (Sandbox Code Playgroud)
显示示例用法的截屏视频