Question Comment puis-je annuler 1 commit?


J'ai 2 commits que je n'ai pas poussés:

$ git status
# On branch master
# Your branch is ahead of 'faves/master' by 2 commits.

Comment puis-je annuler mon premier (le plus ancien), mais garder le second?

 $ git log
commit 3368e1c5b8a47135a34169c885e8dd5ba01af5bb
...

commit baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e
...

D'ici:

http://friendfeed.com/harijay/742631ff/git-question-how-do-i-rollback-commit-just-want

Dois-je juste faire:

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

C'est?


119
2017-09-03 21:23


origine


Cette question semble être hors sujet car il s'agit d'un outil de programmation. Il appartient à Stack Overflow. - Peter Mortensen
@ PeterMortensen est d'accord. Ceci est de portée pour SuperUser - Kolob Canyon


Réponses:


La manière la plus sûre et probablement la plus propre de procéder est de rebaser de manière interactive.

git rebase -i HEAD^^

Ou,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

À partir de là, vous pouvez écraser les commits, qui réunissent un ou plusieurs commits dans le commit précédent. Pour supprimer complètement un commit de l'historique, supprimez la ligne de la liste.

Vous pouvez annuler un commit avec git revert mais cela va ajouter plus de messages d'engagement à l'histoire, ce qui peut être indésirable. Utilisez le -n paramètre pour dire à Git de ne pas commettre le retour immédiatement. Vous pouvez rebaser de manière interactive et écraser ceux sur lesquels vous vous êtes engagé pour garder les choses propres.

Si les deux validations avec lesquelles vous travaillez ici affectent les mêmes fichiers, vous pouvez voir un conflit de fusion.

Réinitialisation du référentiel avec git reset --hard devrait être fait avec soin, car il ne peut pas être défait.

L'historique de la réécriture doit être fait avec soin.


92
2017-09-03 21:32



Comment puis-je supprimer un commit lors de 'git rebase'? Il n'y a que 3 commandes: pick, edit, squash. Il n'y a pas de suppression AFAIK. - n179911
supprimer complètement la ligne de la liste et supprime celle qui valide - jtimberman
quand j'ai voulu revenir sur le changement, je ne voulais en laisser aucune trace. Si vous voulez aussi ne laisser aucune trace de votre retour, c'est la meilleure façon de le faire. - Phillip Whelan
"Le moyen le plus sûr et probablement le plus propre est de rebaser interactivement" Peut-être pas si vous n'utilisez pas vim. J'ai eu de la chance et je me suis débrouillé pour sortir de ce pétrin. Toujours en train de voter parce que je devrais apprendre vim :-) - isimmons
Je suggère d'utiliser rebase le moins possible. Si vous travaillez avec d’autres, alors faites simplement revert. - boldnik


Ceci si de http://nakkaya.com/2009/09/24/git-delete-last-commit/  et ça a fonctionné pour moi

Git Supprimer le dernier engagement

De temps en temps tard dans la nuit quand je suis à court de café, je commets des choses   que je ne devrais pas avoir. Puis je passe les 10 à 15 prochaines minutes à googler   comment supprimer le dernier commit que j'ai fait. Donc après la troisième fois je voulais   en prendre note afin que je puisse y faire référence plus tard.

Si vous avez commis des bric-à-brac mais pas poussé,

git reset --hard HEAD~1

HEAD ~ 1 est un raccourci pour le commit avant la tête. Sinon vous   peut se référer au SHA-1 du hachage que vous souhaitez réinitialiser. Notez que   lors de l'utilisation de --hard tout changement aux fichiers suivis dans l'arborescence de travail   puisque le commit avant la tête est perdu.

Si vous ne voulez pas effacer le travail que vous avez fait, vous pouvez utiliser    --soft option qui supprimera le commit mais il laissera tous vos   fichiers modifiés "Modifications à être validées", comme l’indique le statut git.

Maintenant, si vous avez déjà poussé et que quelqu'un a tiré ce qui est généralement mon cas,   vous ne pouvez pas utiliser git reset. Vous pouvez cependant faire un retour de git,

git revert HEAD

Cela va créer un nouveau commit qui inverse tout ce qui a été introduit par   le commit accidentel.


46
2017-08-05 17:52



Avec l'option --soft, c'est parfait pour renommer un fichier et accidentellement "git commit -a" plutôt que d'utiliser "git add" en premier. - Aaron Harun


Nan. git-reset --hard vous ramènera dans l'histoire. Ce que vous recherchez est git revert, qui annulera tout commit.


8
2017-09-03 21:26



Eh bien, cela fonctionne, mais vous polluez aussi le journal. Si ces commits n'étaient pas déjà poussés / tirés, il est préférable de les nettoyer avec un rebase interactif. La possibilité de changer d’historique est l’un des principaux avantages de git par rapport aux autres systèmes de contrôle de version. - knweiss


Je viens de faire ça:

git rebase -i HEAD^^

Je l'ai foiré alors j'ai fait

git rebase --abort

Ensuite, il l'a fait à nouveau. Ensuite, j'ai dû pousser comme ceci:

git push origin master -f

Et cela a détruit les commits plus récents que ceux que j'avais commis. Travaillé très bien.


5
2017-12-12 04:39





En référence au commentaire de jtimberman à propos de git reset --hard être indomptable, ce n'est pas tout à fait vrai. Vois ici: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1


4
2018-01-28 03:48





Non, git reset --hard baf8d5e va supprimer le 3368e1c engagez et HEAD sera à baf8d5e ensuite.

Si vous voulez garder le 3368e1cvalider et supprimer le bad8d5e commettre la solution la plus simple est de faire un "git rebase -i HEAD~2"(c.-à-d. rebase interactif des deux derniers commits). Cette commande lancera votre éditeur de messages de validation et vous verrez une ligne pour chacun des deux derniers commits. Il vous suffit de supprimer le bad8d5e commettre une ligne et enregistrer. git va alors réécrire votre historique et le 2nd commit sera parti.

Il y a d'autres commandes utiles que vous pouvez utiliser dans l'éditeur de message de validation comme squash, edit, etc. Le rebasage interactif est très puissant!

Ne le faites pas si quelqu'un a déjà vu ces commits (pousser ou tirer de votre dépôt)!


3
2017-09-03 21:46





git checkout <treeish> -- /path/to/dir

Cela ramènera le répertoire du "treeish" donné pour / path / to / dir


2
2017-10-12 09:23





git reset --hard {ref}

est le seul moyen d'annuler un commit s'il n'y a qu'un seul autre commit dans le référentiel (par exemple, validation initiale et 1 de plus). Les autres moyens (revert, rebase) refusent de fonctionner, au moins à partir de git 1.7.5.1.

Si vous suivez le git reset avec un git gc alors git supprimera complètement les anciennes données de validation du dépôt.


1
2018-02-28 20:17





Je l'ai fait fonctionner en éditant manuellement les codes de hachage des derniers commits des fichiers HEAD dans le dossier du référentiel:

"centralRepository\refs\heads\master"
"centralRepository\refs\heads\branch2"

Avant cela, je n'ai jamais pu pousser à l'origine les opérations UNMERGE que je faisais localement. Il a continué à dire qu'il "n'a pas réussi à pousser certaines références" vers le référentiel central.


0
2018-06-13 00:08