Git format-patch与git log -p的区别

3
我想要检索一个提交列表作为补丁,然后尝试将它们应用到另一个仓库中,这个仓库存储了一个与我想要检索补丁的工程非常接近的项目:如何在一个命令中检索所有补丁? git format-patch 和 git log -p 之间的最佳方法(以及差异)是什么?

你看过 git bundle 吗? - Adam Dymitruk
谢谢,这看起来很有趣,但我正在寻找一些简单的东西。 - epsilones
1
如果提交共享历史记录,git bundle非常简单:使用git bundle create my-bundle HEAD~10..HEAD创建一个捆绑包(检索最后十个提交,HEAD~10应该存在于目标位置)。在目标位置使用git fetch my-bundle :somebranch检索它。现在你有了提交作为somebranch,你可以根据需要合并或变基。 - user4815162342
3个回答

2

git log -p 显示的是逆时间顺序的更改记录(最近的在前面)。这对于生成补丁通常不是很好,因为您希望从最早的更改开始打补丁而不是最近的。

git format-patch 以正确的方向生成补丁(补丁0001将是最早的更改),它将每个提交保存为一个文件并将其格式化为适合用于接收端的电子邮件消息。

因此,对于您想要的内容,最好先在一个仓库中运行 git format-patch,然后在目标仓库上运行 git am

cat *.patch | git am

现在有一个git log --reverse。 - yucer

1

我认为你可以尝试使用git bundle命令创建二进制归档文件,然后将其应用于另一个副本的存储库。

但是,我认为这种方法不如使用git format-patchgit am灵活,但如果您不想手动审核每个补丁,则可能更快。

git bundle create file.name revision..list - 将在当前文件夹中创建名为file.name的文件,并将指定修订版本的内容放入其中。

git bundle unbundle file.name以将修订版本还原到不同的位置。


0
如果您格式化从git log中得到的哈希值,将路径号码以"-"符号作为前缀,则所有补丁都可以一次性在不同的文件中生成。例如:
git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')

这将涵盖您可以从git log中应用的所有过滤器。它们并不总是连续的提交。例如,获取与给定用户对应的补丁:

git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')

--reverse 选项是必需的,以便按时间顺序提供补丁,因为 git log 默认会先给出最近的记录。


谢谢你的回答,我终于解决了我的问题 ;) - epsilones

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