Je crée une nouvelle branche à partir de master
avec:
git checkout -b testbranch
Je fais 20 commits dedans.
Maintenant, je veux écraser ces 20 commits. Je fais ça avec:
git rebase -i HEAD~20
Et si je ne sais pas combien de commits? Est-il possible de faire quelque chose comme:
git rebase -i all on this branch
Une autre façon d'écraser tous vos commits est de réinitialiser l'index en maître:
git checkout yourBranch
git reset $(git merge-base master yourBranch)
git add -A
git commit -m "one commit on yourBranch"
Ce n'est pas parfait car cela implique que vous sachiez de quelle branche "yourBranch" vient.
Remarque: trouver que la branche d'origine n'est pas facile/possible avec Git (le la manière visuelle est souvent la plus facile) , comme vu ici ).
EDIT: vous devrez utiliser git Push --force
Karlotcha Hoa ajoute dans les commentaires :
Pour la réinitialisation, vous pouvez faire
git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))
[That] utilise automatiquement la branche sur laquelle vous vous trouvez.
Et si vous utilisez cela, , vous pouvez également utiliser un alias, car la commande ne repose pas sur le nom de la branche .
Ce que vous faites est plutôt sujet aux erreurs. Il suffit de faire:
git rebase -i master
ce qui rebase automatiquement uniquement les commissions de votre branche sur le dernier maître actuel.
Une autre façon simple de faire ceci: aller sur la branche Origin et faire un merge --squash
. Cette commande ne fait pas le commit "squased". lorsque vous le ferez, tous les messages de validation de yourBranch seront rassemblés.
$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
> [status 5007e77] Squashed commit of the following: ...
Consultez la branche pour laquelle vous souhaitez écraser tous les commits en un seul. Disons qu'il s'appelle feature_branch
.
git checkout feature_branch
Effectuez une réinitialisation logicielle de votre Origin/feature_branch
avec votre branche locale master
(selon vos besoins, vous pouvez également réinitialiser avec Origin/master). Cela réinitialisera tous les commits supplémentaires dans votre feature_branch
, mais sans modifier localement vos modifications de fichier.
git reset --soft master
Ajoutez toutes les modifications dans votre répertoire git repo au nouveau commit à créer. Et commettez la même chose avec un message.
git add -A && git commit -m "commit message goes here"
En supposant que vous ayez créé une branche à partir du maître, vous n'avez pas besoin d'entrer yourBranch
dans l'étape de réinitialisation à tout moment:
git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"
Explication :
git rev-list --count HEAD ^master
compte les validations depuis que vous avez créé votre branche d'objet à partir du maître, p.ex. 20.git reset --soft HEAD~20
effectuera une réinitialisation à chaud des 20 derniers commits. Cela laisse vos modifications dans les fichiers, mais supprime les commits.Utilisation :
Dans mon profil .bash, j'ai ajouté un alias pour gisquash
pour le faire avec une commande:
# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'
Après la réinitialisation et la validation, vous devez effectuer un git Push --force
.
Indice :
Si vous utilisez Gitlab> = 11.0, vous n’avez plus besoin de le faire car il a une option de compression lors de la fusion de branches.
Après avoir lu plusieurs questions et réponses de Stackoverflow sur la compression, je pense que c’est un bon moyen de supprimer les modifications sur une branche:
git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master
Ceci suppose que master est la branche de base.
Solution pour les personnes qui préfèrent cliquer:
Installer arbre source (c'est gratuit)
Vérifiez à quoi ressemblent vos commits. Très probablement, vous avez quelque chose de similaire à ceci
Faites un clic droit sur le parent commit. Dans notre cas, il s’agit d’une branche maîtresse.
Vous pouvez supprimer la validation avec la précédente en cliquant sur un bouton. Dans notre cas, nous devons cliquer 2 fois. Vous pouvez également modifier le message de validation
Les résultats sont impressionnants et nous sommes prêts à pousser!
Note latérale: Si vous poussez vos commits partiels vers la télécommande, vous devez utiliser la force Push Push après squash.