2009-09-03 21:23:58 +0000 2009-09-03 21:23:58 +0000
133
133

Comment puis-je annuler 1 engagement ?

J'ai 2 engagements 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 engagement (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 simplement faire :

git reset --hard baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e

C'est-à-dire ?

Réponses (9)

99
99
99
2009-09-03 21:32:01 +0000

La façon la plus sûre et probablement la plus propre de procéder est de rebaser interactivement.

git rebase -i HEAD^^

Ou,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

A partir de là, vous pouvez écraser les commit, ce qui met un ou plusieurs commit ensemble 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 d'autres messages de commit à l'historique, ce qui peut être indésirable. Utilisez le paramètre -n pour dire à Git de ne pas commettre le retour en arrière immédiatement. Vous pouvez redéfinir la base interactive et les écraser sur un commit précédent pour garder les choses propres.

Si les deux commits avec lesquels vous travaillez ici affectent le(s) même(s) fichier(s), vous pouvez voir un conflit de fusion.

Réinitialiser le dépôt avec git reset --hard doit être fait avec précaution, car il ne peut pas être annulé.

Réécrire l'historique doit être fait avec précaution.

54
54
54
2011-08-05 17:52:58 +0000

This if from http://nakkaya.com/2009/09/24/git-delete-last-commit/ and it worked for me

Git Delete Last Commit

De temps en temps, tard dans la nuit, quand je n'ai plus de café, je commet des choses que je n'aurais pas dû. Ensuite, je passe les 10 à 15 minutes suivantes à chercher sur Google comment supprimer le dernier engagement que j'ai fait. Donc, après la troisième fois, je voulais en prendre note pour pouvoir m'y référer plus tard.

Si vous avez commis des saletés mais que vous n'avez pas été poussé,

git reset --hard HEAD~1

HEAD~1 est une abréviation pour le commit avant head. Vous pouvez également vous référer à la SHA-1 du hash que vous voulez remettre à zéro. Notez que lorsque vous utilisez –hard, tous les changements apportés aux fichiers suivis dans l'arbre de travail depuis le commit avant head sont perdus.

Si vous ne voulez pas effacer le travail que vous avez fait, vous pouvez utiliser l'option --soft qui effacera le commit mais laissera tous vos fichiers modifiés “Changes to be committed”, comme le mettrait le statut de 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 git revert,

git revert HEAD

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

8
8
8
2009-09-03 21:26:55 +0000

Non. git-reset –hard vous ramènera dans l'histoire. Ce que vous cherchez, c'est git revert, qui annulera tout engagement.

6
6
6
2011-12-12 04:39:48 +0000

Je viens de faire ça :

git rebase -i HEAD^^

J'ai tout foiré alors je l'ai fait

git rebase --abort

Puis je l'ai refait. Puis j'ai dû pousser comme ça :

git push origin master -f

Et ça a détruit les engagements plus récents que celui auquel j'étais revenu. Ça a bien fonctionné.

4
4
4
2010-01-28 03:48:38 +0000

En ce qui concerne le commentaire de jtimberman sur le fait que git reset --hard est irréversible, ce n'est pas tout à fait vrai. Voir ici : https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1

4
4
4
2009-09-03 21:46:37 +0000

Non, git reset --hard baf8d5e supprimera le commit de 3368e1c et HEAD sera à baf8d5e par la suite.

Si vous souhaitez conserver le commit de 3368e1c et supprimer le commit de bad8d5e, la solution la plus simple est de faire un “git rebase -i HEAD~2” (c'est-à-dire une re-base interactive des deux derniers commit). Cette commande lancera votre éditeur de messages de commit et vous verrez une ligne pour chacun des deux derniers commit. Il vous suffit alors de supprimer la ligne de commit bad8d5e et de sauvegarder. git réécrira alors votre historique et le 2ème commit disparaîtra.

Il existe d'autres commandes utiles que vous pouvez utiliser dans l'éditeur de messages de commit comme squash, edit, etc. Le rebase interactif est TRES puissant !

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

1
1
1
2012-10-12 09:23:13 +0000
git checkout <treeish> -- /path/to/dir

Cela ramènera le répertoire à partir de l’“arborescence” donnée pour le /chemin/vers/dir

1
1
1
2012-02-28 20:17:27 +0000
git reset --hard {ref}

est le seul moyen d'annuler un commit s'il n'y a qu'un seul autre commit dans la mise en pension (par exemple, un commit initial et un autre). Les autres méthodes (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 effacera complètement les anciennes données de commit du repo.

0
0
0
2014-06-13 00:08:14 +0000

Je l'ai fait fonctionner en modifiant manuellement les codes de hachage des derniers commits des fichiers HEAD dans le dossier du dépôt :

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

Avant cela, je ne pouvais jamais pousser à l'origine les opérations UNMERGE que je faisais localement. Il n'arrêtait pas de dire qu'il “ne parvenait pas à pousser certains refs” vers le dépôt central.