Dans Git quand j'ai des commits par exemple. A - B - C
et je veux modifier le B
commit, je
git rebase -i <A-commit-hash>
,edit
devant B
commit,B
commit pour que je puisse corriger tout ce que je veux en utilisant git commit --amend
,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.
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:
git rebase
pour arriver au commit après la fusion (l'enfant de la fusion)git reset --hard HEAD^
pour accéder manuellement à la fusiongit commit --amend
pour réparer la fusiongit cherry-pick
pour revenir au commit après la fusiongit rebase --continue
pour finirVoici les étapes spécifiques:
deadbeef
.facef00d
.git rebase -i deadbeef
.facef00d
pour l'édition.facef00d
, courir git reset --hard HEAD^
. Vous devriez maintenant être à deadbeef
(git rev-parse HEAD
devrait afficher deadbeef
).git add
pour les mettre en scène.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
).git cherry-pick facef00d
pour appliquer les modifications apportées par facef00d
au commit de fusion fixe.git rebase --continue
pour finir.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