Supposons que vous ayez un historique contenant les trois commits A, B et C :
A-B-C
Je voudrais combiner les deux validations A et B en une seule validation AB :
AB-C
j'ai essayé
git rebase -i A
qui ouvre mon éditeur avec le contenu suivant:
pick e97a17b B
pick asd314f C
Je change cela en
squash e97a17b B
pick asd314f C
Ensuite, Git 1.6.0.4 dit:
Cannot 'squash' without a previous commit
Y a-t-il un moyen ou est-ce simplement impossible?
git
rebase
git-rebase
git-rewrite-history
Christian
la source
la source
Réponses:
Utiliser à
git rebase -i --root
partir de la version 1.7.12 de Git .Dans le fichier de rebase interactif, changez la deuxième ligne de commit B en squash et laissez les autres lignes au choix :
Cela combinera les deux validations A et B en une seule validation AB .
Trouvé dans cette réponse .
la source
Tu as essayé:
Il est possible de commencer comme ça si vous continuez
edit
plutôt quesquash
:puis exécutez
Terminé.
la source
git rebase --abort
pour recommencer et le faire de la bonne façon (ne pas écraser le premier commit dans l'éditeur)A
était le commit initial, mais maintenant vous voulezB
être le commit initial. Les commits git sont des arbres entiers, pas des différences même s'ils sont normalement décrits et vus en termes de différences qu'ils introduisent.Cette recette fonctionne même s'il y a plusieurs validations entre A et B, et B et C.
la source
git rebase --onto tmp <sha1_for_B>
Dans le cas d'un rebasage interactif, vous devez le faire avant A pour que la liste soit:
devenir:
Si A est le commit initial, vous devez avoir un commit initial différent avant que A. Git ne pense aux différences, cela fonctionnera sur la différence entre (A et B) et (B et C). Par conséquent, la courge ne fonctionne pas dans votre exemple.
la source
Dans le cas où vous avez des centaines ou des milliers de commits, en utilisant la réponse de kostmo de
peut être peu pratique et lent, simplement en raison du grand nombre de validations que le script de rebase doit traiter deux fois , une fois pour générer la liste de l'éditeur de rebase interactif (où vous sélectionnez l'action à effectuer pour chaque validation), et une fois pour réellement exécuter le réapplication des commits.
Voici une solution alternative qui évitera le coût en temps de génération de la liste de l'éditeur de rebase interactif en n'utilisant pas de rebase interactif en premier lieu. De cette façon, c'est similaire à la solution de Charles Bailey . Vous créez simplement une branche orpheline à partir du deuxième commit, puis rebase toutes les validations descendantes par-dessus:
Documentation
la source
Dans une question connexe, j'ai réussi à trouver une approche différente de la nécessité de s'affranchir du premier commit, qui est, eh bien, d'en faire le second.
Si vous êtes intéressé: git: comment insérer un commit comme premier, en déplaçant tous les autres?
la source
Commande Git pour l'équipe: git rebase -i HEAD ~ [nombre de validations]
Disons que vous avez ci-dessous l'historique des commits git:
pick 5152061 feat: Ajout de la prise en charge de l'enregistrement de l'image. (A)
pick 39c5a04 Fix: corrections de bugs. (B)
Choisissez le correctif 839c6b3: conflit résolu. (C)
Maintenant, vous voulez écraser A et B en AB, procédez comme suit:
pick 5152061 feat: Ajout de la prise en charge de l'enregistrement de l'image. (A)
s 39c5a04 Correction: correction de bogues. (B)
Choisissez le correctif 839c6b3: conflit résolu. (C)
Remarque: pour le squashing commit, nous pouvons utiliser squash ou s. Le résultat final sera:
choisissez 5152061 feat: Ajout de la prise en charge de l'enregistrement de l'image. (AB)
Choisissez le correctif 839c6b3: conflit résolu. (C)
la source
Vous devez effectuer un peu de magie en ligne de commande.
Cela devrait vous laisser avec une branche qui a AB et C comme commits.
la source