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

6mzjoqzu  于 2022-12-10  发布在  Git
关注(0)|答案(7)|浏览(204)

情况是这样的:
1.我们创建了一个基于现有开源git repo(source-repo)的“私有”repo(our-repo)。
1.我们一直在开发代码,大约有20个合并到我们的repo中。所以,repo从“State_Initial”移到了“State_Current”。
现在,出于商业原因,我们希望将我们的所有开发工作移交给第三方。基于一些法律的问题,我们唯一的选择是给予他们一个“单一”的补丁文件,其中包含我们所有的更改。这是一个介于“State_Initial”和“State_Current”之间的压缩补丁。
我环顾四周,发现

git format-patch -X

但是,它会生成“n”个.patch文件。
是否有一种方法可以创建一个补丁文件,这样,如果我们创建一个基于“source-repo”的repo并应用补丁,它会将我们带到“State_Current”?

vmdwslir

vmdwslir1#

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

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

然后,您可以按如下方式应用它:

git am foo.patch

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

jxct1oxe

jxct1oxe2#

您可以使用git diff
git diff 0f3063094850 > ./test.patch

qoefvg9y

qoefvg9y3#

创建一个名为squashed的新分支,该分支包含一个squashed commit。该分支的内容与普通分支完全相同,但没有历史记录。
仔细检查,如果满意,使用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
thigvfpy

thigvfpy4#

如果出于某种原因,你不想创建一个一次性分支并挤压state_initialstate_current之间的所有提交,然后使用git format-patch,还有一个替代方法。如果你从state_initial分支出来,并且你的分支是在源分支之上重定基的:
git format-patch source_branch <patch_file_name>
当你执行git am <patch_file_name>时,它不会重建你的整个提交链。但是这个补丁文件将是一个连续的更改列表。如果你在多个提交中更改了一些东西,并且又改回了一些东西,如果有人检查补丁文件,它仍然是可见的。

t3irkdon

t3irkdon5#

使用以下命令:

$ git format-patch -n <commit string>

-n表示要为此补丁生成多少个提交,表示要从哪个提交生成。

pprl5pva

pprl5pva6#

“将最后10个补丁从头文件中取出放入单个补丁文件中:“
git format-patch -10 HEAD --stdout > 0001-last-10-commits.patch
来源:https://stackoverflow.com/a/16172120/9478470类似问题的答案:如何为特定的提交生成Git补丁?

zqdjd7g9

zqdjd7g97#

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>的历史记录中。
1.一般的<revision range>表达式(参见gitrevisions(7)中的“SPECIFYING REVISIONS”部分)表示指定范围内的提交。
例如,以下命令为当前分支上的最后三次提交生成修补程序:

git format-patch HEAD~3..HEAD

相关问题