当我对Git中的文件进行更改时,如何才能只提交部分更改?

例如,如何在文件中更改的30行中只提交15行?


当前回答

git meld索引--引用自网站:

git-meld-index运行meld——或任何其他gitdifftool(kdiff3、diffuse等)——允许您以交互方式将更改转移到git索引(也称为git暂存区)。

这与git add-p和git add-interactive的功能类似。在某些情况下,meld比gitadd-p更容易/更快使用。这是因为meld允许你,例如:

查看更多上下文参见行内差异手动编辑并查看“实时”差异更新(每次按键后更新)导航到更改,而不必对要跳过的每个更改说“n”

用法

在git存储库中,运行:

git meld-index

您将看到meld(或您配置的gitdifftool)弹出:

左:从工作树复制的临时目录连续文件

RIGHT:包含索引内容的临时目录。这还包括尚未在索引中但在工作副本中已修改或未跟踪的文件——在本例中,您将从HEAD中看到文件内容。

编辑索引(右手边)直到满意。记得在需要时保存。

完成后,关闭meld,git meld索引将更新索引,以匹配刚刚编辑的meld右侧临时目录的内容。

其他回答

加上前面的回答,如果您更喜欢使用命令行,输入git add-e myfile可以让您选择逐行选择要提交的内容,因为此命令将打开一个具有不同之处的编辑器,如下所示:

正如你可能知道的那样,以+开头的行是加法,以-开头的行则是删除。因此:

要不进行添加,只需删除该行。要不进行删除,只需用空格替换。

这就是git add-h所说的通过这种方式添加文件(修补文件):

添加的内容添加的内容由以“+”开头的行表示。你可以通过删除添加行来防止暂存任何添加行。删除的内容:删除的内容由以“-”开头的行表示。你可以通过将“-”转换为“”来防止临时删除(空格)。修改内容:修改的内容由“-”行表示(删除旧的内容),后跟“+”行(添加替换内容)。您可以通过将“-”行转换为“”,并删除“+”行。请注意,仅修改这对组合很可能会给指数带来令人困惑的变化。

注意:不要更改文件的内容,这不是一个好地方。只需更改删除或添加行的运算符即可。

如上面的一个答案所示,您可以使用git add--补丁文件名.txt

或简称git add-p文件名.txt

…但对于存储库中已经存在的文件,在s中,直接在commit命令上使用--patch标志要好得多(如果您使用的是足够新的git版本):gitcommit--补丁文件名.txt

…或者,再次,简称gitcommit-p文件名.txt

…然后使用上述键(y/n等)选择要包含在提交中的行。

这个问题已经问了10年了。我希望这个答案对某人有用。正如这里的答案中所提到的,在GUI不是选项的情况下,AndrejShadura的gitcrecord工具有助于提供一个交互式窗口,我们可以在其中选择要提交的行。

按如下方式设置扩展:

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

这将带来一个交互式界面,可以使用如下所示。按下以下键将执行某些操作:

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

显示示例用法的屏幕广播

对于Atom用户,包github包括gitgui风格的交互式登台。有关快捷方式,请参阅软件包的文档。

使用Atom可以处理具有深色背景的主题(默认情况下,gitgui具有白色背景)。

我想把lazygit添加到工具列表中。这是一个不错的命令行gui(即,即使不允许X转发,也可以通过ssh工作)。它具有广泛的功能(例如,选择要提交的行、交互式重基)、有用的着色,并且使用起来相对简单。可以以多种方式安装(go、conda、包管理器等)。仍在积极开发/维护。