J'ai 2 commits que je n'ai pas poussé:
$ 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?
Réponses:
Le moyen le plus sûr et probablement le plus propre consiste à procéder à une refonte interactive.
Ou,
À partir de là, vous pouvez écraser 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 un commit avec
git revert
mais cela va ajouter plus de messages de commit à l'historique, ce qui peut être indésirable. Utilisez le-n
paramètre pour dire à 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 que 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.
la source
rebase
le moins possible. Si vous travaillez avec d'autres, faites-lerevert
.Ceci si de http://nakkaya.com/2009/09/24/git-delete-last-commit/ et cela a fonctionné pour moi
la source
Nan. git-reset --hard vous ramènera dans l'histoire. Ce que vous recherchez, c'est git revert, ce qui annulera tout commit.
la source
Je viens de faire ceci:
Je l'ai bousillé alors j'ai fait
Puis il l'a fait à nouveau. Ensuite, j'ai dû pousser comme ceci:
Et il a détruit les commits plus récents que ceux auxquels je suis retourné. A bien fonctionné.
la source
Non,
git reset --hard baf8d5e
supprimera le3368e1c
commit et HEAD sera à labaf8d5e
suite.Si vous souhaitez conserver la
3368e1c
validation et la supprimer, labad8d5e
solution la plus simple consiste à effectuer un "git rebase -i HEAD~2
" (c.-à-d. Une rebase interactive des deux dernières validations). 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 labad8d5e
ligne de validation et de sauvegarder. 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 commit comme
squash
,edit
, etc. rebasage Interactive est très puissant!Ne faites pas cela si quelqu'un a déjà vu ces commits (pousser ou tirer de votre référentiel)!
la source
En référence au commentaire de jtimberman sur le fait d'
git reset --hard
être irréversible, ce n'est pas tout à fait vrai. Voir ici: https://stackoverflow.com/questions/5473/undoing-a-git-reset-hard-head1la source
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
git supprimera complètement les anciennes données de validation du référentiel.la source
Cela ramènera le répertoire du "treeish" donné pour le / chemin / vers / dir
la source
Cela a fonctionné en modifiant manuellement les codes de hachage des derniers commits à partir des fichiers HEAD dans le dossier du référentiel:
Avant cela, je n'avais jamais réussi à pousser à l'origine des opérations UNMERGE que j'avais effectuées localement. Il n'arrêtait pas de dire qu'il "n'avait pas réussi à envoyer des références" au dépôt central.
la source