193 votes

Vérifier l'ancien commit et le transformer en nouveau commit

Avec Git, disons que je me trompe dans mes commits, et que je veux faire de la version d'il y a 3 commits la nouvelle version. Si je fais git checkout xxxx Si je ne suis pas en mesure de le faire, cela crée une nouvelle branche et il semble que je ne puisse que la fusionner ? Puis-je en faire la nouvelle "version maître" ?

Je veux :

A-B-C-D-E

pour devenir

A-B-C-D-E-F

où F a exactement le même contenu que C

Si j'utilise git revert xxxx Au lieu de cela, il semble qu'il y aura certainement des conflits et que je devrai les résoudre manuellement.

Ce que je veux vraiment, c'est que l'ancien commit devienne à un moment donné le nouveau commit, indépendamment de ce qui se trouve dans mon répertoire de travail ou du dernier commit.

Comment dois-je m'y prendre ?

205voto

svick Points 81772
git rm -r .
git checkout HEAD~3 .
git commit

Après la validation, les fichiers dans le nouveau HEAD seront les mêmes que lors de la révision HEAD~3 .

31voto

Michael Mrozek Points 44120

Il semble que vous vouliez simplement réinitialiser à C ; c'est faire l'arbre :

A-B-C

Vous pouvez le faire avec reset :

git reset --hard HEAD~3

(Note : Vous avez dit qu'il y a trois commits, donc c'est ce que j'ai écrit ; dans votre exemple, C est seulement deux commits, donc vous pourriez vouloir utiliser <code>HEAD~2</code> )


Vous pouvez également utiliser revert si vous le souhaitez, bien que pour autant que je sache, vous devez faire les inversions une par une :

git revert HEAD     # Reverts E
git revert HEAD~2   # Reverts D

Cela créera un nouveau commit F qui a le même contenu que D, et G qui a le même contenu que C. Vous pouvez rebase pour les écraser ensemble si vous voulez

16voto

eloone Points 754

C'est exactement ce que je voulais faire. Je n'étais pas sûr de la commande précédente git cherry-pick C Cela semble bien mais il semble que vous fassiez cela pour obtenir des changements d'une autre branche mais pas sur la même branche, quelqu'un a-t-il essayé ?

Alors j'ai fait quelque chose d'autre qui a aussi fonctionné : J'ai récupéré les fichiers que je voulais depuis l'ancien commit, fichier par fichier.

git checkout <commit-hash> <filename>

ex : git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css

-> ceci prend les fichiers tels qu'ils étaient dans l'ancien commit

Puis j'ai fait mes changements. Et je me suis à nouveau engagé.

git status (to check which files were modified)
git diff (to check the changes you made)
git add .
git commit -m "my message"

J'ai vérifié mon historique avec git log et j'ai toujours mon historique ainsi que mes nouvelles modifications faites à partir des anciens fichiers. Et je pourrais pousser aussi.

Notez que pour revenir à l'état que vous voulez, vous devez mettre le hash du commit avant les changements non désirés. Assurez-vous également que vous n'avez pas de changements non validés avant de faire cela.

15voto

Nick Weisser Points 110

Eloone l'a fait fichier par fichier avec

git checkout <commit-hash> <filename>

mais vous pouvez vérifier tous les fichiers plus facilement en faisant

git checkout <commit-hash> .

7voto

Adrian Parsons Points 51

git cherry-pick C

où C est le hash de commit pour C. Ceci applique l'ancien commit par dessus le plus récent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X