web-dev-qa-db-fra.com

Comment puis-je annuler un 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), tout en conservant 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?

125
n179911

Le moyen le plus sûr et probablement le plus propre consiste à procéder à une refonte interactive.

git rebase -i HEAD^^

Ou,

git rebase -i baf8d5e7da9e41fcd37d63ae9483ee0b10bfac8e^

À partir de là, vous pouvez supprimer les commits, ce qui permet de regrouper 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 une validation avec git revert, mais cela va ajouter d'autres messages de validation à l'historique, ce qui peut être indésirable. Utilisez le paramètre -n pour indiquer à Git de ne pas valider le retour immédiatement. Vous pouvez créer une base interactive de manière interactive et écraser ceux qui se trouvent jusqu'à un précédent engagement afin de garder les choses propres.

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

La réinitialisation du référentiel avec git reset --hard doit être effectuée avec précaution, car elle ne peut pas être annulée.

La réécriture de l'historique doit être faite avec soin.

94
jtimberman

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

Git Delete Last Commit

De temps en temps tard dans la nuit quand je manque de café, je commets des choses que je n'aurais pas dû. Ensuite, je passe les 10 à 15 prochaines minutes à chercher sur Google comment supprimer le dernier commit que j'ai fait. Donc, après la troisième fois, je voulais en faire un enregistrement pour pouvoir le consulter plus tard.

Si vous avez commis des junk mais pas poussé,

git reset --hard HEAD~1

HEAD ~ 1 est un raccourci pour le commit avant head. Sinon, vous pouvez vous référer au SHA-1 du hachage que vous souhaitez réinitialiser. Notez que lors de l'utilisation de --hard, toutes les modifications apportées aux fichiers suivis dans l'arborescence de travail depuis la validation avant l'en-tête sont perdues.

Si vous ne voulez pas effacer le travail que vous avez fait, vous pouvez utiliser l'option --soft qui supprimera la validation mais laissera tous vos fichiers modifiés "Modifications à valider", comme le dirait le statut git.

Maintenant, si vous avez déjà poussé et que quelqu'un tire ce qui est généralement mon cas, vous ne pouvez pas utiliser la réinitialisation git. Vous pouvez cependant faire un git revert,

git revert HEAD

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

51
iStryker

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

8
Peltier

Je viens de faire ceci:

git rebase -i HEAD^^

Je l'ai bousillé alors j'ai fait

git rebase --abort

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

git Push Origin master -f

Et il a détruit les commits plus récents que ceux auxquels je suis retourné. A bien fonctionné.

5
hamstar

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

4
mattd

Non, git reset --hard baf8d5e supprimera le commit 3368e1c et HEAD sera à baf8d5e après.

Si vous souhaitez conserver le 3368e1c commit et supprimer le bad8d5e commit, la solution la plus simple consiste à effectuer un "git rebase -i HEAD~2" (c'est-à-dire un rebase interactif des deux derniers commits). Cette commande lancera votre éditeur de message de validation et vous verrez une ligne pour chacun des deux derniers validés. Là, vous venez de supprimer la ligne de commande bad8d5e et de l’enregistrer. git va alors réécrire votre historique et le 2ème commit sera parti.

Il existe d'autres commandes utiles que vous pouvez utiliser dans l'éditeur de message de validation, telles que squash, edit, etc. La base interactive est TRÈS puissante!

Ne faites pas cela si quelqu'un a déjà vu ces commits (Push ou pull depuis votre référentiel)!

4
knweiss
git reset --hard {ref}

est le seul moyen d'annuler une validation s'il n'y a qu'une seule autre validation dans le référentiel (par exemple, une validation initiale et une autre). Les autres méthodes (retour, rebase) refusent de fonctionner, du moins à partir de la version 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 référentiel.

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

Cela ramènera le répertoire du "treeish" donné pour le/chemin/vers/dir

1
lokeshpahal

Cela a fonctionné en modifiant manuellement les codes de hachage des derniers commits à partir de fichiers HEAD situés dans le dossier du référentiel:

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

Avant cela, je n'ai jamais réussi à impulser à l'origine les opérations de l'UNMERGE que j'ai effectuées localement. Il n'arrêtait pas de dire qu'il "n'avait pas réussi à envoyer des références" au référentiel central.

0
Leandro M