561 votes

Squash tous Git s’engage dans une seule validation

Comment vous écrasez votre référentiel vers le bas pour le premier commit ?

Je peux rebase à la première validation, mais qui me laisse avec 2 validations. Y a-t-il un moyen de faire référence à la validation avant la première ?

805voto

Jordan Lewis Points 3456

Dans les versions récentes de git, vous pouvez utiliser `` .

Pour chaque commit sauf le premier, changer à .

363voto

ryenus Points 679
git reset $(git commit-tree HEAD^{tree} -m "commit message")

Ici,"commit message" est juste un exemple, n'hésitez pas à utiliser votre propre langue.

tl;dr: pas besoin de squash, utilisez git commit-tree créer un orphelin s'engager et aller avec elle.

Expliquer:

  1. créer un seul commit via git commit-tree

    Ce git commit-tree HEAD^{tree} -m "commit message" n'est:

    Crée un nouvel objet commit basée sur la condition de l'arbre de l'objet et émet de la nouvelle révision identification de l'objet sur la sortie standard stdout. Le message de log est lire depuis l'entrée standard, à moins que-m ou-F options sont données.

    L'expression HEAD^{tree} signifie que l'objet de l'arborescence correspondant à l' HEAD, à savoir la pointe de votre arme actuelle. voir l' Arbre des Objets et de s'Engager-Objets.

  2. réinitialisation de la branche courante dans le nouveau commit

    Ensuite, git reset il suffit de réinitialiser la branche courante dans le nouvellement créé objet commit.

De cette façon, rien dans l'espace de travail est touché, il n'y a ni besoin de rebase/squash, ce qui le rend très rapide.

real    0m0.020s
user    0m0.000s
sys     0m0.016s

Et le temps nécessaire pour cela est sans importance à la taille et à la profondeur de l'histoire

154voto

Pat Notz Points 46841

Peut-être le moyen le plus simple est de simplement créer un nouveau référentiel avec l’état actuel de la copie de travail. Si vous voulez garder tous les messages de validation que vous pourriez faire tout d’abord `` puis que modifier pour le message de validation initiale dans le nouveau référentiel :

ou

62voto

kusma Points 3719
<pre><code></code><p>Ceci créera une validation orpheline avec l’arbre de la tête et son nom (SHA-1) sur stdout de sortie. Puis juste réinitialiser votre branche là.</p><pre><code></code></pre></pre>

35voto

Charles Bailey Points 244082

Le plus simple est d’utiliser la commande « plomberie » `` pour supprimer la branche actuels.

Vous ne pouvez pas utiliser `` car il a une soupape de sécurité pour arrêter de vous supprimer la branche actuels.

Cela vous replace dans l’état de « commit initial » où vous pouvez commencer avec une nouvelle validation initiale.

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