web-dev-qa-db-fra.com

Git: Comment écraser tous les commits sur les branches

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

214
user3803850

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 .

272
VonC

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.

90
Eevee

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: ...
63
WaZaA

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

Étape 1:

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

Étape 2:

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"

52
shanky

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. Gitlab Squashing option

22
mles

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.

12
Travis Reeder

Solution pour les personnes qui préfèrent cliquer:

  1. Installer arbre source (c'est gratuit)

  2. Vérifiez à quoi ressemblent vos commits. Très probablement, vous avez quelque chose de similaire à ceci enter image description here

  3. Faites un clic droit sur le parent commit. Dans notre cas, il s’agit d’une branche maîtresse.

enter image description here

  1. 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 enter image description here

  2. Les résultats sont impressionnants et nous sommes prêts à pousser! enter image description here

Note latérale: Si vous poussez vos commits partiels vers la télécommande, vous devez utiliser la force Push Push après squash.

2
Marcin Szymczak