Défaire une "git push"

voici ce que j'ai fait sur ma branche supposée-être-stable ...

% 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 défaire tout ce processus, et ramener la branche alpha-0.3.0 à ce qu'elle était.

Que dois-je faire?

472
demandé sur BryanH 2009-08-13 11:23:50

10 réponses

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

alors vous devez "forcer" la vieille 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 pouvez avoir receive.denyNonFastForwards sur le dépôt distant. Si c'est le cas, alors vous obtiendrez un message d'erreur qui comprend la phrase [remote rejected] .

Dans ce scénario, vous devez 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, alors vous devez avoir un accès direct au dépôt. Dans le dépôt éloigné, vous devez alors faire quelque chose comme la commande de plomberie suivante.

git update-ref refs/heads/alpha-0.3.0 cc4b63bebb6 83c9191dea8
760
répondu CB Bailey 2016-03-25 14:30:56

je crois que vous pouvez aussi faire ceci:

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

c'est très similaire à la dernière méthode, sauf que vous n'avez pas à vous faufiler dans la prise en charge à distance.

131
répondu Benny Wong 2009-11-24 16:48:49

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>

remplacer 35f6af6f77f116ef922e3d75bc80a4a466f92650 par votre propre commit.

73
répondu neoneye 2015-04-24 18:24:14

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

en tant que meilleure pratique, toutes les propagations poussées vers un rapport à distance qui est partagé devraient être considérées comme "immuables". Utilisez' git revert ' à la place: 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

31
répondu Saboosh 2016-01-30 10:58:21

une façon 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

, Alors vous pouvez choisir les fichiers que vous vouliez pousser

26
répondu curmil 2012-03-02 04:30:32

une autre façon de le faire:

  1. créer une autre branche
  2. checkout la commande précédente sur cette branche en utilisant" git checkout "
  3. poussez la nouvelle branche.
  4. supprimer l'ancienne branche et appuyer sur Supprimer (utiliser git push origin --delete <branch_name> )
  5. renommer la nouvelle branche dans la vieille branche
  6. poussez encore.
15
répondu Rushabh Mehta 2016-10-08 05:48:59
git push origin +7f6d03:master

cela ramènera votre pension au numéro de commit mentionné

7
répondu ireshika piyumalie 2017-01-23 07:52:01

Annuler plusieurs commits git reset --hard 0ad5a7a6 (il suffit de fournir commettre de hachage SHA1)

Annuler le dernier commit

git reset -- hard HEAD~1 (les changements à la dernière propagation seront supprimés ) git reset --soft HEAD~1 (les changements à la dernière propagation seront disponibles sous forme de modifications locales non engagées)

6
répondu Jaymin 2017-05-12 06:40:21

scénario 1 : si vous voulez annuler le dernier commit dire 8123b7e04b3, ci-dessous est la commande(cela a fonctionné pour moi):

git push origin +8123b7e04b3^:<branch_name>

ressemble à la sortie ci-dessous:

Total 0 (delta 0), reused 0 (delta 0)
To https://testlocation/code.git
 + 8123b7e...92bc500 8123b7e04b3^ -> master (forced update)

informations supplémentaires: scénario 2 : dans certaines situations, vous pouvez vouloir revenir en arrière ce que vous venez de défaire (essentiellement annuler l'annulation) à travers le commande précédente, puis utilisez la commande suivante:

git reset --hard 8123b7e04b3

sortie:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

plus d'informations ici: https://github.com/blog/2019-how-to-undo-almost-anything-with-git

5
répondu Barani r 2018-04-05 12:54:49

ceci supprimera la dernière propagation poussée dans la branche distante (master ou votre branche):

git push origin +HEAD^:master      
-1
répondu mkebri 2017-10-06 14:36:36