Git format-patch vs git log -p

时间:2013-01-17 09:33:55

标签: git patch git-log git-patch

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

3 个答案:

答案 0 :(得分:2)

git log -p向您显示反向时间顺序的变化(最近的第一个)。这通常不适合生成补丁,因为您希望使用最早的更改而不是最近的更改开始修补。

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

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

cat *.patch | git am

答案 1 :(得分:1)

我相信您也可以尝试使用git bundle命令创建二进制存档,然后将其应用到存储库的另一个副本。

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

git bundle create file.name revision..list - 将在当前文件夹中创建带有file.name的文件,并将其中包含的修订内容放入其中。

git bundle unbundle file.name在不同的地方恢复修订。

答案 2 :(得分: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首先给出了最多的补丁。