web-dev-qa-db-fra.com

Modifier un commit de fusion avec git rebase

Dans Git quand j'ai des commits par exemple. A - B - C et je veux modifier le B commit, je

  • utilisation git rebase -i <A-commit-hash>,
  • dans la liste j'écris la commande edit devant B commit,
  • git rebase s'arrête juste après B commit pour que je puisse corriger tout ce que je veux en utilisant git commit --amend,
  • puis je continue d'utiliser git rebase --continue.

Pour autant que je sache, c'est la meilleure pratique pour y parvenir. Avec cette méthode, je peux éditer n'importe quel commit dans le passé (tant qu'il n'a pas encore été poussé vers une branche distante), et en plus avec -p flag Je peux même conserver les fusions. C'est tout simplement génial.

Mon problème actuel est: j'ai fait une erreur (faute de frappe) sur une ligne dans un commit de fusion (lors de la résolution d'un conflit lors de la fusion de deux branches).

Je voudrais le réparer mais je ne sais pas comment faire git rebase pour s'arrêter à un commit de fusion. Le git rebase -p -i <blah> list ignore les validations de fusion, donc je ne peux pas écrire la commande edit devant et faire la git rebase arrêtez-vous là pour me laisser le modifier.

Vous avez besoin d'aide? Je veux juste corriger cette ligne dans le commit de fusion tout en préservant tous les commits (et les fusions) après.

Merci.

48
vasekch

Git ne facilite pas les rebases interactifs lorsque des fusions sont impliquées. Le -p L'option utilise le -i mécanisme interne, donc mélanger les deux ne fonctionne pas vraiment.

Pourtant, git rebase est juste un moyen automatisé de faire beaucoup de choix. Vous pouvez reproduire son comportement en sélectionnant manuellement les cerises pour obtenir un peu plus de contrôle sur le processus. C'est moins pratique et plus sujet aux erreurs humaines, mais c'est possible.

Voici l'approche que je propose:

  1. utilisation git rebase pour arriver au commit après la fusion (l'enfant de la fusion)
  2. utilisation git reset --hard HEAD^ pour accéder manuellement à la fusion
  3. utilisation git commit --amend pour réparer la fusion
  4. utilisation git cherry-pick pour revenir au commit après la fusion
  5. utilisation git rebase --continue pour finir

Voici les étapes spécifiques:

  1. Notez l'ID SHA1 du commit de fusion que vous souhaitez modifier. Pour la discussion, supposons qu'il s'agit de deadbeef.
  2. Notez l'ID SHA1 du commit juste après le commit de fusion que vous souhaitez modifier (l'enfant du commit de fusion). Supposons que ce soit facef00d.
  3. Courir git rebase -i deadbeef.
  4. Sélectionnez facef00d pour l'édition.
  5. Lorsque rebase vous renvoie à une invite pour modifier facef00d, courir git reset --hard HEAD^. Vous devriez maintenant être à deadbeef (git rev-parse HEAD devrait afficher deadbeef).
  6. Apportez vos modifications pour corriger le conflit de fusion incorrect et utilisez git add pour les mettre en scène.
  7. Courir git commit --amend pour fusionner le correctif intermédiaire avec le mauvais commit de fusion. Le résultat aura désormais un SHA1 différent (pas deadbeef).
  8. Courir git cherry-pick facef00d pour appliquer les modifications apportées par facef00d au commit de fusion fixe.
  9. Courir git rebase --continue pour finir.
74
Richard Hansen

Il peut être plus facile de créer un commit de correction "D" puis d'utiliser "git rebase -p -i <blah> 'pour réorganiser' D 'juste après' B 'et l'écraser en' B '.

pick A
pick B  <- merge commit to ammend
fixup D
pick C
1
i3ensays