746 votes

Annulation d'un "git push".

Voici ce que j'ai fait sur mon censé être stable branche...

% git rebase master
First, rewinding head to replay your work on top of it...
Fast-forwarded alpha-0.3.0 to master.
% git status
# On branch alpha-0.3.0
# Your branch is ahead of 'origin/alpha-0.3.0' by 53 commits.
#
nothing to commit (working directory clean)
% git push
Fetching remote heads...
  refs/
  refs/heads/
  refs/tags/
  refs/remotes/
'refs/heads/master': up-to-date
updating 'refs/heads/alpha-0.3.0'
  from cc4b63bebb6e6dd04407f8788938244b78c50285
  to   83c9191dea88d146400853af5eb7555f252001b0
    done
'refs/heads/unstable': up-to-date
Updating remote server info

C'était une erreur, comme je l'ai réalisé plus tard. J'aimerais annuler tout ce processus, et revenir à la branche alpha-0.3.0 telle qu'elle était.

Que dois-je faire ?

0 votes

Ce post de stackoverflow peut-être ? stackoverflow.com/questions/134882/undoing-a-git-rebase

6 votes

Ce n'est pas vraiment la même situation, annuler une rebase est un scénario de dépôt local, annuler un git push implique un dépôt distant et peut être plus délicat selon l'accès dont vous disposez.

0 votes

Steen - vous avez raison - j'aurais probablement dû le faire, je suppose. J'ai pensé que le dépôt béni dont tout le monde tire est plus une tâche d'administration et qu'il a donc sa place ici, où le git côté client général est une question de stackoverflow.

1172voto

Charles Bailey Points 244082

Vous devez vous assurer qu'aucun autre utilisateur de ce dépôt ne récupère les changements incorrects ou n'essaie de construire sur les commits que vous voulez supprimer parce que vous êtes sur le point de rembobiner l'histoire.

Ensuite, vous devez "forcer" l'ancienne référence.

git push -f origin last_known_good_commit:branch_name

ou dans votre cas

git push -f origin cc4b63bebb6:alpha-0.3.0

Vous avez peut-être receive.denyNonFastForwards sur le référentiel distant. Si c'est le cas, vous obtiendrez une erreur comprenant la phrase suivante [remote rejected] .

Dans ce scénario, vous devrez supprimer et recréer la branche.

git push origin :alpha-0.3.0
git push origin cc4b63bebb6:refs/heads/alpha-0.3.0

Si cela ne fonctionne pas - peut-être parce que vous avez receive.denyDeletes défini, vous devez avoir un accès direct au référentiel. Dans le référentiel distant, vous devez alors faire quelque chose comme la commande de plomberie suivante.

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8

23 votes

Une réponse parfaite et bien expliquée - merci beaucoup. Pour toute personne qui tomberait sur ce problème, pour des raisons académiques, j'ai essayé les deux premières approches, et les deux ont fonctionné - évidemment, si la première fonctionne, c'est l'approche la plus propre. Si je pouvais vous UP 10 fois Charles, je le ferais :)

152 votes

Pour une référence rapide, la première ligne est la suivante git push -f origin last_known_good_commit:branch_name

7 votes

Git push -f origin cc4b63bebb6:alpha-0.3.0 => cette commande m'a aidé. Notez que alpha-0.3.0 est le nom de la branche et cc4b63bebb6 est le commit id auquel nous voulons revenir. donc, après avoir exécuté cette commande, nous serons dans le commit id cc4b63bebb6.

200voto

Benny Wong Points 3275

Je crois que vous pouvez également le faire :

git checkout alpha-0.3.0
git reset --hard cc4b63bebb6
git push origin +alpha-0.3.0

Cette méthode est très similaire à la précédente, sauf que vous n'avez pas besoin de fouiller dans le dépôt distant.

13 votes

Cela a fonctionné pour moi aussi, mais il faut noter que cela va "réécrire" l'historique sur la télécommande. C'est peut-être ce que vous voulez, mais peut-être pas !

4 votes

+1 pour cette réponse qui m'a beaucoup aidé. Je voulais aussi ajouter (et rendre les choses claires) que l'ID de commit (qui vient après le " --hard Le paramètre " " doit être l'ID du commit sur lequel vous voulez réinitialiser votre branche.

0 votes

Comment se fait-il que quand je fais git pull j'obtiens quelque chose comme : fe88549..50a8083 master -> origin/master Already up-to-date.

126voto

neoneye Points 11545

git revert est moins dangereux que certaines des approches suggérées ici :

prompt> git revert 35f6af6f77f116ef922e3d75bc80a4a466f92650
[master 71738a9] Revert "Issue #482 - Fixed bug."
 4 files changed, 30 insertions(+), 42 deletions(-)
prompt> git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
prompt>

Remplacez 35f6af6f77f116ef922e3d75bc80a4a466f92650 par votre propre commit.

2 votes

Comment obtenir l'identifiant 35f6af6f77f116ef922e3d75bc80a4a466f92650 ? Cette réponse serait meilleure si vous pouviez l'expliquer.

4 votes

@Volomike (et les développeurs du futur sur Google), cette question décrit plusieurs façons de l'obtenir : contrôle de version et question de hachage sur SO

0 votes

C'est la bonne réponse, car avec "git reset" vous ne devriez pas être en mesure de pousser (les mises à jour ont été rejetées parce que l'extrémité de votre branche actuelle est en retard sur son homologue distante) ou vous devez forcer le pull qui n'est pas vraiment propre.

50voto

curmil Points 141

Un moyen de le faire sans perdre les changements que vous vouliez :

git reset cc4b63b 
git stash
git push -f origin alpha-0.3.0
git stash pop

Ensuite, vous pouvez choisir les fichiers que vous voulez pousser.

1 votes

Cela a sauvé ma journée !

0 votes

Merci pour cela !

37voto

Saboosh Points 224

La solution acceptée (de @charles bailey) est très dangereuse si vous travaillez dans un repo partagé.

En tant que meilleure pratique, tous les commits poussés vers un repo distant qui est partagé doivent être considérés comme "immuables". Utilisez plutôt "git revert" : http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#fixing-mistakes

https://git-scm.com/book/be/v2/Git-Basics-Undoing-Things

1 votes

Quelles sont, exactement, les instructions que vous prescrivez ? Vous ne semblez avoir que des liens anciens.

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