/ / Convertir la fusion en rebase sans avoir à refaire la fusion - git, git-merge, git-rebase, git-pull

Convertir la fusion en rebase sans avoir à effectuer à nouveau la fusion - git, git-merge, git-rebase, git-pull

J'ai fait une erreur: j'aurais dû utiliser git pull --rebase, mais j'ai publié un simple git pull, tout fusionné et maintenant un engagement de fusion à la tête de ma branche.

Je veux me débarrasser de cet engagement de fusion et je pensais que je d git rebase -i HEAD~3, déplace mon dernier engagement local vers le haut et squashla fusion se commet dedans. Hélas, le commit de fusion n'est pas disponible pour écraser. Si je fais cela, je vais dans des états intermédiaires où je dois refaire la fusion, ce qui est un lot de travail.

Y at-il un moyen de sortir de cela sans avoir à effectuer la fusion à nouveau? Il semble qu'il devrait être possible d'utiliser le commit de fusion d'une manière ou d'une autre?

Réponses:

17 pour la réponse № 1

tl; dr

Même si vous pouvez inclure des commits de fusion dans une base, vous ne pouvez pas "supprimer les commits de fusion. Git vous le fera savoir en disant:

Refuser d'écraser une fusion: <SHA-1>

Ce que vous pouvez faire pour conserver les modifications apportées lors de la fusion consiste à convertir le commit de fusion en commit normal. À ce stade, vous pouvez l'écraser comme n'importe quel autre commit.

En supposant HEAD pointe vers le commit de fusion:

git reset --soft HEAD~1  # Keeps changes in the index
git commit               # Create a new commit, this time not a merge commit
git rebase -i HEAD~4     # Do an interactive rebase and squash the new commit

Préservation des commits de fusion lors d'une rebase

En général, vous pouvez conserver les commits de fusion lors d’une refonte de base en utilisant git rebase -p.
Cependant, son but est de rejouer les commits menant à la fusion. Les modifications faisant partie de la fusion s’engagent (par exemple, les résolutions de conflits) ne sont pas conservées.

Voici de la Documentation:

-p
--preserve-fusionne
Recréez les commits de fusion au lieu d’aplatir l’historique en relisant les commits, puis introduit une validation de fusion. Fusionner le conflit les résolutions ou les modifications manuelles visant à fusionner les commits ne sont pas conservées.
Cela utilise le --interactive machines en interne, mais en les combinant avec le --interactive l'option est explicitement généralement pas une bonne idée sauf si vous savez ce que vous faites (voir BOGUES ci-dessous)

le punaise la documentation à laquelle il fait référence est déclenchée par la réorganisation des commits.