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 soit 8 fichiers de correctifs, soit commence à me donner des fichiers de correctifs 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'essaye me donne des millions 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
git
patch
squash
git-squash
sauter
la source
la source
Réponses:
Je recommanderais 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:
J'espère que cela t'aides!
la source
git comit -m "My squashed commits"
sinon cela ajouterait d'autres fichiers non suivisgit checkout 775ec2a && git checkout -b patch && git merge --squash branchname
Juste pour ajouter une autre solution au pot: Si vous utilisez ceci à la place:
Ensuite, il y aura toujours 8 patchs ... mais ils seront tous dans un seul fichier de patch et s'appliqueront comme un seul avec:
la source
git rebase -i ...
les réduire à un seul.J'utilise toujours git diff donc dans votre exemple, quelque chose comme
la source
git log
, voir ma réponse pour un exempleCeci est une adaptation de la réponse d'Adam Alexander, au cas où vos changements seraient dans la branche principale. Procédez comme suit:
la source
Comme vous le savez déjà, a
git format-patch -8 HEAD
vous donnera huit patchs.Si vous voulez que vos 8 commits apparaissent comme un seul, et que cela ne vous dérange pas de réécrire l'historique de votre branche (
o-o-X-A-B-C-D-E-F-G-H
), vous pouvez:ou, et ce serait une meilleure solution, rejouez tous vos 8 commits depuis
X
(le commit avant vos 8 commits) sur une nouvelle brancheDe cette façon, vous n'avez qu'un seul commit sur la branche "livraison", et cela représente tous vos 8 derniers commits
la source
git merge master
fait simplement une avance rapide et n'écrase pas les engagements en un seul. Remplacez pargit merge --squash master
pour que tous les commits soient écrasés et visibles dans la zone intermédiaire. Votre flux fonctionnera avec ce changement. (J'utilise la version 2.1.0 de git.)Patch de format entre deux balises:
la source
Le moyen le plus simple est d'utiliser
git diff
et d'ajoutergit log
si vous voulez le message de validation combiné que la méthode squash produirait. Par exemple, pour créer le patch entre commitabcd
et1234
:Puis lors de l'application du patch:
N'oubliez pas l'
--binary
argumentgit diff
lorsque vous traitez avec des fichiers non texte, par exemple des images ou des vidéos.la source
Basé sur la réponse d'Adam Alexander:
la source