我想要检索一个提交列表作为补丁,然后尝试将它们应用到另一个仓库中,这个仓库存储了一个与我想要检索补丁的工程非常接近的项目:如何在一个命令中检索所有补丁? git format-patch 和 git log -p 之间的最佳方法(以及差异)是什么?
git log -p
显示的是逆时间顺序的更改记录(最近的在前面)。这对于生成补丁通常不是很好,因为您希望从最早的更改开始打补丁而不是最近的。
git format-patch
以正确的方向生成补丁(补丁0001
将是最早的更改),它将每个提交保存为一个文件并将其格式化为适合用于接收端的电子邮件消息。
因此,对于您想要的内容,最好先在一个仓库中运行 git format-patch
,然后在目标仓库上运行 git am
:
cat *.patch | git am
我认为你可以尝试使用git bundle
命令创建二进制归档文件,然后将其应用于另一个副本的存储库。
但是,我认为这种方法不如使用git format-patch
和git am
灵活,但如果您不想手动审核每个补丁,则可能更快。
git bundle create file.name revision..list
- 将在当前文件夹中创建名为file.name
的文件,并将指定修订版本的内容放入其中。
git bundle unbundle file.name
以将修订版本还原到不同的位置。
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 默认会先给出最近的记录。
git bundle
吗? - Adam Dymitrukgit bundle
非常简单:使用git bundle create my-bundle HEAD~10..HEAD
创建一个捆绑包(检索最后十个提交,HEAD~10
应该存在于目标位置)。在目标位置使用git fetch my-bundle :somebranch
检索它。现在你有了提交作为somebranch
,你可以根据需要合并或变基。 - user4815162342