2010-02-07 63 views
35

我想为最后2个版本创建一个补丁。在git中,如何为最后的2+版本创建单个补丁?

git format-patch -2 

给了我2个补丁文件,每一个版本

git format-patch HEAD~2..HEAD 

给出了同样的事情。

git format-patch -1 HEAD~2..HEAD 

给出一个文件,但只包含对最后一个修订版的更改。

有没有办法在git中做到这一点?

+2

你能告诉我们更多关于你想要做什么的背景吗?您是否意识到可以通过交互式重新压缩来压缩承诺?如果是这样,你为什么要压缩发送给其他人的补丁,而不是你历史记录中的相应提交? – 2010-02-07 21:04:12

+0

@gbacon:我在发布这个问题后不久就了解了rebase。你说得对,这是对我的问题更好的解决方案。不过,知道如何做到这一点并不会让人伤心。 – 2010-02-07 22:15:12

+1

@GregBacon:我现在经常做的一件事是:在一个功能分支中工作,有很多小的提交。当需要将分支推向主时,首先将其压扁。但同时,我使用'git diff master mybranch'来发送一个补丁来进行审查,同时仍然保留我小的提交历史记录(供我自己使用)。 – 2012-08-21 00:36:33

回答

41
git diff HEAD~2..HEAD > my-patch.diff 

虽然它没有格式补丁的每个提交元数据。

+2

显然。如果这两个承诺有不同的作者,应该有什么作者? 2-commit更改的提交消息应该如何显示?等 – 2010-02-08 10:03:24

+0

请注意,如果您使用功能分支,您可以执行'git diff master mybranch> my-patch.diff'来为该分支创建一个补丁。 – 2012-08-21 00:34:40

0

你可以这样做:

 
$ git checkout -b tmp 
$ git reset HEAD~2 
$ git commit -a 

的承诺分支TMP将是一样的2个人提交。

+0

或'git rebase -i HEAD〜2',和南瓜。 – Tobu 2010-02-07 17:54:35

+3

呵呵,对6岁以上的答案投下一票!这是一些严肃的考古学。评论本来很好解释necrophilia。 – 2016-05-31 17:39:35

+0

我不是downvoter,但我想这是因为有更简单和更安全的方法来做到这一点; 'git reset'可以消除额外的东西。评论中给出的rebase会更安全一些,因为它至少可以告诉工作树是否脏。也就是说,我认为这个答案很有价值。 – Smar 2016-06-01 08:22:43

32

使用--stdout选项,然后将其捕获到文件中。

像这样:

git format-patch HEAD~2..HEAD --stdout > changes.patch 

这将使每个提交的元数据。

+2

你得到的是一个mbox文件(连接的邮件文件),而不是一个补丁文件。你可以用'git am'来应用它。您将无法使用标准工具来获得补丁文件。 – Tobu 2012-08-30 15:55:20

+0

@Tobu:但是你经常想用'git am'来应用提交,因为它保留了提交,而不是一大块代码...... – Smar 2016-06-01 08:20:49