11
votes

Comment utiliser Git Rebase -i après la fusion de Git sans gâcher les choses?

J'ai la situation suivante: J'ai fabriqué des engagements à mon référentiel local, puis une énorme fusée d'une autre branche (~ 150 commettre) dans le maître - elle avait beaucoup de conflits dedans.

Maintenant, je veux déplacer un commettre que j'ai fait avant que la fusion soit après elle avant de pousser.

Normalement, j'utiliserais "Rebase -I" pour cela.

Malheureusement, le comportement par défaut consiste à briser la fusion-commission que j'ai fait cela qui a réellement ajouté 150 de plus en plus de maîtriser dans des commits distincts (je comprends que c'est comme si j'utilisais Rebase au lieu de fusionner pour commencer) - ce qui est fusionner pour commencer) - ce qui est mauvais comportement pour moi pour plusieurs raisons.

J'ai découvert le drapeau "-P" pour la Rebase, qui conserve la fusion et l'a été très heureuse. Malheureusement, cela a réellement appliqué la même fusion à nouveau et a tout oublié de mon travail acharné dans la résolution des conflits. Encore une fois - mauvais comportement!

Y a-t-il une solution pour ce que je veux? Utilisation de Rebase -I Après se fusionner pour ré-commander ou modifier des engagements spécifiques sans avoir à répéter mes opérations post-fusion?

merci!


2 commentaires

Avez-vous consulté Git Rere ?


Git Rere Je ne peux pas vous aider maintenant, car il enregistre la résolution de conflit lorsque vous commettez la fusion ... sauf qu'il y a un script appelé rere-train.sh dans le répertoire de contributions de git «La base de données Rerere de Fusion commente que vous avez déjà fait.


3 Réponses :


17
votes

Voici ce que Rere-Train.sh Script I mentionné dans mon commentaire - essentiellement, il refait la fusion, utilise votre résolution et laisse simplement le voir. Vous pouvez le faire manuellement pour votre juste commettre si vous le souhaitez:

git checkout <parent of merge commit>
git merge <merged commit>         # if this goes cleanly, we're done
git rerere                        # done automatically if rerere.enabled is true
git checkout <merge commit> -- .  # check out the files from the result of the merge
git rerere                        # done automatically if rerere.enabled is true
git reset --hard                  # wipe away the merge

# and you'd want to follow with git checkout <branch> to return to where you were


5 commentaires

Wow, cela ressemble à Git-Fu sérieux!


@Benjol: La résolution des conflits est une affaire sérieuse! (Mais ce n'est pas vraiment effrayant - activez simplement RERERE dans la configuration et laissez la magie se produire.)


@Jez: Comme il est essentiel que tous les liens vers des manquages ​​postés ici avant la fermeture de la dernière chute de Kernel.org. Je ne pense pas que quiconque a eu l'intention d'essayer de trouver tout d'entre eux à ce stade.


Pour exécuter RERERE-TRAIN sur une gamme de commits Utilisez le .. Notation I.E. ^ .. branche actuelle> . Le script ( Github.com/git/git/blob/master /contribe/rere-Train.sh ) passe simplement les arguments à Git Rev-List --Parents et la syntaxe spécifiée dans la réponse ne limitera pas la plage comme décrit.


J'espère que le commettre des parents fait référence au parent de la dernière commission dans la branche cible, où la fusion s'est produite ... Il y a deux parents pour une commission fusion, y compris celui de la branche source.



1
votes

J'ai fait un script pour faire ce ici . Voir le Ouvrir les problèmes pour des limitations connues.

Vous aurez besoin d'abord Installez rere-train.sh sur votre chemin. Sur Fedora, cela peut être fait avec: xxx


0 commentaires

1
votes

utilisé rerere-train.sh code> de l'utilisateur @ réponse de Jefromi. Cependant, j'ai eu cette erreur:

$ ../rerere-train.sh HEAD
C:\Program Files\Git\mingw64/libexec/git-core/git-sh-setup: line 6: .: git-sh-i18n: file not found


0 commentaires