git:在多个提交中生成单个补丁



这是这种情况:

  1. 我们基于现有的开源 git 存储库(例如源存储库(创建了一个"私有"存储库(例如我们的存储库(。

  2. 我们一直在开发代码,并将大约 20 个合并到我们的存储库中。因此,回购从"State_Initial"移动到"State_Current"。

现在,出于商业原因,我们希望将所有开发移交给第三方。基于一些法律问题,唯一的选择是我们给他们一个包含所有更改的"单个"补丁文件。这是"State_Initial"和"State_Current"之间的挤压补丁。

我环顾四周,发现

git format-patch -X

但是,它会生成"n".patch 文件。

有没有办法创建一个补丁文件,这样如果我们创建一个基于"source-repo"的存储库并应用补丁,它会带我们"State_Current"?

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

git format-patch cc1dde0dd^..6de6d4b06 --stdout > foo.patch

然后,您可以像这样应用它:

git am foo.patch

注意:如果您希望包含第一个提交 SHA,请务必使用^..而不是..

您可以在之间生成单文件修补程序,如下所示:

具有提交历史记录

生成补丁:

git format-patch <COMMIT1>^..<COMMIT2> --stdout > commits.patch

应用补丁:

git am commits.patch

没有提交历史记录

生成补丁:

git diff <COMMIT1>^..<COMMIT2> > diff.patch

应用补丁:

git apply diff.patch

笔记

  • Windows上,你最好在Git Bash中运行上述命令。如果使用 PowerShell 并在应用修补程序时出现错误,则可以尝试将修补程序文件转换为 UTF-8 编码。

  • 如果您出于某种原因想要将第一次提交包含在补丁中。你可以做:

    git format-patch --root --stdout > all.patch
    

    git diff 4b825dc642cb6eb9a060e54bf8d69288fbee4904 HEAD > diff.patch
    

    4b825dc642cb6eb9a060e54bf8d69288fbee4904 表示"空树",请参阅如何获取第一次提交的 Git 差异?

创建一个名为squashed的新分支,该分支具有单个压缩提交。此分支将具有与正常分支完全相同的内容,但没有历史记录。

仔细查看,如果您满意,请使用format-patch创建补丁文件。

$ git checkout -b squashed $(git commit-tree HEAD^{tree} -m 'Squashed history')
$ git format-patch --root HEAD

这是一个非破坏性操作,之后您可以直接切换回正常的开发分支。您可以tag被压扁的分支以保存对通过电子邮件发送给他们的内容的引用,或者在不再需要它时使用branch -D将其删除。

$ git branch -D squashed

您可以使用git diff

git diff 0f3063094850 > ./test.patch

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

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

来源:https://stackoverflow.com/a/16172120/9478470 类似问题的答案:如何为特定提交生成 Git 补丁?

如果出于某种原因您不希望创建一个一次性分支并在state_initialstate_current之间压缩所有提交,然后使用git format-patch,还有另一种选择。如果从state_initial分支出来,并且分支基于源分支的顶部重新定位:

git format-patch source_branch <patch_file_name>

当你做git am <patch_file_name>时,它不会重建你的整个提交链。但此修补程序文件将是更改的顺序列表。如果您在多个提交中更改并更改了内容,如果有人检查补丁文件,它仍然可见。

使用以下命令:

$ git format-patch -n <commit string>

-n 表示要为此修补程序生成的提交数,以及要从哪个提交生成

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

概要

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

描述

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

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

  2. 泛型<revision range>表达式(参见gitrevisions(7( 中的 "指定修订" 部分(表示指定范围内的提交。

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

git format-patch HEAD~3..HEAD

相关内容

  • 没有找到相关文章

最新更新