题 为特定提交生成git补丁


我需要编写一个脚本,为SHA1提交号列表创建补丁。

我试过用 git format-patch <the SHA1>,但是从那个SHA1开始为每个提交生成一个补丁。在生成几百个补丁之后,我不得不杀死这个过程。

有没有办法只为特定的SHA1生成补丁?


951
2017-07-12 00:35


起源




答案:


尝试:

git 格式补丁 -1 <sha>

要么

git format-patch -1 HEAD

使用以下命令应用修补程序:

git am < file.patch

1546
2017-07-12 00:43



应用补丁: git apply --stat file.patch #show stats。 git apply --check file.patch #在申请前检查错误。 git am < file.patch #最后应用补丁。 - Adrian
如果最后一次提交是来自另一个分支的合并,它似乎不起作用。 - Lex Li
使用1.8.5更容易 git format-patch -1 @ - Evan Purkhiser
应用补丁: git am < file.patch - Jacob Jedryszek
使用 git am -3 < file.patch 使用三向合并来应用,这将使您可以解决冲突 git mergetool 之后(或手动编辑) 在这里找到。 - Matt


要从特定sha1哈希中从最顶层提交生成补丁:

git format-patch -<n> <SHA1>

单个补丁文件中的最后10个补丁:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch

234
2018-04-23 14:34



能不能请你为第一个命令提供一个例子 - Kasun Siyambalapitiya
git format-patch -1 HEAD 将为最近的提交生成补丁 - Sriram Murali
请原谅我,所以当它是 -2 它会为最近的2次提交生成补丁,还有一个要澄清的是命令 got format-patch -2 HEAD 与行相同 git format-patch HEAD~2 - Kasun Siyambalapitiya


假设您在提交1之后提交了id 2,那么您将能够运行:

git diff 2 1 > mypatch.diff

其中2和1是SHA哈希。


61
2017-07-12 00:42



谢谢dookehster的回复。这意味着我需要脚本来查找我感兴趣的提交之前的提交。我希望我可以避免这种情况。 - elle
@elle,不,你不 - git diff hash^ hash 。 “hash ^”给出先前的提交。 (但是,当然,manojlds的答案更好) - J-16 SDiZ
git show HEAD > mypatch.diff 而你在提交时也应该这样做。 - andho
@dookehester是正确的还是其他方式, git diff 1 2 - Kasun Siyambalapitiya
我倾向于使用--no-prefix并使用'patch -p0 <patch file'...这样制作的补丁文件也可以与subversion的diff输出交替使用 - Rondo


这个命令(正如已经建议的那样) @Naftuli Tzvi Kay):

git format-patch -1 HEAD

更换 HEAD 具有特定的散列或范围。

将为最新提交生成补丁文件,格式化为类似UNIX邮箱格式。

-<n>  - 从最顶层的提交准备补丁。

然后,您可以通过以下方式重新应用邮箱格式的补丁文件:

git am -3k 001*.patch

看到: man git-format-patch


50
2017-07-06 13:52



谢谢!我认为值得注意的是,应用补丁将创建一个带有[PATCH]前缀的提交消息的提交。虽然这很容易解决 - Mike S
惊人的。 OP,你还没有接受这个,因为......? @MikeS不,它不会,比任何其他 git格式化的补丁确实如此,至少如果用户以正确的方式应用它。 - underscore_d


git format-patch commit_Id~1..commit_Id  
git apply patch-file-name

快速简单的解决方案。


17
2018-05-04 16:52



也别忘了打电话 git apply --check patch-file-name 在应用补丁之前。这有助于避免出现问题。 - iamantony


要从特定提交(而不是最后一次提交)生成路径:

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE

5
2018-05-24 07:26





如果您想确保(单个提交)补丁将应用于特定提交之上,您可以使用新的git 2。9(2016年6月)选项 git format-patch --base

git format-patch --base=COMMIT_VALUE~ -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git format-patch --base=auto -M -C COMMIT_VALUE~..COMMIT_VALUE

# or
git config format.useAutoBase true
git format-patch -M -C COMMIT_VALUE~..COMMIT_VALUE

看到 提交bb52995提交3de6651提交fa2ab86commit ded2c09 (2016年4月26日) 小蓉烨(``)
(合并 Junio C Hamano - gitster  -  在 提交72ce3ff,2016年5月23日) 

format-patch:添加'--base'记录基础树信息的选项

维护者或第三方测试人员可能想知道确切的基础树   补丁系列适用于。教git格式 - 补丁'--base' 选项   记录基础树信息并将其附加到第一个结尾   消息(封面信或系列中的第一个补丁)。

基本树信息由“基本提交”组成,这是众所周知的   提交是项目历史稳定部分的一部分   否则可以使用零个或多个“必备补丁”   飞行中众所周知的补丁尚未成为“基础提交”的一部分   需要在拓扑顺序的“基础提交”之上应用   在应用补丁之前。

“基本提交”显示为“base-commit: “其次是40-hex   提交对象名称。
  “必备补丁”显示为“prerequisite-patch-id: “接下来是40-hex”patch id“,可以通过将补丁传递给”git patch-id --stable“命令。


5
2018-06-01 06:29





如果您只想要diff指定的文件,您可以:

git diff master 766eceb - connections /> 000-mysql-connector.patch


1
2018-01-17 09:40





仅为特定SHA1生成补丁的方法是什么?

这很简单:

选项1。 git show commitID > myFile.patch

选项2。 git commitID~1..commitID > myFile.patch

注意:替换 commitID具有实际提交ID(SHA1提交代码)。


0



选项1是完全错误的,与问题无关。 - Anshuman Manral
选项2也是无效命令。您将得到如下错误:git a5f4bcaeb7fa7de27ae79d9522332e872889bbf0~1..a5f4bcaeb7fa7de27ae79d9522332e872889bbf0 git:'a5f4bcaeb7fa7de27ae79d9522332e872889bbf0~1..a5f4bcaeb7fa7de27ae79d9522332e872889bbf0'不是git命令。见'git --help'。在发布答案之前请检查 - Anshuman Manral