Git écrase tous les commits dans la branche sans conflit

Un workflow de développement commun pour nous est de commander la branche b, d'y commettre un tas, puis d'écraser tous ces commits en un (toujours sur b).

Cependant, pendant le processus rebase -i pour écraser tous les commits, il y a souvent des conflits à plusieurs étapes.

Je veux essentiellement modifier la branche en un commit qui représente l'état du référentiel au moment de la validation finale sur b

J'ai fait quelques recherches mais je n'ai pas trouvé exactement ce que je cherche. Je ne veux pas merge --squash parce que nous aimerions tester la branche de fonctionnalité écrasée avant de fusionner.

21
demandé sur Andy Ray 2013-06-28 02:33:19

2 réponses

Si vous n'avez pas besoin des informations de validation, vous pouvez simplement effectuer une réinitialisation logicielle. Ensuite, les fichiers restent tels qu'ils étaient et lorsque vous validez, ce commit sera au-dessus du commit que vous avez réinitialisé.

Pour trouver le commit à réinitialiser:

git merge-base HEAD BRANCH_YOU_BRANCHED_FROM

Puis

git reset --soft COMMIT_HASH

Puis re-craft le commit, peut-être:

git commit -am 'This is the new re-created one commit'
43
répondu Rasmus Østergaard Kjær Voss 2015-06-23 12:21:14

Ceci est similaire à la réponse de Rasmus mais décomposé en trois étapes qui devraient toujours fonctionner:

$ git merge feature1
$ git reset --soft HEAD@{1}
$ git commit -c feature1

Explication:

  1. fusionner et résoudre les conflits
  2. garder les changements mis en scène mais réinitialiser à l'ancienne tête
  3. validez toutes les modifications en utilisant le message de validation et l'auteur de la dernière validation de la branche de fonctionnalité
5
répondu ColinM 2014-01-28 22:50:51