当我在Git中更改文件时,如何只提交一些更改?
例如,我怎样才能在文件中更改的30行中只提交15行?
当我在Git中更改文件时,如何只提交一些更改?
例如,我怎样才能在文件中更改的30行中只提交15行?
您可以使用 git add --patch <filename>
(要么 -p
简而言之,git将开始将你的文件分解为它认为合理的“帅哥”(文件的一部分)。然后它会提示您这个问题:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
以下是每个选项的说明:
如果文件尚未存储在存储库中,您可以先执行此操作 git add -N <filename>
。之后你可以继续 git add -p <filename>
。
之后,您可以使用:
git diff --staged
检查您是否进行了正确的更改
git reset -p
不要错误地添加帅哥
git commit -v
在编辑提交消息时查看提交。
请注意,这与 git format-patch
命令,其目的是将提交数据解析为 .patch
文件。
参考未来: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
您可以使用 git add --patch <filename>
(要么 -p
简而言之,git将开始将你的文件分解为它认为合理的“帅哥”(文件的一部分)。然后它会提示您这个问题:
Stage this hunk [y,n,q,a,d,/,j,J,g,s,e,?]?
以下是每个选项的说明:
如果文件尚未存储在存储库中,您可以先执行此操作 git add -N <filename>
。之后你可以继续 git add -p <filename>
。
之后,您可以使用:
git diff --staged
检查您是否进行了正确的更改
git reset -p
不要错误地添加帅哥
git commit -v
在编辑提交消息时查看提交。
请注意,这与 git format-patch
命令,其目的是将提交数据解析为 .patch
文件。
参考未来: https://git-scm.com/book/en/v2/Git-Tools-Interactive-Staging
您可以使用 git add --interactive
要么 git add -p <文件>
, 接着 git commit
(不 git commit -a
);看到 互动模式 在 混帐相加 手册页,或只是按照说明。
现代Git也有 git commit --interactive
(和 git commit --patch
,这是交互式提交中补丁选项的快捷方式)。
如果您更喜欢从GUI进行,您可以使用 混帐贵。您只需标记要包含在提交中的块。我个人认为比使用更容易 git add -i
。其他git GUI,如QGit或GitX,也可能具有此功能。
git gui 在diff视图下提供此功能。只需右键单击您感兴趣的行,您就会看到“暂存此行提交”菜单项。
我相信 git add -e myfile
是最简单的方法(至少我的偏好),因为它只是打开一个文本编辑器,让你选择你想要分段的那一行和你不选择哪一行。
关于编辑命令:
添加内容:
添加的内容由以“+”开头的行表示。您可以通过删除它们来阻止暂存任何添加行。
删除内容:
删除的内容由以“ - ”开头的行表示。您可以通过将“ - ”转换为“”(空格)来阻止转移它们。
修改内容:
修改后的内容由“ - ”行(删除旧内容)后跟“+”行(添加替换内容)表示。您可以通过将“ - ”行转换为“”并删除“+”来阻止暂存修改 线。请注意,仅修改对中的一半可能会对索引引入令人困惑的更改。
每一个细节 git add
可用 git --help add
如果你正在使用vim,你可能想尝试一下这个优秀的插件 逃亡。
您可以在工作副本和索引之间看到文件的差异 :Gdiff
,然后使用经典的vim diff命令为索引添加行或数据 dp
。将修改保存在索引中并提交 :Gcommit
,你已经完成了。
我强烈建议使用 SourceTree 来自Atlassian。 (它是免费的。)这使得这个微不足道。您可以快速轻松地分发各个代码或各行代码。
值得注意的是使用 git add --patch
为一个 新文件 您需要先将文件添加到索引中 git add --intent-to-add
:
git add -N file
git add -p file
当我有很多更改,并最终会从更改中创建一些提交时,我想在暂存之前暂时保存我的起点。
喜欢这个:
$ 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的答案就是我通常所做的,除非有时会有很多变化,我可以告诉我在分阶段时可能会犯错误,我想要一个承诺状态,我可以再次使用。
就像jdsumsion的回答一样,你也可以隐藏你当前的工作,但是然后使用像meld这样的difftool从存储中提取选定的更改。这样你甚至可以很容易地手动编辑帅哥,这在进入时会有点痛苦 git add -p
:
$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop
使用stash方法可以在提交代码之前测试代码是否仍然有效。