124 votes

Supprimer le dernier commit dans bitbucket

J'ai fait une erreur et je ne sais pas comment supprimer ma dernière poussée dans le référentiel. Je tire les dernières mises à jour de l'application mais il y a des conflits et je la pousse dans le dépôt.

Comment supprimer mon dernier commit ? Ou comment le réparer ?

116voto

asermax Points 2963

En premier lieu, si vous travaillez avec d'autres personnes sur le même référentiel de code, vous ne devrait pas supprimer un commit car lorsque vous forcez la mise à jour sur le dépôt, cela laissera les dépôts locaux de vos collègues dans un état illégal (par exemple, s'ils ont fait des commits après celui que vous avez supprimé, ces commits seront invalides car ils étaient basés sur un commit maintenant inexistant).

Cela dit, ce que vous pouvez faire, c'est revenir à l'engagement. Cette procédure est effectuée différemment (différentes commandes) selon le CVS que vous utilisez :

Sur git :

git revert <commit>

Sur mercuriel :

hg backout <REV>

EDITAR: L'opération de réversion crée un nouveau commit qui fait l'opposé du commit révoqué (par exemple, si le commit original a ajouté une ligne, le commit de réversion supprime cette ligne), supprimant effectivement les changements du commit non désiré sans réécrire l'historique du dépôt.

105voto

naught101 Points 2023

Si vous êtes no travailler avec les autres (ou être heureux de leur causer des ennuis importants) il est alors possible de supprimer les commits des branches bitbucket.

Si vous essayez de modifier une branche non-master :

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

si vous essayez de modifier la branche master

Dans git en général, la branche master n'est pas spéciale - c'est juste une convention. Cependant, bitbucket et github et les sites similaires exigent généralement qu'il y ait une branche principale (probablement parce que c'est plus facile que d'écrire plus de code pour gérer le cas où un dépôt n'a pas de branches - pas sûr). Vous devez donc créer une nouvelle branche, et en faire la branche principale :

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

Sur Bitbucket, allez dans les paramètres du référentiel, et changez la "branche principale" en master_temp (sur Github, changez la "Default branch").

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

Maintenant, allez sur Bitbucket, et vous devriez voir l'historique que vous voulez. Vous pouvez maintenant aller sur la page des paramètres et changer la branche principale en master .

Ce processus fonctionnera également avec toute autre modification de l'historique (par ex. git filter-branch ). Vous devez juste vous assurer de réinitialiser les commits appropriés, avant que le nouvel historique ne soit séparé de l'ancien.

modifier Le problème est qu'apparemment vous n'avez pas besoin de faire tout cela sur github, car vous pouvez forcer une branche de réinitialisation .

Traiter avec des collaborateurs gênants

La prochaine fois que quelqu'un essaiera de tirer de votre dépôt, (s'il a déjà tiré le mauvais commit), le tirage échouera. Il devra manuellement revenir à un commit antérieur à la modification de l'historique, puis effectuer un nouveau tirage.

git reset HEAD^
git pull

S'ils ont fait le mauvais coup, et engagé par-dessus alors ils devront réinitialiser, et ensuite git cherry-pick les bons commits qu'ils veulent créer, recréant effectivement la branche entière sans le mauvais commit.

S'ils n'ont jamais effectué le mauvais commit, alors tout ce processus ne les affectera pas, et ils pourront effectuer le commit normalement.

60voto

Shubanker Points 2405

Vous pouvez réinitialiser à HEAD^ puis le pousser de force.

git reset HEAD^
git push -u origin master --force

Cela supprimera votre dernier commit et sera reflété sur bitbucket comme commit supprimé mais restera toujours sur leur serveur.

16voto

icwnd Points 1130

Voici une approche simple en 4 étapes maximum :

0 - Aviser l'équipe que vous allez corriger le dépôt.

Communiquez avec l'équipe et informez-la des changements à venir.

1 - Supprimer le dernier commit

En supposant que votre branche cible est master :

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

À ce stade, vous avez terminé si vous travaillez seul.

2 - Corriger les dépôts locaux de vos coéquipiers

Sur celui de votre coéquipier :

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

Si votre coéquipier n'a pas de nouveaux commits, vous avez terminé à ce stade et vous devriez être en phase.

3 - Ramener les engagements perdus

Disons qu'un coéquipier avait un nouveau commit non publié qui a été perdu dans ce processus.

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

Faites cela pour autant de commits que nécessaire.

J'ai utilisé cette approche avec succès à de nombreuses reprises. Elle nécessite un travail d'équipe pour s'assurer que tout est synchronisé.

4voto

nmichaels Points 21955

Comme d'autres l'ont dit, il faut généralement utiliser hg backout o git revert . Cependant, il arrive que l'on veuille vraiment se débarrasser d'un engagement.

Tout d'abord, vous devez aller dans les paramètres de votre référentiel. Cliquez sur le bouton Strip commits lien.

Strip commits link in bitbucket settings

Saisissez l'identifiant du jeu de modifications que vous souhaitez détruire, puis cliquez sur Preview strip . Cela vous permettra de voir le type de dégâts que vous vous apprêtez à faire avant de le faire. Ensuite, cliquez simplement sur Confirm et votre engagement n'est plus de l'histoire ancienne. Assurez-vous d'informer tous vos collaborateurs de ce que vous avez fait, afin qu'ils ne repoussent pas accidentellement le commit incriminé.

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