Fusionner toutes les modifications d’une autre twig en tant que validation unique

Dans Git, existe-t-il un moyen de fusionner toutes les modifications d’une twig à l’autre, mais de les convertir en un seul en même temps?

Je travaille souvent sur une nouvelle fonctionnalité dans une twig distincte et je vais régulièrement commettre / pousser – principalement pour la sauvegarde ou pour transférer ce que je travaille sur une autre machine. La plupart de ces commits disent “Feature xxx WIP” ou quelque chose de redondant.

Une fois que ce travail est terminé et que je veux fusionner la twig WIP en master, j’aimerais supprimer tous ces commits intermédiaires, et juste un simple commit de validation.

Y a-t-il un moyen facile de faire ceci?

Sinon, que diriez-vous d’une commande qui écrase tout commet sur une twig depuis le point où elle était branchée?

Une autre option est git merge --squash puis enfin un git commit .

De Git fusionne

--squash

--no-squash

Produire l’arborescence de travail et l’état d’index comme si une fusion réelle s’était produite (à l’exception des informations de fusion), mais ne pas effectuer de validation ni déplacer HEAD , ni enregistrer $GIT_DIR/MERGE_HEAD pour que la prochaine commande git commit une fusion commettre. Cela vous permet de créer un seul engagement au-dessus de la twig en cours dont l’effet est identique à la fusion d’une autre twig (ou plus dans le cas d’une pieuvre).

Je l’ai trouvé! La commande de fusion a une option --squash

 git checkout master git merge --squash WIP 

à ce stade, tout est fusionné, peut-être en conflit, mais pas commis. Je peux donc maintenant:

 git add . git commit -m "Merged WIP" 

Essayez git rebase -i master sur votre twig. Vous pouvez ensuite changer tous les choix sauf un pour les “squash” afin de combiner les commits. Voir écraser les commits avec rebase

Enfin, vous pouvez ensuite faire la fusion à partir de la twig principale.

git merge --squash est une bonne option. Le “git commit” vous indique à tous les messages de validation de twig que vous souhaitez conserver.

Pour moins de commettre la fusion.

git merge do x fois –git réinitialise HEAD ^ –soft puis git commit.

Risque – les fichiers supprimés peuvent revenir.

Je voulais écraser tous les commits dans mon maître en un. J’ai essayé ceci sans succès:

 $ git checkout --orphan new_master $ git merge --squash master fatal: Squash commit into empty head not supported yet 

Donc j’ai fait ça:

 $ tar cf /tmp/git.tar --exclude .git . $ git checkout --orphan new_master $ tar xf /tmp/git.tar $ git commit -m "Initial commit" 

qui a bien fonctionné.

Vous pouvez le faire avec la commande “rebase”. Appelons les twigs “main” et “feature”:

 git checkout feature git rebase main 

La commande rebase rejouera tous les commits sur “feature” comme un commit avec un parent égal à “main”.

Vous pourriez vouloir lancer git merge main avant git rebase main si “main” a changé depuis la création de “feature” (ou depuis la fusion la plus récente). De cette façon, vous avez toujours votre historique complet au cas où vous auriez un conflit de fusion.

Après le rebase, vous pouvez fusionner votre twig en main, ce qui devrait aboutir à une fusion rapide:

 git checkout main git merge feature 

Voir la page rebase de Understanding Git Conceptually pour une bonne vue d’ensemble