103 votes

Git rebase après une fusion (merge) git précédente

J'ai la situation suivante:

  • J'ai créé un clone (Y) à partir d'un dépôt principal (X), car il y avait beaucoup de personnes qui travaillaient sur Y nous n'avons pas fait de rebase mais seulement des merges. Lorsque nous voulons livrer (push) Y à X, nous aimerions faire un rebase afin d'avoir les choses propres et claires

Le problème est que lorsqu'on fait un rebase, on nous demande de refaire toutes les merges que nous avons déjà faites dans les étapes de merge précédentes. Y a-t-il une solution à cela, à part celle qui signifie effectivement refaire les merges?

Je m'attendais à ce que ce soit assez simple puisque nous avions déjà résolu les merges conflictuels.

1voto

trorbl trapper Points 13

J'ai trouvé la réponse de @sky utile. Et j'en ai fait une fonction squash-rebase.

En supposant que vous êtes sur votre-branche, ce que cela fait est de créer une branche votre-branche-tmp qui est le résultat de faire merge --squash sur main. Il préserve également tous les messages de commit et vous permet de les éditer. Importamment, cela laisse également votre branche actuelle inchangée.

Après avoir exécuté squash-rebase, si vous êtes satisfait de ce qu'il a fait, vous devez effectuer une réinitialisation complète sur la branche tmp. Ensuite, vous avez effectivement terminé un squash rebase.

function squash-rebase() {
  MESSAGES="$(git log $(git merge-base main HEAD)..HEAD --reverse --format=%B)"
  SRC_BRANCH="$(git_current_branch)"
  TMP_BRANCH="$(git_current_branch)-tmp"
  echo "création de la branche temporaire $TMP_BRANCH à partir de $(git_current_branch)"
  git checkout -b $TMP_BRANCH main  # créer la branche tmp à partir de main et checkout
  git merge $SRC_BRANCH --squash
  git commit -m "$MESSAGES" -n
  git commit --amend -n # juste pour pouvoir éditer les messages
  git checkout $SRC_BRANCH
  echo "IMPORTANT : exécutez git reset --hard $TMP_BRANCH pour terminer le squash rebase."
  echo "Tout d'abord, vous pouvez exécuter git diff $TMP_BRANCH pour vous assurer qu'il n'y a pas de changements."
  echo "Enfin, supprimez la branche tmp avec git branch -D $TMP_BRANCH"
}

Remarque : cela suppose que vous utilisez oh-my-zsh, sinon vous devrez trouver un autre moyen d'obtenir le nom de la branche actuelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X