提问者:小点点

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


情况是这样的:

>

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

    我们一直在开发代码,大约有20次合并到我们的repo中。所以,repo从“State_Initial”变成了“State_Current”。

    现在,出于商业原因,我们想把我们所有的开发交给第三方。基于一些法律问题,唯一的选择是我们给他们一个包含我们所有更改的“单一”补丁文件。那是一个介于“State_Initial”和“State_Current”之间的压扁补丁。

    我环顾四周,发现

    git format-patch -X
    

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

    有没有一种方法可以创建单个补丁文件,这样如果我们基于“源代码-存储库”创建一个存储库并应用补丁,它就需要我们“State_Current”?


  • 共3个答案

    匿名用户

    以下命令创建一个包含多个提交的单个. 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 diff?

  • 匿名用户

    创建一个名为squed的新分支,它有一个压缩的提交。该分支将具有与您的普通分支完全相同的内容,但没有历史记录。

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

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

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

    $ git branch -D squashed