`Git add --patch` 多个文件:从上一个文件转到大块

Posted

技术标签:

【中文标题】`Git add --patch` 多个文件:从上一个文件转到大块【英文标题】:`Git add --patch` multiple files: go to hunk from previous file 【发布时间】:2021-11-11 15:42:58 【问题描述】:

在运行git add --patch 时,它会显示一系列“帅哥”,可以分别使用yn 应用或跳过,以及用于编辑/等的其他选项。

有时,在处理大量文件时,我无意中将n 标记到最后一个,或者只标记到一个我实际上打算标记ye 的文件中,导致我移动到下一个文件。在这种情况下,在使用补丁编辑器时有什么方法可以让我将 1 个块移回上一个文件?

我知道有一个 g 选项可以转到同一文件中的特定大块,但我不确定如果大块来自前一个大块,如何任意移回 1 个大块文件。有没有办法只“回去”一个大块头?

在这种情况下,我的选择似乎是 add -p 再次更改所有更改(不好,因为可能有很多文件,需要跳过很多大块),或者记下个人我搞砸的文件并单独修补添加单个文件(其中可能还有许多需要再次跳过的大块)。

【问题讨论】:

我认为没有。执行 add -p 技巧的程序是用 Perl 编写的——至少目前是这样——所以你可以自己破解它。 Perl 程序是经过解释的,因此不需要任何花哨的编译步骤。不过,Git 人员正在用 C 进行重写,之后修复此问题将变得更加困难。 是的,为此使用了一个编辑器插件,逃亡者(我也期待 magit)让这种事情发展得快得令人难以置信。 这确实可能是一个不错的 GUI 可能是更好选择的情况。 有一个基本的 gui,它带有 git,它允许您查看文件的暂存版本与工作树版本,并逐行暂存/取消暂存更改:git gui 但是:如果您最终寻找复杂的方法来编辑 patches 而不是 files,这表明您可能会更好将您的更改收起来(git stash -kcp thatfile thatfile.mine && git checkout thatfile),并在所述文件中编写您希望暂存的内容。 【参考方案1】:

正如评论中所建议的,如果您需要更具交互性的东西,请使用 gui 工具。

git 附带一个基本的 gui 工具,您可以使用 git gui 调用它,它允许您:

查看未暂存和暂存文件(列出并查看其内容), 选择现有补丁中的行(单个行或行块)并将它们暂存或取消暂存, 以及其他一些操作,例如提交(无论是否修改)或存储。

我不太了解其他 GUI 工具,但我确信其中一些提供了运行 git add -p 等价物的良好界面。


作为一般评论:如果您发现自己正在寻找添加部分补丁的精致方法并寻求如何内联编辑差异块,也许我值得问问自己您想要的不是:

将文件编辑为您想要的内容,然后暂存

git add -p 无疑是一种仅选择文件区域的便捷方式,但它也是一种创建您从未测试过的提交的方式,因为暂存的内容绝不是您在磁盘上的确切内容。

【讨论】:

我不确定你的结束语来自哪里;我从来没有说过我用它来编辑补丁,使其与磁盘上出现的不同。我使用补丁添加来暂存特定的更改,以便提交在语义上是正确的,并且只详细说明它们所代表的原子更改。有时只需要放弃或编辑以忽略一些事情,例如编辑器所做的空白更改,这是不必要的,否则会将历史记录中的行更改归因于我在实践中不需要。 你是对的:git add -p 一个有用的工具,有时将变更集拆分为更小的提交绝对是“正确”的做法。我想到了像this one 这样的情况,显然,对应用补丁的操作的结果将导致不正确的内容(在另一个问题中:尽管编码器的意图很清楚,package.json 不会是一个正确的 json 文件)。

以上是关于`Git add --patch` 多个文件:从上一个文件转到大块的主要内容,如果未能解决你的问题,请参考以下文章

使用 git add --patch <filename> 手动编辑

如何在 git add --patch 中使用 --color-words?

如何在 git add --patch 中使用 --color-words?

[Git] Use git add --patch for better commit history and mitigating bugs

如何使用寻呼机进行长 git add --patch hunks?

git merge --squash & git format-patch 将多个commit生成一个patch