180 votes

Comment écrasez-vous dans un patch avec git format-patch?

J'ai huit s'engage sur une branche et j'aimerais la messagerie électronique à des personnes qui ne sont pas git éclairé, encore. Jusqu'à présent, tout ce que je fais soit me donne 8 fichiers de patch, ou qui commence à me donner des fichiers de correctifs pour tous s'engager dans la branche de l'histoire, depuis le début des temps. J'ai utilisé git rebase --interactive pour écraser les commits, mais maintenant, tout ce que j'ai essayer de me donne des milliards de patchs depuis le début des temps. Ce que je fais mal?

git format-patch master HEAD # yields zillions of patches, even though there's 
                             # only one commit since master

199voto

Adam Alexander Points 10883

Je recommande de le faire sur une branche jetable comme suit. Si vos commits sont dans la branche "newlines" et que vous êtes déjà revenu à votre branche "master", cela devrait faire l'affaire:

 [adam@mbp2600 example (master)]$ git checkout -b tmpsquash
Switched to a new branch "tmpsquash"

[adam@mbp2600 example (tmpsquash)]$ git merge --squash newlines
Updating 4d2de39..b6768b2
Fast forward
Squash commit -- not updating HEAD
 test.txt |    2 ++
 1 files changed, 2 insertions(+), 0 deletions(-)

[adam@mbp2600 example (tmpsquash)]$ git commit -a -m "My squashed commits"
[tmpsquash]: created 75b0a89: "My squashed commits"
 1 files changed, 2 insertions(+), 0 deletions(-)

[adam@mbp2600 example (tmpsquash)]$ git format-patch master
0001-My-squashed-commits.patch
 

J'espère que cela t'aides!

146voto

Taryn East Points 9698

Juste pour ajouter une autre solution au pot: Si vous l'utilisez plutôt:

 git format-patch master --stdout > my_new_patch.diff
 

Ensuite, il y aura toujours 8 patches ... mais ils seront tous dans un seul patch et s’appliqueront comme suit:

 git am < my_new_patch.diff
 

24voto

Rob Di Marco Points 18048

J'utilise toujours git diff dans votre exemple, quelque chose comme

 git diff master > patch.txt
 

22voto

VonC Points 414372

Comme vous le savez déjà, un git format-patch -8 HEAD vous donnera huit patchs.

Si vous voulez que votre 8 s'engage apparaissent comme un seul, et ne me dérange pas de réécrire l'histoire de votre branche (o-o-X-A-B-C-D-E-F-G-H), vous pouvez :

git rebase -i
// squash A, B, C, D, E ,F, G into H

ou, et ce serait une meilleure solution, relire tous vos 8 commits X (la validation avant votre 8 commits), sur une nouvelle branche

git branch delivery X
git checkout delivery
git merge master
git format-patch HEAD

De cette façon, vous n'avez qu'un commit sur la branche", et ce qu'il représente tous vos 8 derniers s'engage

19voto

rec Points 884

C'est une adaptation d'Adam Alexander réponse, au cas où vos modifications sont dans la branche principale. Cette procédez de la manière suivante:

  • Crée une nouvelle société de consommation de la branche "tmpsquash" à partir de ce que nous voulons (cherchez le SHA de la clé en cours d'exécution "git --log" ou avec gitg. Sélectionnez le commit que vous voulez être tmpsquash tête, les commits qui sont après que le maître sera écrasé s'engage).
  • Fusionne les modifications de maître à tmpsquash.
  • Engage l'écrasement des modifications à tmpsquash.
  • Crée le patch avec la prévenue s'engage.
  • Remonte à la branche master

laura@rune:~/example (master)$ git branch tmpsquash ba3c498878054e25afc5e22e207d62eb40ff1f38
laura@rune:~/example (master)$ git checkout tmpsquash
Switched to branch 'tmpsquash'
laura@rune:~/example (tmpsquash)$ git merge --squash master
Updating ba3c498..40386b8
Fast-forward
Squash commit -- not updating HEAD

[snip, changed files]

11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example  (tmpsquash)$ git commit -a -m "My squashed commits"
[test2 6127e5c] My squashed commits
11 files changed, 212 insertions(+), 59 deletions(-)
laura@rune:~/example  (tmpsquash)$ git format-patch master
0001-My-squashed-commits.patch
laura@rune:~/example  (tmpsquash)$ git checkout master
Switched to branch 'master'
laura@rune:~/example  (master)$

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X