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?
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.
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.
Nan. git-reset --hard vous ramènera dans l'histoire. Ce que vous cherchez, c'est git revert, ce qui annulera tout commit.
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é.
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
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)!
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.
git checkout <treeish> -- /path/to/dir
Cela ramènera le répertoire du "treeish" donné pour le/chemin/vers/dir
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.