Je ne comprends pas bien comment fonctionne git revert
. Par exemple, je veux revenir à un commit six commits derrière la tête, annulant tous les changements dans les commits intermédiaires entre les deux.
Dites que son SHA hash est 56e05fced214c44a37759efa2dfc25a65d8ae98d
. Alors pourquoi ne puis-je pas faire quelque chose comme:
git revert 56e05fced214c44a37759efa2dfc25a65d8ae98d
Si vous voulez valider le HEAD actuel avec l'état exact à un commet différent, en annulant tous les commits intermédiaires, vous pouvez utiliser reset
pour créer le bon état de l'index pour effectuer la validation.
# Reset the index and working tree to the desired tree
# Ensure you have no uncommitted changes that you want to keep
git reset --hard 56e05fced
# Move the branch pointer back to the previous HEAD
git reset --soft HEAD@{1}
git commit -m "Revert to 56e05fced"
Ce que git-revert crée, c’est un commit qui annule les modifications apportées à un commit, créant un commit qui est inverse (bien, réciproque) d’un commit donné. Donc
git revert <SHA-1>
devrait et fonctionne.
Si vous voulez revenir à un commit spécifié, et que vous pouvez le faire parce que cette partie de l'historique n'a pas encore été publiée, vous devez utiliser git-reset , pas git-revert:
git reset --hard <SHA-1>
(Notez que --hard
vous ferait perdre toutes les modifications non validées dans le répertoire de travail).
En passant, cela n’est peut-être pas évident, mais partout où la documentation indique <commit>
ou <commit-ish>
(ou <object>
), vous pouvez indiquer un identifiant SHA-1 (complet ou abrégé) de commit.
Il annule le dit commit, c'est-à-dire ajoute le commit qui lui est opposé. Si vous souhaitez extraire une révision antérieure, procédez comme suit:
git checkout 56e05fced214c44a37759efa2dfc25a65d8ae98d
Le meilleur moyen de revenir à un commit spécifique est:
git reset --hard <commit-id>
Ensuite:
git Push <reponame> -f
Si vos modifications ont déjà été placées dans une publique, partagée distante et que vous souhaitez annuler tous les commits entre HEAD
et <sha-id>
, vous pouvez passer une plage de validations à git revert
,
git revert 56e05f..HEAD
et tous les commits seront annulés entre 56e05f
et HEAD
(à l'exception du point de départ de la plage, 56e05f
).
Mise à jour:
Cette réponse est plus simple que ma réponse: Comment rétablir le dépôt précédent du dépôt Git?
Réponse originale
# Create a backup of master branch
git branch backup_master
# Point master to '56e05fce' and
# make working directory the same with '56e05fce'
git reset --hard 56e05fce
# Point master back to 'backup_master' and
# leave working directory the same with '56e05fce'.
git reset --soft backup_master
# Now working directory is the same '56e05fce' and
# master points to the original revision. Then we create a commit.
git commit -a -m "Revert to 56e05fce"
# Delete unused branch
git branch -d backup_master
Les deux commandes git reset --hard
et git reset --soft
sont magiques ici. Le premier change le répertoire de travail, mais il change également de tête. Nous réparons la tête par le second.
Ceci est plus compréhensible:
git checkout 56e05fced -- .
git add .
git commit -m 'Revert to 56e05fced'
Et pour prouver que cela a fonctionné:
git diff 56e05fced
Devrait être aussi simple que:
git reset --hard 56e05f
Cela vous ramènera à ce moment précis.