Question Squash mon dernier X commits ensemble en utilisant Git


Comment est-ce que je peux écraser mes derniers X commits dans un commit en utilisant Git?


2314
2018-03-04 04:11


origine


Réponses:


Utilisation git rebase -i <after-this-commit> et remplacer "pick" sur le deuxième et commits suivants avec "squash" ou "fixup", comme décrit dans Le manuel.

Dans cet exemple, <after-this-commit> est soit le hachage SHA1, soit l'emplacement relatif de HEAD de la branche en cours à partir de laquelle les commits sont analysées pour la commande rebase. Par exemple, si l'utilisateur souhaite voir 5 validations de l'actuel HEAD dans le passé, la commande est git rebase -i HEAD~5.


1267
2018-03-04 04:18



Vous pouvez le faire assez facilement sans git rebase ou git merge --squash. Dans cet exemple, nous écraserons les 3 derniers validations.

Si vous voulez écrire le nouveau message de validation à partir de rien, cela suffit:

git reset --soft HEAD~3 &&
git commit

Si vous voulez commencer à éditer le nouveau message de commit avec une concaténation des messages de commit existants (c'est-à-dire similaire à ce qu'un pick / squash / squash / ... / squash git rebase -i liste d'instructions commencerait avec), alors vous devez extraire ces messages et les transmettre à git commit:

git reset --soft HEAD~3 && 
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Ces deux méthodes écrasent les trois dernières validations en une seule nouvelle validation de la même manière. La réinitialisation logicielle redirige simplement HEAD vers le dernier commit que vous ne voulez pas écraser. Ni l'index ni l'arbre de travail ne sont touchés par la réinitialisation logicielle, laissant l'index dans l'état souhaité pour votre nouveau commit (c'est-à-dire qu'il a déjà tous les changements des commits que vous êtes sur le point de "jeter").


2587
2018-03-05 04:19



Vous pouvez utiliser git merge --squash pour cela, qui est légèrement plus élégant que git rebase -i. Supposons que vous soyez maître et que vous vouliez écraser les 12 derniers commits en un seul.

AVERTISSEMENT: Assurez-vous d'abord de commettre votre travail - vérifiez que git status est propre (depuis git reset --hard jettera les changements mis en scène et non mis en scène)

Alors:

# Reset the current branch to the commit just before the last 12:
git reset --hard HEAD~12

# HEAD@{1} is where the branch was just before the previous command.
# This command sets the state of the index to be as it would just
# after a merge from that commit:
git merge --squash HEAD@{1}

# Commit those squashed changes.  The commit message will be helpfully
# prepopulated with the commit messages of all the squashed commits:
git commit

le documentation pour git merge Décrit le --squash option plus en détail.


Mettre à jour: le seul véritable avantage de cette méthode sur le plus simple git reset --soft HEAD~12 && git commit suggéré par Chris Johnsen dans sa réponse est que vous obtenez le message de validation pré-rempli avec chaque message de commit que vous écrasez.


573
2018-03-04 06:10



Je recommande d'éviter git reset si possible - en particulier pour Git-novices. Sauf si vous avez vraiment besoin d'automatiser un processus basé sur un nombre des commits, il y a un moyen moins exotique ...

  1. Placez les commits à écraser sur une branche de travail (si ce n'est déjà fait) - utilisez gitk pour cela
  2. Découvrez la branche cible (par exemple, "maître")
  3. git merge --squash (working branch name)
  4. git commit

Le message de validation sera pré-rempli en fonction du squash.


135
2018-03-14 23:24



Basé sur La réponse de Chris Johnsen,

Ajouter un alias "squash" global de bash: (ou Git Bash sous Windows)

git config --global alias.squash '!f(){ git reset --soft HEAD~${1} && git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"; };f'

... ou en utilisant l'invite de commande de Windows:

git config --global alias.squash "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Votre ~/.gitconfig devrait maintenant contenir cet alias:

[alias]
    squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f"


Usage:

git squash N

... Qui écrase automatiquement le dernier N commits, inclusifs.

Remarque: Le message de validation résultant est une combinaison de tous les commits écrasés, dans l'ordre. Si vous n'êtes pas satisfait de cela, vous pouvez toujours git commit --amendpour le modifier manuellement. (Ou modifiez l'alias pour qu'il corresponde à vos goûts.)


97
2018-02-19 19:21



Si vous utilisez TortoiseGit, vous pouvez utiliser la fonction Combine to one commit:

  1. Ouvrir le menu contextuel TortoiseGit
  2. Sélectionner Show Log
  3. Marquez les validations pertinentes dans la vue du journal
  4. Sélectionner Combine to one commit à partir du menu contextuel

Combine commits

Cette fonction exécute automatiquement toutes les étapes git simples nécessaires. Malheureusement seulement disponible pour Windows.


46
2017-11-06 12:51



Grâce à ce blog pratique J'ai trouvé que vous pouvez utiliser cette commande pour écraser les 3 derniers commits:

git rebase -i HEAD~3

Ceci est pratique car cela fonctionne même lorsque vous êtes sur une branche locale sans informations de suivi / repo à distance.

La commande ouvrira l'éditeur de rebasage interactif qui vous permettra ensuite de réorganiser, écraser, reformuler, etc. comme d'habitude.


46
2018-05-17 06:19



Basé sur Cet article J'ai trouvé cette méthode plus facile pour mon utilisation.

Ma branche 'dev' devançait 'origin / dev' par 96 commits (donc ces commits n'étaient pas encore poussés vers la télécommande).

Je voulais écraser ces commits en un avant de pousser le changement. Je préfère réinitialiser la branche à l'état 'origin / dev' (cela laissera toutes les modifications des 96 validations non-validées), puis valider les modifications à la fois:

git reset origin/dev
git add --all
git commit -m 'my commit message'

29
2018-05-22 00:41



Pour ce faire, vous pouvez utiliser la commande git suivante.

 git rebase -i HEAD~n

n (= 4 ici) est le numéro de la dernière validation. Ensuite, vous avez les options suivantes,

pick 01d1124 Message....
pick 6340aaa Message....
pick ebfd367 Message....
pick 30e0ccb Message....

Mettre à jour comme ci-dessous,

p 01d1124 Message....
s 6340aaa Message....
s ebfd367 Message....
s 30e0ccb Message....

Pour plus de détails, cliquez sur le Lien

Bonne chance!!


24
2018-04-06 05:26