我想检索一个提交列表作为补丁,然后尝试将它们应用到另一个存储库中,在该存储库中我存储了一个与我想要检索补丁的项目非常接近的项目:我如何在一个命令中检索所有补丁? git format-patch 和 git log -p 之间最好的方法(和区别)是什么?
3 回答
git log -p
以逆时间顺序向您显示更改(最近的在前)。这通常不利于生成补丁,因为您希望从最早的更改而不是最近的更改开始打补丁。
git format-patch
以正确的方向生成补丁(补丁0001
将是最早的更改),并将补丁保存为每个文件一个提交,并将它们格式化为适合git am
在接收方使用的电子邮件消息。
git format-patch
因此,对于您想要的,在一个存储库上运行然后git am
在目标存储库上运行可能最有意义:
cat *.patch | git am
我相信您也可以尝试使用git bundle
命令来创建二进制存档,然后将其应用于存储库的另一个副本。
但是,我想说这种方法不如使用git format-patch
and灵活git am
,但如果您不想手动查看每个补丁,可能会更快。
git bundle create file.name revision..list
— 将file.name
在当前文件夹中创建文件,并将指定的修订内容放入其中。
git bundle unbundle file.name
在不同的地方恢复修订。
如果您格式化由 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 首先给出最新的。