web-dev-qa-db-fra.com

Comment puis-je fusionner les deux derniers commits?

Je veux combiner mes deux derniers commits. Voici le résultat de git log:

Enter image description here

Maintenant, je veux fusionner ces deux derniers commits (qui sont dans la zone de lecture) en un seul commit. Comment puis je faire ça?

11
stack

Il existe plusieurs façons de le faire (en utilisant rebase ou reset).

L'approche utilisant git reset :

  1. Quelle que soit l'approche, assurez-vous avant tout que la copie de travail est propre. Utilisation git status pour le savoir. S'il y a des modifications non validées, enregistrez-les dans une cachette ( git stash ou les valider sur une branche temporaire.
  2. Courir git branch backup pour créer une branche de sauvegarde sur le commit actuel.
    Ce n'est pas vraiment nécessaire (le même résultat peut être obtenu en utilisant reflog ou en écrivant le hachage du commit actuel) mais c'est le moyen le plus simple de restaurer l'état actuel en cas de problème.
  3. Courir git reset --soft HEAD~2 .
    Cela déplace HEAD deux validations dans le passé (lors de la validation e8de117) sans modifier l'arborescence de travail ou l'index. L'index et l'arborescence de travail ressemblent maintenant à ce qu'ils étaient juste avant de créer le commit 6aa74e4. Tous les fichiers modifiés au cours des deux dernières validations seront déjà ajoutés à l'index. Parce que HEAD est sur e8de117, le prochain commit sera créé au-dessus de e8de117 (il "remplacera" les commits 6aa74e4 et 77c15d6).
  4. Courir git commit . Vous devrez saisir un nouveau message de validation.
  5. Si le résultat ne vous ressemble pas ( git diff backup ne devrait signaler aucune différence) ou si vous avez changé d'avis, exécutez git reset --hard backup pour revenir d'où vous êtes parti (en fait, juste après l'étape 2).
  6. Si vous êtes satisfait de la sortie, supprimez la branche backup créée à l'étape 2 ( git branch -D backup ).
  7. C'est tout.
16
axiac

Vous recherchez la fonction squash d'un rebase interactif:

Utilisation git rebase -i HEAD~2 pour démarrer un rebase interactif. Dans l'éditeur d'ouverture, toutes les validations faisant partie du rebase sont répertoriées. Dans ce cas, puisque nous avons fourni le HEAD~2 argument à l'appel rebase, nous voyons deux commits, chacun préfixé par pick. Ne rien changer conduirait rebase à pick, c'est-à-dire appliquer les deux validations, et rien ne serait différent. Au lieu de cela, ce que vous voulez faire est de pick un seul commit, tandis que squashing l'autre. De cette façon, vous écrasez le deuxième commit dans le premier, résultant en un seul commit. Lorsque vous êtes sûr et que vous quittez maintenant, git vous proposera un nouveau message de validation, et voilà: une nouvelle validation contenant les modifications des deux anciennes validations.

Voir ici pour des instructions détaillées.

Comme toujours lorsque vous jouez avec l'histoire (comme l'écrasement de différentes validations dans une nouvelle est certainement), vous ne devez effectuer de telles opérations que sur des validations sur lesquelles personne d'autre n'est basé.

14
kowsky