Je sais que c'est la réécriture de l'histoire qui est mauvaise yada yada.
Mais comment supprimer définitivement quelques validations de la branche distante?
Je sais que c'est la réécriture de l'histoire qui est mauvaise yada yada.
Mais comment supprimer définitivement quelques validations de la branche distante?
Réponses:
Vous git reset --hard
votre branche locale pour supprimer les modifications de l'arborescence de travail et de l'index, et vous git push --force
votre branche locale révisée vers la télécommande. ( autre solution ici , consistant à supprimer la branche distante et à la repousser)
Cette réponse SO illustre le danger d'une telle commande, surtout si les gens dépendent de l'historique distant pour leurs propres dépôts locaux.
Vous devez être prêt à signaler aux gens la section RECOVERING FROM UPSTREAM REBASE de la git rebase
page de manuel
Avec Git 2.23 (août 2019, neuf ans plus tard), vous utiliseriez la nouvelle commande git switch
.
Soit:
(remplacer par le nombre de validations à supprimer)git switch -C mybranch origin/mybranch~n
n
Cela restaurera l'index et l'arborescence de travail, comme un git reset --hard
ferait.
push --force
loin
git gc
n'est pas toujours exécuté assez souvent du côté distant. Par exemple sur GitHub: twitter.com/githubhelp/status/387926738161774592?lang=es
Notez simplement d'utiliser le last_working_commit_id
, lorsque vous annulez un commit qui ne fonctionne pas
git reset --hard <last_working_commit_id>
Nous ne devons donc pas réinitialiser ce commit_id
que nous ne voulons pas.
Alors bien sûr, nous devons pousser vers la branche distante:
git push --force
git reset --hard
est censé faire.
Trois options sont présentées dans ce didacticiel . En cas de rupture du lien, je laisse ici les principales étapes.
1 Annuler le commit complet
git revert dd61ab23
2 Supprimer le dernier commit
git push <<remote>> +dd61ab23^:<<BRANCH_NAME_HERE>>
ou, si la succursale est disponible localement
git reset HEAD^ --hard
git push <<remote>> -f
où + dd61 ... est votre hachage de validation et git interprète x ^ comme le parent de x, et + comme une poussée forcée non accélérée.
3 Supprimer le commit d'une liste
git rebase -i dd61ab23^
Cela ouvrira et l'éditeur montrera une liste de tous les commits. Supprimez celui dont vous souhaitez vous débarrasser. Terminer le rebasage et pousser la force de repo.
git rebase --continue
git push <remote_repo> <remote_branch> -f
Si vous souhaitez supprimer par exemple les derniers 3
validations, exécutez la commande suivante pour supprimer les modifications du système de fichiers (arborescence de travail) et l'historique des validations (index) sur votre branche locale:
git reset --hard HEAD~3
Exécutez ensuite la commande suivante (sur votre ordinateur local) pour forcer la branche distante à réécrire son historique:
git push --force
Toutes nos félicitations! Terminé!
Quelques notes:
Vous pouvez récupérer l'ID de validation souhaité en exécutant
git log
Ensuite , vous pouvez remplacer HEAD~N
avec <desired-commit-id>
comme ceci:
git reset --hard <desired-commit-id>
Si vous souhaitez conserver les modifications sur le système de fichiers et simplement modifier l'index (historique des validations), utilisez --soft
flag like git reset --soft HEAD~3
. Ensuite, vous avez la possibilité de vérifier vos dernières modifications et de les conserver ou de les supprimer en totalité ou en partie. Dans ce dernier cas, runnig git status
affiche les fichiers modifiés depuis <desired-commit-id>
. Si vous utilisez l' --hard
option, git status
vous dira que votre branche locale est exactement la même que celle distante. Si vous n'utilisez pas --hard
ni --soft
, le mode par défaut est utilisé --mixed
. Dans ce mode, git help reset
dit:
Réinitialise l'index mais pas l'arborescence de travail (c'est-à-dire que les fichiers modifiés sont conservés mais pas marqués pour validation) et signale ce qui n'a pas été mis à jour.
C'est peut-être trop peu trop tard, mais ce qui m'a aidé, c'est l'option «nucléaire» au son cool. Fondamentalement, en utilisant la commandefilter-branch
vous pouvez supprimer des fichiers ou modifier quelque chose sur un grand nombre de fichiers tout au long de votre historique Git.
C'est mieux expliqué ici .
Simplification de la réponse de pctroll, également basée sur cet article de blog .
# look up the commit id in git log or on github, e.g. 42480f3, then do
git checkout master
git checkout your_branch
git revert 42480f3
# a text editor will open, close it with ctrl+x (editor dependent)
git push origin your_branch
# or replace origin with your remote
Parfois, le moyen le plus simple de résoudre ce problème est de créer une nouvelle branche à partir de l'endroit où vous savez que le code est bon. Ensuite, vous pouvez laisser l'historique des branches errant seul au cas où vous auriez besoin de sélectionner d'autres validations ultérieurement. Cela garantit également que vous n'avez perdu aucun historique de validation.
De votre succursale locale errante:
git log
copier le hachage de validation sur lequel vous vouliez que la branche se trouve et quitter le journal git
git checkout theHashYouJustCopied
git checkout -b your_new_awesome_branch
Vous avez maintenant une nouvelle branche comme vous le souhaitez.
Si vous avez également besoin de conserver un commit spécifique de la branche errante qui ne se trouve pas sur votre nouvelle branche, vous pouvez simplement sélectionner ce commit spécifique dont vous avez besoin:
git checkout the_errant_branch
git log
Copiez le hachage de validation du seul commit dont vous avez besoin pour tirer dans la bonne branche et quitter le journal git.
git checkout your_new_awesome_branch
git cherry-pick theHashYouJustCopied
Tapotez-vous dans le dos.