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?
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
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.
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.
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
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
une autre façon de le faire:
- créer une autre branche
- checkout la commande précédente sur cette branche en utilisant" git checkout "
- poussez la nouvelle branche.
- supprimer l'ancienne branche et appuyer sur Supprimer (utiliser
git push origin --delete <branch_name>
) - renommer la nouvelle branche dans la vieille branche
- poussez encore.
git push origin +7f6d03:master
cela ramènera votre pension au numéro de commit mentionné
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)
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
ceci supprimera la dernière propagation poussée dans la branche distante (master ou votre branche):
git push origin +HEAD^:master