仅挑选与特定文件有关的提交记录

7

如何简洁地请求“从另一个分支挑选仅涉及特定文件的提交”?即命令git log ..other-branch afile会列出在other-branch中未合并的所有涉及“afile”的提交;那么如何请求将这些相同的提交应用到当前分支上?


你能不能合并最近触及相关文件的提交? - dezman
@watson 我不能这样做,因为那样也会合并许多我不想合并的提交。我只想拉取与一个文件相关的小子集提交的更改。 - gcbenison
我认为你想要的不可能实现,你只能获取一个文件、最新提交更改该文件的所有内容或者从最新提交中获取一些你认为相关的文件。 - dezman
你是否也只想要那个提交中实际涉及到相关文件的更改? - Wolf
应用整个提交是可以的。选择要应用的提交列表是重要的事情。(实际上,在命令行上将sha1复制粘贴为git cherry-pick的参数就可以完成工作。但肯定有更好的方法。) - gcbenison
1个回答

5

git cherry-pick $(git log --reverse --pretty=format:"%H" filename)

这条命令可以实现此功能。 git log --reverse --pretty=format:"%H" filename 命令会以反序列列出修改 filename 的所有提交版本的 SHA 值,确保提交按正确的顺序合并。我们将这个列表提供给 git cherry-pick 命令进行操作。

如果你使用 Magnus Bäck 提供的另一种版本,则可以使用以下命令:git cherry-pick $(git rev-list --reverse HEAD -- filename)


"然后sed将所有\n(换行符)替换为空格"--您不需要这样做。只要IFS保持默认值,在未引用的$(...)扩展中,换行符和空格的行为方式相同。 - user743382
我最终使用了这样的结构 - 我仍然在想是否有一种不涉及bash命令插值的方法来实现这个。我猜这不是一个足够常见的需求... - gcbenison
从未尝试过没有sed部分的情况,也没有测试用例,所以我不想发布我没有测试过的东西。 - Learath2
@gcbenison:我不认为这是非常普遍的,但更重要的是,由于可以使用现有的构建块轻松完成,我不明白为什么它应该成为一个特殊命令(或通过现有命令的特殊选项完成)。 - Magnus Bäck
1
为了脚本编写的目的,建议使用 git rev-list 而不是 git log。此外,您可能需要使用 --reverse 以正确顺序应用 cherry-picks,对吧?我们最终会得到这样的结果:git cherry-pick $(git rev-list --reverse HEAD -- filename) - Magnus Bäck
正如我所说,这是我以前使用过的一个命令,所以我没有详细介绍它。编辑了帖子,添加了“--reverse”和您使用“rev-list”的版本。 - Learath2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接