web-dev-qa-db-fra.com

Supprimer le dernier commit dans bitbucket

J'ai commis une erreur et je ne sais pas comment supprimer mon dernier push dans le référentiel. Je tire les dernières mises à jour de l'application mais il y a des conflits et je le pousse au référentiel 

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

94
catherine

En premier lieu, si vous travaillez avec d'autres personnes sur le même référentiel de code, vous ne devez pas supprimer un commit, car lorsque vous forcerez la mise à jour sur le référentiel, les référentiels locaux de vos collègues resteront dans un état illégal. (Par exemple, s’ils ont fait des commits après celui que vous avez supprimé, ces commits ne seront pas valables car ils étaient basés sur un commit maintenant inexistant).

Ce que vous pouvez faire, c’est revert le commit. Cette procédure est effectuée différemment (commandes différentes) en fonction du CVS que vous utilisez:

Sur git :

git revert <commit>

Sur Mercurial :

hg backout <REV>

EDIT: L'opération d'inversion crée une nouvelle validation qui fait le contraire de la validation annulée (par exemple, si la validation d'origine ajoute une ligne, la validation annulée supprime cette ligne), supprimant ainsi les modifications de la validation non souhaitée. sans réécrire l'historique du référentiel.

87
asermax

Si vous (pas} _ travaillez avec d'autres (ou êtes heureux de leur causer une gêne importante), il est possible de supprimer les commits des branches de bitbucket.

Si vous essayez de changer une branche non principale:

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 changer de branche principale

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 nécessitent généralement la création d'une branche principale (probablement parce qu'il est plus facile que d'écrire davantage de code de gérer l'événement lorsqu'un référentiel n'a pas de branche, mais pas certain). 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, accédez aux paramètres du référentiel et modifiez la "branche principale" en master_temp (sur Github, modifiez la "branche par défaut").

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

Allez maintenant à Bitbucket, et vous devriez voir l’histoire que vous voulez. Vous pouvez maintenant accéder à la page des paramètres et redéfinir la branche principale en master.

Ce processus fonctionnera également avec tout autre changement d’historique (par exemple git filter-branch). Vous devez simplement vous assurer de réinitialiser les commits appropriés avant que le nouvel historique ne soit séparé de l'ancien. 

edit: apparemment vous n'avez pas besoin d'aller à tous ces tracas sur github, car vous pouvez forcer une branche de réinitialisation .

Traiter avec des collaborateurs agacés

La prochaine fois que quelqu'un essaiera d'extraire de votre référentiel (s'il a déjà extrait le mauvais commit), l'extraction échouera. Ils devront manuellement réinitialiser un commit avant l'historique modifié, puis tirer à nouveau.

git reset HEAD^
git pull

S'ils ont tiré le mauvais commit, et commis dessus, ils devront alors réinitialiser, puis git cherry-pick les bons commits qu'ils veulent créer, recréant ainsi toute la branche sans le mauvais commettre.

S'ils ne tirent jamais le mauvais commit, alors tout ce processus ne les affectera pas et ils pourront tirer comme d'habitude.

89
naught101

vous pouvez réinitialiser à HEAD^ puis forcer Push it.

git reset HEAD^
git Push -u Origin master --force

Il supprimera votre dernier commit et réfléchira sur bitbucket en tant que commit supprimé mais restera toujours sur leur serveur.

37
Shubanker

J'ai eu des problèmes avec git revert dans le passé (principalement parce que je ne suis pas tout à fait sûr de comment cela fonctionne.) J'ai eu du mal à revenir en arrière à cause de problèmes de fusion ..

Ma solution simple est la suivante.

Étape 1.

 git clone <your repos URL> .

votre projet dans un autre dossier, puis:

Étape 2.

git reset --hard <the commit you wanna go to>

puis Étape 3.

dans votre dernier (et principal) répertoire de projet (celui qui contient le dernier commit problématique), collez les fichiers de l'étape 2

Étape 4. 

git commit -m "Fixing the previous messy commit" 

Étape 5. 

Prendre plaisir

3
SudoPlz

Comme d'autres l'ont déjà dit, vous souhaitez généralement utiliser hg backout ou git revert. Cependant, parfois vous voulez vraiment vous débarrasser d'un commit.

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

 Strip commits link in bitbucket settings 

Entrez l'ID de l'ensemble de modifications que vous souhaitez détruire, puis cliquez sur Preview strip. Cela vous permettra de voir quel type de dommage vous êtes sur le point de faire avant de le faire. Ensuite, cliquez simplement sur Confirm et votre commit n’est plus de l’histoire. Assurez-vous de dire à tous vos collaborateurs ce que vous avez fait pour qu'ils ne repoussent pas accidentellement le commit en question.

0
nmichaels

Une fois les modifications validées, il ne sera plus possible de les supprimer. parce que la nature fondamentale de commit est de ne pas supprimer.

Ce que vous pouvez faire (méthode simple et sûre),

Rebase interactive:

1) git rebase -i HEAD~2 # affichera vos 2 commits récents

2) Votre liste de commit ressemblera à, Récent apparaîtra au bas de la page LILO (dernier entré dernier sorti)

 enter image description here

Supprimer entièrement la dernière ligne de validation

3) enregistrez-le avec ctrl+X ou ESC:wq 

maintenant, votre branche sera mise à jour sans votre dernier commit.

0

À ce jour, cloud bitbucket (je ne sais pas quelle version) permet de rétablir un commit du système de fichiers comme suit (je ne vois pas comment revenir de l'interface Bitbucket dans le navigateur Chrome).

-backup votre répertoire entier pour sécuriser les modifications que vous avez commises par inadvertance

-sélectionner le répertoire extrait

bouton droit de la souris: menu git tortue

-repo-browser (l'option de menu 'Revert' annule uniquement les modifications non validées)

-appuyez sur le bouton HEAD

-sélectionnez la dernière ligne (le dernier commit)

bouton droit de la souris: annuler le changement par ce commit

-après avoir annulé les modifications sur le système de fichiers, appuyez sur commit

-Il met à jour GIT avec le message 'Revert (votre message précédent). Cela revient commettre untel '

-sélectionnez 'commit et Push'.

0
smriti

Vous pouvez également écrire la commande pour Bitbucket comme indiqué par Dustin :

git Push -f Origin HEAD^:master

Remarque: au lieu de maître, vous pouvez utiliser n’importe quelle branche. Et cela supprime simplement Push sur Bitbucket.

Pour supprimer le dernier commit localement sous git, utilisez:

git reset --hard HEAD~1
0
invzbl3