为特定提交生成git补丁

ell*_*lle 1144 git patch

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

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

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

man*_*lds 1841

尝试:

git format-patch -1 <sha>
Run Code Online (Sandbox Code Playgroud)

要么

git format-patch -1 HEAD
Run Code Online (Sandbox Code Playgroud)

根据上面的文档链接,该-1标志告诉git应该在补丁中包含多少次提交;

- <N>

     从最顶层的提交准备补丁.


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

git am < file.patch
Run Code Online (Sandbox Code Playgroud)

  • 应用补丁:`git apply --stat file.patch` #show stats.`git apply --check file.patch`#在申请前检查错误.`git am <file.patch`#最后应用补丁. (188认同)
  • 使用`git am -3 <file.patch`来使用三向合并,这将让你以后使用`git mergetool`解决冲突(或手动编辑)[在这里找到](http://stackoverflow.com/a /六十九万七千九百三十〇分之一千六百九十六万八千九百八十二). (33认同)
  • 使用1.8.5`git format-patch -1 @`更容易 (6认同)
  • 此命令也适用于来自commit的特定文件:`git format-patch -1 <sha> path/to/file.js`这将创建一个仅包含file.js的差异的补丁 (6认同)
  • 如果最后一次提交是来自另一个分支的合并,它似乎不起作用. (3认同)
  • 要使用CRLF行尾将补丁应用到文件:`git am --keep-cr &lt;mypatch.patch` (2认同)
  • 如果你解释了`-1`的目的,那将会非常有帮助 (2认同)

Sri*_*ali 272

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

git format-patch -<n> <SHA1>
Run Code Online (Sandbox Code Playgroud)

头文件中的最后10个补丁在一个补丁文件中:

git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
Run Code Online (Sandbox Code Playgroud)

  • 能请您为第一个命令提供示例吗? (2认同)
  • 请原谅我提出这个问题,所以当它是 `-2` 时,它会为最近的 2 次提交生成补丁,另外一件事要澄清的是命令 `got format-patch -2 HEAD` 与行` git 格式补丁 HEAD~2` (2认同)

bra*_*don 82

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

git diff 2 1 > mypatch.diff
Run Code Online (Sandbox Code Playgroud)

其中2和1是SHA哈希.

  • @elle,不,你不 - "git diff hash ^ hash`."hash ^"给出先前的提交.(但是,当然,manojlds的答案更好) (10认同)
  • @dookehester 这是正确的还是其他方式,`git diff 1 2` (3认同)
  • 你提交时,`git show HEAD> mypatch.diff`也应该这样做. (2认同)
  • 这将无法在差异中包含任何二进制文件。 (2认同)

ken*_*orb 55

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

git format-patch -1 HEAD
Run Code Online (Sandbox Code Playgroud)

替换HEAD为特定的散列或范围.

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

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

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

git am -3k 001*.patch
Run Code Online (Sandbox Code Playgroud)

见:man git-format-patch.

  • 惊人的.OP,你还没有接受这个,因为......?@MikeS不,它不会,除了任何其他`git`格式的补丁之外,至少如果用户以正确的方式应用它. (2认同)
  • @MikeS我没有真正调查原因,但遗漏了`-k`标志(`git am -3`)修复了这个形式我(没有`PATCH [0/10]`提交消息).Git版本2.20.1.windows.1 (2认同)

zdr*_*oft 27

git format-patch commit_Id~1..commit_Id  
git apply patch-file-name
Run Code Online (Sandbox Code Playgroud)

快速简单的解决方案.

  • 另外,在应用补丁之前,不要忘记调用`git apply --check patch-file-name`.这有助于避免问题. (5认同)
  • 另请注意,“git apply”将丢失所有提交信息,您必须手动提交。`git am` 在幕后调用 `git apply` 但保留该信息,这意味着它会自动提交。请参阅/sf/answers/856816481/ (2认同)

小智 22

使用 commit-id 创建 git 补丁

$ git format-patch -1 commit-id
Run Code Online (Sandbox Code Playgroud)

此命令创建具有以下文件名的补丁

0001-commit-message.patch
Run Code Online (Sandbox Code Playgroud)

应用补丁:

$ git am 0001-commit-message.patch
Run Code Online (Sandbox Code Playgroud)

  • 您能澄清一下“-1”参数吗?我无法在文档或在线中找到对其的引用。 (3认同)

Von*_*onC 9

如果您想确保(单个提交)补丁将应用于特定提交之上,您可以使用新的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
Run Code Online (Sandbox Code Playgroud)

请参阅提交bb52995,提交3de6651,提交fa2ab86,提交ded2c09(2016年4月26日)由Xiaolong Ye(``).
(由Junio C gitsterHamano合并- -提交72ce3ff,2016年5月23日)

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

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

基本树信息由"基本提交"组成,这是一个众所周知的提交,它是项目历史中其他人工作的稳定部分的一部分,以及零或更多"必备补丁",这些都是众所周知的飞行中的补丁尚未成为"基础提交"的一部分,需要在应用补丁之前以拓扑顺序在"基础提交"之上应用.

"base commit"显示为" base-commit:",后跟提交对象名称的40-hex.
"先决条件补丁"显示为" prerequisite-patch-id:",后跟40-hex"补丁ID",可以通过" git patch-id --stable"命令传递补丁获得.


Mak*_*kah 7

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

git format-patch -M -C COMMIT_VALUE~1..COMMIT_VALUE
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您只想比较指定的文件,您可以使用:

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


all*_*rts 5

在我的Mercurial背景下,我打算使用:

git log --patch -1 $ID > $file
Run Code Online (Sandbox Code Playgroud)

但我现在正在考虑使用git format-patch -1 $ID