2010-02-07 7 views
35

Je voudrais créer un patch pour les 2 dernières révisions.En git, comment créer un seul patch pour les 2 dernières révisions?

git format-patch -2 

me donne 2 fichiers de patch, un pour chaque révision

git format-patch HEAD~2..HEAD 

donne la même chose.

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

donne un seul fichier, mais ne contient que des changements pour la dernière révision.

Y at-il un moyen de le faire dans git?

+2

Pouvez-vous nous en dire plus sur le contexte de ce que vous voulez faire? Connaissez-vous la capacité à écraser les commits avec rebase interactif? Si oui, pourquoi voudriez-vous écraser un patch que vous envoyez à d'autres, mais pas les commits correspondants dans votre histoire? –

+0

@gbacon: J'ai effectivement appris à propos de rebase peu après avoir posté cette question. Vous avez raison, c'est une meilleure solution à mon problème. Pourtant, ça ne peut pas faire de mal de savoir comment faire ça. –

+1

@GregBacon: Une chose que je fais maintenant souvent est: Travailler dans une branche de fonctionnalité, avec beaucoup de petits commits. Quand il est temps de pousser la branche à maîtriser, écrasez-la en premier. Mais en attendant, j'utilise 'git diff master mybranch' pour m'envoyer un patch à réviser, tout en conservant mon petit historique de commit (pour mon usage personnel). –

Répondre

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

Cependant, il n'aura aucune des métadonnées par commit de format-patch.

+2

Évidemment. Quel auteur devrait-il avoir si ces deux commits ont des auteurs différents? Comment devrait ressembler le message de commit pour le changement de 2-commit? Etc. –

+0

Notez que si vous utilisez des branches de fonctionnalité, vous pouvez simplement faire 'git diff master mybranch> mon-patch.diff' pour créer un patch pour cette branche. –

0

Vous pouvez faire quelque chose comme:

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

COMMIT à la branche tmp sera le même que l'individu 2 engage.

+0

ou 'git rebase -i HEAD ~ 2', et le squash. – Tobu

+3

Huh, un vote en baisse sur une réponse qui a bien plus de 6 ans! C'est une archéologie sérieuse. Un commentaire aurait été bien d'expliquer la nécrophilie. –

+0

Je ne suis pas le downvoter, mais je suppose que c'est parce qu'il y a des façons plus faciles et plus sûres de le faire; 'git reset' peut éradiquer quelque chose en plus. Le rebasement donné dans un commentaire serait un peu plus sûr puisqu'il indiquerait au moins si l'arbre de travail est sale. Cela dit, je pense que cette réponse a de la valeur. – Smar

32

Utilisez l'option --stdout, puis insérez-la dans un fichier.

comme ceci:

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

Cela permet de garder les métadonnées par-commit.

+2

Ce que vous obtenez est un fichier mbox (fichiers courrier concaténés), pas un fichier patch. Vous pouvez l'appliquer avec 'git am'. Vous ne pourrez pas utiliser les outils standard pour les fichiers de correctifs. – Tobu

+0

@Tobu: mais souvent vous voulez appliquer les commits avec 'git am', car cela maintient les commits comme ils sont, au lieu d'un gros blob de code ... – Smar