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

时间:2018-10-19 00:46:18

标签: git patch

这种情况:

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

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

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

我环顾四周,发现

git format-patch -X

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

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

感谢您的时间。

5 个答案:

答案 0 :(得分:2)

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

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

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

cat foo.patch | git am

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

答案 1 :(得分:1)

您可以使用git diff

git diff 0f3063094850 > ./test.patch

答案 2 :(得分:0)

创建一个名为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

答案 3 :(得分:0)

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

git format-patch source_branch <patch_file_name>

执行git am <patch_file_name>时,它不会重建整个提交链。但是此补丁文件将是顺序的更改列表。如果您在多次提交中都进行了更改,并进行了更改,那么即使有人检查了补丁文件,仍然可以看到它。

答案 4 :(得分:-1)

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.   
  3. 通用<revision range>表达式(请参见 gitrevisions (7)中的“指定版本”部分)表示在指定范围内的提交。

  4.   

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

git format-patch HEAD~3..HEAD
相关问题