Question

J'ai huit commits sur une branche que j'aimerais envoyer par courrier électronique à des personnes qui ne sont pas encore éclairées. Jusqu'à présent, tout ce que je fais me donne 8 patchs ou commence à me donner des patchs pour chaque commit dans l'historique de la branche, depuis le début des temps. J'ai utilisé git rebase --interactive pour écraser les commits, mais maintenant, tout ce que j'essaie me donne des zillions de correctifs depuis le début des temps. Qu'est-ce que je fais mal?

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

La solution

Je vous conseillerais de procéder de la manière suivante sur une branche jetable. Si vos validations se trouvent dans le champ "nouvelles lignes". branche et vous êtes revenu sur votre " maître " branche déjà, 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 ça aide!

Autres conseils

Juste pour ajouter une solution supplémentaire au pot: Si vous utilisez plutôt ceci:

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

Ensuite, il y aura toujours 8 correctifs ... mais ils seront tous dans un seul fichier de correctif et s'appliqueront en tant que tel avec:

git am < my_new_patch.diff

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

git diff master > patch.txt

Ceci est une adaptation de la réponse d'Adam Alexander, au cas où vos modifications seraient dans la branche principale. Ceci fait ce qui suit:

  • Crée une nouvelle branche jetable " tmpsquash " à partir du point souhaité (recherchez la clé SHA exécutant "git --log" ou avec gitg. Sélectionnez le commit que vous voulez être en tête tmpsquash, les validations postérieures à master seront les validations écrasées).
  • Fusionne les modifications de master à tmpsquash.
  • Valide les modifications écrasées dans tmpsquash.
  • Crée le patch avec les commits compressés.
  • Retourne à la branche principale
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)$

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

Si vous souhaitez que vos 8 validations apparaissent sous la forme d'une seule correction et que la réécriture de l'historique de votre branche ne vous dérange pas (

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

ou, et ce serait une meilleure solution, relancez tous vos 8 commits à partir de X (le commit avant vos 8 commits) sur une nouvelle branche

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

De cette manière, vous ne disposez que d'un seul engagement pour la "livraison". branche, et cela représente tous vos 8 derniers commits

Format-patch entre deux balises:

git checkout <source-tag>
git checkout -b <tmpsquash>
git merge --squash <target-tag>
git commit -a -m "<message>"
git format-patch <source-tag>

Le moyen le plus simple consiste à utiliser git diff et à ajouter git log si vous souhaitez que le message de validation combiné que la méthode squash produise soit généré. Par exemple, pour créer le correctif entre commit abcd et 1234 :

git diff abcd..1234 > patch.diff
git log abcd..1234 > patchmsg.txt

Ensuite, lors de l'application du patch:

git apply patch.diff
git add -A
git reset patch.diff patchmsg.txt
git commit -F patchmsg.txt

N'oubliez pas l'argument - binaire de git diff lorsqu'il s'agit de fichiers non textuels, par exemple. images ou vidéos.

D'après la réponse d'Adam Alexander:

git checkout newlines
## must be rebased to master
git checkout -b temporary
# squash the commits
git rebase -i master
git format-patch master
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top