当我在Git中更改文件时,如何仅提交某些更改?
例如,如何在文件中更改的30行中仅提交15行?
git gui
= git add -e
> git add -i -p
; 在便利性方面:git gui
> git add -i -p
> git add -e
。所以:挑选git gui
时,你有机会获得十挑git add -i -p
简单的东西,当你没有或者不想使用X. git add -e
复杂分期无X.
当我在Git中更改文件时,如何仅提交某些更改?
例如,如何在文件中更改的30行中仅提交15行?
git gui
= git add -e
> git add -i -p
; 在便利性方面:git gui
> git add -i -p
> git add -e
。所以:挑选git gui
时,你有机会获得十挑git add -i -p
简单的东西,当你没有或者不想使用X. git add -e
复杂分期无X.
Answers:
您可以使用git add --patch <filename>
(或-p
简称为git),并且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
文件。
未来参考:Git工具-交互式登台
git diff
。
e
,您可以通过替换+
或-
用#
git push
它说已经是最新的了。如果我愿意,git diff
我会看到我说过的帅哥n
。如果我git diff --staged
看到我要推送的提交,假设我可以推动提交,如何删除对我说的粗俗内容no
?
您可以使用git add --interactive
或,然后使用(not); 看到交互模式中的git-ADD手册页,或只需按照说明进行操作。git add -p <file>
git commit
git commit -a
Modern Git还具有git commit --interactive
(和git commit --patch
,这是交互式提交中补丁选项的快捷方式)。
如果您更喜欢通过GUI进行操作,则可以使用git-gui。您可以简单地标记要包含在提交中的块。我个人觉得比使用容易git add -i
。其他git GUI,例如QGit或GitX,也可能具有此功能。
git gui在diff视图下提供了此功能。只需右键单击您感兴趣的行,您将看到“暂存此行以提交”菜单项。
gitk
,但Windows的Git Bash附带了它。您应该有一个开始菜单项,或者可以使用命令启动它git gui
。还有stage this hunk
一个可能比有用stage this line
。自从10年前创建此答案以来,它可能是新的。
我认为这git add -e myfile
是最简单的方法(至少是我的喜好),因为它只是打开了一个文本编辑器,让您选择要暂存的行和不需要的行。关于编辑命令:
添加的内容:
添加的内容以“ +”开头的行表示。您可以通过删除它们来防止暂存任何附加行。
删除的内容:
删除的内容以“-”开头的行表示。您可以通过将“-”转换为“”(空格)来防止分段删除它们。
修改内容:
修改后的内容由“-”行(删除旧内容)和“ +”行(添加替换内容)表示。您可以通过将“-”行转换为“”并删除“ +”行来防止进行修改。请注意,仅修改一对中的一半可能会给索引带来混乱的变化。
有关的所有详细信息git add
,请参见git --help add
-e
是--edit
。
git --help add
s
在交互式补丁程序模式下无法使小块变小时明智地添加/删除行的问题。
git add -e
)*不会*更改磁盘上的文件内容可能会有所帮助。它只是将变更的一部分从非暂存转移到暂存(索引)。
我强烈建议使用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的答案是我通常要做的,除了有时会有很多变化之外,我可以告诉我在上演事情时可能会犯错,而且我希望我可以回到第二阶段。
自v2018.1起,Intellij IDEA(我猜该系列的所有其他产品)内置了对部分提交的支持
对于那些使用Git Extensions的人:
在“提交”窗口中,选择要部分提交的文件,然后在右窗格中选择要提交的文本,然后右键单击所选内容,然后从上下文菜单中选择“阶段选定的行”。
s
非常有用-对于快速暂存部分文件进行提交非常有用。
就像jdsumsion的答案一样,您也可以隐藏当前的工作,但是然后使用diff工具(例如,meld)从存储中提取选定的更改。这样,您甚至可以非常轻松地手动编辑帅哥,当您使用时git add -p
:
$ git stash -u
$ git difftool -d -t meld stash
$ git commit -a -m "some message"
$ git stash pop
使用stash方法使您有机会在提交代码之前测试代码是否仍然有效。
git commit --amend
,则似乎以后无法弹出存储,还是有办法做到这一点?
在上一个答案的基础上,如果您更喜欢使用命令行,请输入git add -e myfile
来逐行选择要提交的内容,因为此命令将打开具有差异的编辑器,如下所示:
您可能知道以开头的行+
是加法,以开头的行-
是删除。所以:
-
为space即可
。这就是git add -h
有关以这种方式添加文件(修补文件)的说明:
添加的内容 添加的内容由以“ +”开头的行表示。您可以通过删除它们来防止暂存任何附加行。
删除的内容: 删除的内容由以“-”开头的行表示。您可以通过将“-”转换为“”(空格)来防止分段删除它们。
修改后的内容: 修改后的内容由“-”行(删除旧内容)和“ +”行(添加替换内容)表示。您可以通过将“-”行转换为“”并删除“ +”行来防止进行修改。请注意,仅修改一对中的一半可能会给索引带来混乱的变化。
注意:请勿更改文件的内容,这不是一个好地方。只需更改已删除或已添加行的运算符。
vim-gitgutter插件可以在不离开vim编辑器的情况下进行大礼
:GitGutterStageHunk
除此之外,它还提供了其他一些很酷的功能,例如某些现代IDE中的差异符号列
如果只有部分大块应该上演逃亡者
:Gdiff
允许选择可视范围,然后选择:'<,'>diffput
或:'<,'>diffget
登台/还原单个行的更改。
尝试了一下git add -p filename.x
,但在Mac上,我发现gitx(http://gitx.frim.nl/或https://github.com/pieter/gitx)更加容易提交我想要的行。
提出这个问题已有10年了。我希望这个答案对某人有用。正如答复中提到这里,这里GUI是不是一种选择,安德鲁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
cd到您的git repo并按以下方式调用它:
git crecord
这将打开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
截屏视频显示了示例用法
git-meld- index-从网站引用:
git-meld-index运行meld或任何其他git difftool(kdiff3,diffuse等),以允许您交互式地将更改暂存到git索引(也称为git暂存区)。
这类似于git add -p和git add --interactive的功能。在某些情况下,比git add -p更容易/更快地使用meld。这是因为,例如,meld允许您:
用法
在git仓库中,运行:
git meld-index
您会看到融合(或您配置的git difftool)弹出:
左:从工作树复制的临时目录继续文件
RIGHT:带有索引内容的临时目录。这还包括尚未在索引中但在工作副本中已修改或未跟踪的文件-在这种情况下,您将看到HEAD中的文件内容。
编辑索引(右侧),直到满意为止。请记住在需要时保存。
完成后,关闭meld,并且git-meld-index将更新索引以匹配刚编辑的meld右侧临时目录的内容。
如果是上Windows
平台,在我看来git gui
是非常好的工具stage
/ commit
从几行unstaged
文件
1.大块头:
unstagged Changes
部分中选择文件Stage Hunk for commit
2.行明智的:
unstagged Changes
部分中选择文件Stage Lines for commit
3.如果要暂存完整文件,请注意以下几行:
unstagged Changes
部分中选择文件Ctrl+T (Stage file to commit)
Staged Changes
部分”UnStage Lines for commit
如上面的答案所示,您可以使用
git add --patch filename.txt
或简称
git add -p filename.txt
...但是对于存储库中已经存在的文件,in最好直接在commit命令上使用--patch标志(如果使用的是最新版本的git):
git commit --patch filename.txt
...或者还是简短形式
git commit -p filename.txt
...然后使用上述键(y / n等)来选择要包含在提交中的行。
git add -p filename.txt
除了减少错误的余地,这还给您带来了什么?如果您弄乱了部分文件的更改,则撤消添加要比撤消提交更好。