web-dev-qa-db-fra.com

Annuler un "git push"

Voici ce que j'ai fait sur ma branche supposée 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 compris plus tard. Je voudrais annuler tout ce processus et ramener la branche alpha-0.3.0 à ce qu'elle était.

Que devrais-je faire?

527
Cyrus

Vous devez vous assurer qu'aucun autre utilisateur de ce référentiel ne récupère les modifications incorrectes ou n'essaie pas de construire en plus des validations que vous souhaitez supprimer, car vous êtes sur le point de revenir en arrière dans l'historique.

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 pouvez avoir receive.denyNonFastForwards défini sur le référentiel distant. Si tel est le cas, vous obtiendrez une erreur contenant la phrase [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 défini receive.denyDeletes, vous devez alors avoir un accès direct au référentiel. Dans le référentiel distant, vous devez ensuite exécuter la commande de plomberie suivante.

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

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

Ceci est très similaire à la dernière méthode, sauf que vous n'avez pas à vous perdre dans le dépôt distant.

143
Benny Wong

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.

87
neoneye

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

En tant que meilleure pratique, tous les commits envoyés à un référentiel distant partagé doivent être considérés 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

33
Saboosh

Une façon de le faire sans perdre les modifications souhaitées:

git reset cc4b63b 
git stash
git Push -f Origin alpha-0.3.0
git stash pop

Ensuite, vous pouvez choisir les fichiers que vous vouliez pousser

28
curmil

Une autre façon de faire ceci:

  1. créer une autre branche
  2. extraire le commit précédent sur cette branche en utilisant "git checkout"
  3. Poussez la nouvelle branche.
  4. supprimez l'ancienne branche & appuyez sur la suppression (utilisez git Push Origin --delete <branch_name>)
  5. renommer la nouvelle branche en ancienne branche
  6. Poussez encore.
17
Rushabh Mehta
git Push Origin +7f6d03:master

Cela ramènera votre rapport au numéro de commit mentionné

13
ireshika piyumalie

Annuler plusieurs commits git reset --hard 0ad5a7a6 (Fournissez simplement un hachage SHA1 de validation)

Annuler le dernier commit

git reset --hard HEAD ~ 1 (les modifications du dernier commit seront supprimées) git reset --soft HEAD ~ 1 (les modifications du dernier commit seront disponibles en tant que modifications locales non validées)

10
Jaymin

Scénario 1 : Si vous souhaitez annuler le dernier commit, dites 8123b7e04b3, voici la commande (cette a travaillé pour moi):

git Push Origin +8123b7e04b3^:<branch_name>

La sortie ressemble à celle 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 voudrez peut-être revenir sur ce que vous venez d'annuler (essentiellement annuler l'annulation) via la commande précédente, puis utilisez la commande ci-dessous:

git reset --hard 8123b7e04b3

Sortie:

HEAD is now at cc6206c Comment_that_was_entered_for_commit

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

7
Barani r