web-dev-qa-db-fra.com

Git: Comment écraser les commits avec merge-commit entre les deux?

Je travaille sur une branche de fonctionnalité.

  1. A fait plusieurs commits. Squashed commits.
  2. Modifications poussées de la branche distante. Vous avez des conflits.
  3. Fusion des modifications du maître, résolution des conflits sur la branche de fonctionnalité. (git fetch Origin master> git merge FETCH_HEAD> résolution des conflits manuellement> git commit> git Push)
  4. J'ai fait un autre commit.

Ainsi, l'historique des validations actuel ressemble à ceci. De l'actuel à l'ancien:

  1. commit 3
  2. commit M yyy (fusionné)
  3. commit 2

Comment puis-je écraser au-dessus de 3 commits en 1 avant de fusionner ma branche de fonctionnalité en master?

41
Miral

Vous pouvez rebase -i En commençant par le parent de commit 2 (C'est-à-dire la validation sur master à partir de laquelle vous avez créé une branche. Vous devrez probablement résoudre à nouveau les conflits lorsque vous obtiendrez au commit de fusion.

Donc, si votre histoire ressemble

  * D commit 3 (HEAD)
  * M merge
 /|
| * C commit 2
* | B commit on master
|/
* A (master)

Commencez avec git rebase -i A. Vous verrez une liste de validations comprenant à la fois master et your_branch, Mais pas la validation de fusion. pick le premier (B ou C, selon le moment) et squash le reste.

23
Kristján

Dans mon cas, j'ai commencé à travailler avec une branche qui avait plusieurs validations, puis une fusion avec la branche principale/source, puis plus de validations et je voulais supprimer toutes les validations, mais je continuais à rencontrer une erreur en raison de la validation de fusion:

erreur: commit est une fusion mais aucune option -m n'a été donnée.

-> C1-> C2-> M (fusion avec la branche source) -> C3-> C4

Il y a probablement une meilleure façon (et j'ai hâte d'apprendre), mais ce que j'ai fini par faire après beaucoup de lecture et d'essais et d'erreurs a été de créer une branche de copie pour référence, puis de rétablir la branche actuelle en C1,

reset --hard (hachage C1)

puis cerise-cueillette C2, C3, C4, puis écrasement, puis rebasage ... résultant en:

M-> C

(juste un commit qui a été rebasé avec la source!)

J'espère que cela aide quelqu'un d'autre avec le même problème.

0
user6096790