Recherche…
Annuler les fusions
Annulation d'une fusion pas encore poussée sur une télécommande
Si vous n'avez pas encore poussé votre fusion vers le référentiel distant, vous pouvez suivre la même procédure que pour annuler la validation bien qu'il y ait des différences subtiles.
Une réinitialisation est l'option la plus simple car elle annulera à la fois la validation de la fusion et tous les commits ajoutés depuis la branche. Cependant, vous devrez savoir ce que SHA doit restaurer, cela peut être difficile car votre git log
affichera désormais les commits des deux branches. Si vous effectuez une remise incorrecte (par exemple, sur l’autre branche), cela peut détruire le travail engagé.
> git reset --hard <last commit from the branch you are on>
Ou, en supposant que la fusion était votre engagement le plus récent.
> git reset HEAD~
Un retour est plus sûr, dans la mesure où il ne détruit pas le travail engagé, mais implique plus de travail car vous devez annuler le retour avant de pouvoir réintégrer la branche (voir la section suivante).
Annulation d'une fusion poussée sur une télécommande
Supposons que vous fusionnez une nouvelle fonctionnalité (add-gremlins)
> git merge feature/add-gremlins
...
#Resolve any merge conflicts
> git commit #commit the merge
...
> git push
...
501b75d..17a51fd master -> master
Ensuite, vous découvrez que la fonctionnalité que vous venez de fusionner a cassé le système pour les autres développeurs, elle doit être annulée immédiatement, et la correction de la fonctionnalité prendra trop de temps, vous souhaiterez donc simplement annuler la fusion.
> git revert -m 1 17a51fd
...
> git push
...
17a51fd..e443799 master -> master
A ce stade, les gremlins sont hors du système et vos collègues développeurs ont cessé de vous crier dessus. Cependant, nous n'avons pas encore fini. Une fois que vous avez résolu le problème avec la fonctionnalité add-gremlins, vous devez annuler ce retour avant de pouvoir le réintégrer.
> git checkout feature/add-gremlins
...
#Various commits to fix the bug.
> git checkout master
...
> git revert e443799
...
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
À ce stade, votre fonctionnalité est maintenant ajoutée avec succès. Cependant, étant donné que les bogues de ce type sont souvent introduits par des conflits de fusion, un flux de travail légèrement différent est parfois plus utile car il vous permet de résoudre le conflit de fusion sur votre branche.
> git checkout feature/add-gremlins
...
#Merge in master and revert the revert right away. This puts your branch in
#the same broken state that master was in before.
> git merge master
...
> git revert e443799
...
#Now go ahead and fix the bug (various commits go here)
> git checkout master
...
#Don't need to revert the revert at this point since it was done earlier
> git merge feature/add-gremlins
...
#Fix any merge conflicts introduced by the bug fix
> git commit #commit the merge
...
> git push
Utiliser le reflog
Si vous boussez une rebase, une option pour recommencer est de revenir à la validation (pre rebase). Vous pouvez le faire en utilisant le reflog
(qui a l'historique de tout ce que vous avez fait au cours des 90 derniers jours - cela peut être configuré):
$ git reflog
4a5cbb3 HEAD@{0}: rebase finished: returning to refs/heads/foo
4a5cbb3 HEAD@{1}: rebase: fixed such and such
904f7f0 HEAD@{2}: rebase: checkout upstream/master
3cbe20a HEAD@{3}: commit: fixed such and such
...
Vous pouvez voir le commit avant que le rebase ne soit HEAD@{3}
(vous pouvez également vérifier le hash):
git checkout HEAD@{3}
Maintenant, vous créez une nouvelle branche / supprimez l'ancienne / essayez à nouveau le rebase.
Vous pouvez également revenir directement à un point de votre reflog
, mais ne le faites que si vous êtes sûr à 100% que c'est ce que vous voulez faire:
git reset --hard HEAD@{3}
Cela définira votre arbre git actuel pour qu'il corresponde à ce qu'il était à ce moment-là (voir Annuler les modifications).
Cela peut être utilisé si vous voyez temporairement le fonctionnement d'une branche lors d'un rebasage sur une autre branche, mais vous ne voulez pas conserver les résultats.
Retour à un engagement précédent
Pour revenir à un commit précédent, commencez par trouver le hachage du commit à l'aide de git log
.
Pour revenir temporairement à cet engagement, détachez votre tête avec:
git checkout 789abcd
Cela vous place à 789abcd
. Vous pouvez désormais créer de nouveaux commits en plus de cet ancien commit sans affecter la branche sur laquelle vous vous trouvez. Toute modification peut être effectuée dans une branche appropriée en utilisant soit branch
ou checkout -b
.
Pour revenir à un commit précédent tout en conservant les modifications:
git reset --soft 789abcd
Pour annuler le dernier commit:
git reset --soft HEAD~
Pour ignorer de manière permanente les modifications apportées après une validation spécifique, utilisez:
git reset --hard 789abcd
Pour ignorer de manière permanente les modifications apportées après la dernière validation:
git reset --hard HEAD~
Attention: Bien que vous puissiez récupérer les reflog
abandonnées en utilisant le reflog
et la reset
, les modifications non validées ne peuvent pas être récupérées. Utilisez git stash; git reset
au lieu de git reset --hard
pour être sûr.
Annuler les modifications
Annuler les modifications apportées à un fichier ou à un répertoire dans la copie de travail .
git checkout -- file.txt
Utilisé sur tous les chemins de fichiers, récursivement à partir du répertoire en cours, il annulera toutes les modifications de la copie de travail.
git checkout -- .
Pour annuler uniquement certaines parties des modifications, utilisez --patch
. On vous demandera, pour chaque changement, si elle doit être annulée ou non.
git checkout --patch -- dir
Pour annuler les modifications ajoutées à l' index .
git reset --hard
Sans l'indicateur --hard
, cela effectuera une réinitialisation --hard
.
Avec les commits locaux que vous n'avez pas encore transmis à une télécommande, vous pouvez également effectuer une réinitialisation logicielle. Vous pouvez ainsi retravailler les fichiers puis les commits.
git reset HEAD~2
L'exemple ci-dessus détacherait vos deux derniers commits et renverrait les fichiers à votre copie de travail. Vous pourriez alors apporter d'autres modifications et de nouveaux commits.
Attention: toutes ces opérations, à l'exception des réinitialisations logicielles, suppriment définitivement vos modifications. Pour une option plus sûre, utilisez respectivement git stash -p
ou git stash
. Vous pouvez plus tard annuler avec de la stash pop
ou la supprimer pour toujours avec la suppression de la stash drop
.
Inverser certains commits existants
Utilisez git revert pour annuler les validations existantes, en particulier lorsque ces validations ont été envoyées dans un référentiel distant. Il enregistre de nouveaux commits pour inverser l'effet de certains commits antérieurs, que vous pouvez utiliser en toute sécurité sans réécrire l'historique.
N'utilisez pas git push --force
moins que vous ne souhaitiez réduire l'opprobre de tous les autres utilisateurs de ce référentiel. Ne jamais réécrire l'histoire publique.
Si, par exemple, vous venez de lancer une validation qui contient un bogue et que vous devez la sauvegarder, procédez comme suit:
git revert HEAD~1
git push
Maintenant, vous êtes libre de revenir sur la validation de retour localement, de corriger votre code et de pousser le bon code:
git revert HEAD~1
work .. work .. work ..
git add -A .
git commit -m "Update error code"
git push
Si la validation que vous souhaitez rétablir est déjà plus ancienne, vous pouvez simplement passer le hachage de validation. Git créera une contre-validation annulant votre validation initiale, que vous pourrez transmettre à votre télécommande en toute sécurité.
git revert 912aaf0228338d0c8fb8cca0a064b0161a451fdc
git push
Annuler / Refaire une série de commits
Supposons que vous vouliez annuler une douzaine de commits et que vous ne souhaitiez que certains d'entre eux.
git rebase -i <earlier SHA>
-i met rebase en "mode interactif". Il commence comme le rebase discuté ci-dessus, mais avant de rejouer les commits, il se met en pause et vous permet de modifier en douceur chaque validation lors de sa relecture. rebase -i
s'ouvrira dans votre éditeur de texte par défaut, avec une liste de validations appliquées, comme ceci:
Pour supprimer un commit, supprimez simplement cette ligne dans votre éditeur. Si vous ne voulez plus les commits incorrects dans votre projet, vous pouvez supprimer les lignes 1 et 3-4 ci-dessus. Si vous souhaitez combiner deux commits, vous pouvez utiliser les commandes de squash
ou de fixup