git:跨多个提交生成单个补丁

Sim*_*der 7 git patch

这种情况:

  1. 我们基于现有的开源git repo(例如source-repo)创建了一个“私有” repo(例如our-repo)。

  2. 我们一直在开发代码,并已将大约20个合并到我们的仓库中。因此,仓库从“ State_Initial”移到“ State_Current”。

现在,出于业务原因,我们希望将所有开发工作移交给第三方。基于某些法律问题,唯一的选择是我们为他们提供所有更改的“单个”补丁文件。那是“ State_Initial”和“ State_Current”之间的压缩补丁。

我环顾四周,发现

git format-patch -X
Run Code Online (Sandbox Code Playgroud)

但是,它会生成“ n”个.patch文件。

有没有一种创建单个补丁文件的方法,以便如果我们基于“ source-repo”创建一个仓库并应用该补丁,它将带我们进入“ State_Current”?

小智 22

您可以在 <COMMIT1> 和 <COMMIT2> 之间生成单文件补丁,如下所示:

有提交历史记录

生成补丁:

git format-patch <COMMIT1>^..<COMMIT2> --stdout > commits.patch
Run Code Online (Sandbox Code Playgroud)

应用补丁:

git am commits.patch
Run Code Online (Sandbox Code Playgroud)

没有提交历史记录

生成补丁:

git diff <COMMIT1>^..<COMMIT2> > diff.patch
Run Code Online (Sandbox Code Playgroud)

应用补丁:

git apply diff.patch
Run Code Online (Sandbox Code Playgroud)

笔记


ale*_*son 7

以下命令创建一个.patch包含多个提交的文件。

git format-patch cc1dde0dd^..6de6d4b06 --stdout > foo.patch
Run Code Online (Sandbox Code Playgroud)

然后可以像这样应用它:

git am foo.patch
Run Code Online (Sandbox Code Playgroud)

注意:如果要包括第一个提交SHA,请确保使用^..代替..

  • **警告:** 这会生成一个包含多个单独补丁的文件。它不会按照问题中的要求压缩历史记录。如果中间有敏感提交,它们就会被暴露。 (16认同)
  • 只是为了澄清(也许仅适用于 Windows 用户?)。在执行“git am foo.patch”部分时,此命令导致我出错。我收到“补丁:格式检测失败”错误。有效的是使用以下命令创建补丁: git format-patch cc1dde0dd^..6de6d4b06 --output=foo.patch (6认同)
  • 如果您想将多个提交压缩到一个补丁中,那么您可以通过变基来压缩它们,然后可以将压缩的提交作为补丁。 (4认同)
  • 出于好奇,这是官方 git [文档](https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#_commit_ranges),用于根据“..”选择提交范围和`^`语法 (3认同)

Ror*_*ane -2

git format-patch可以将修订范围作为参数。看git help format-patch

\n\n
\n

概要

\n\n
git format-patch [-k] [(-o|--output-directory) <dir> | --stdout]\n                   ... (many flags omitted)\n                   [--progress]\n                   [<common diff options>]\n                   [ <since> | <revision range> ] \n
Run Code Online (Sandbox Code Playgroud)\n\n

描述

\n\n

\xe2\x80\xa6

\n\n

有两种方法可以指定要操作的提交。

\n\n
    \n
  1. 单个提交<since>指定导致当前分支尖端的提交不在导致输出的历史记录中<since>

  2. \n
  3. 通用<revision range>表达式(参见gitrevisions (7) 中的“指定修订”部分)表示指定范围内的提交。

  4. \n
\n
\n\n

例如,以下命令为当前分支上的最后三个提交生成补丁:

\n\n
git format-patch HEAD~3..HEAD\n
Run Code Online (Sandbox Code Playgroud)\n

  • 每次提交都会生成一个“.patch”文件。提问者想要一个包含给定范围内所有提交的“.patch”文件。 (6认同)