Checkout ancienne commit et en faire une nouvelle commit [dupliquer]
cette question a déjà une réponse ici:
- Comment revenir sur un dépôt Git à une précédente livraison 39 réponses
sur Git, dites que je gâche mes commits, et je veux faire la version 3 commits ago comme la nouvelle version. Si je fais git checkout xxxx
, il crée une nouvelle branche et il me semble que je ne peut fusionner? Puis-je en faire la nouvelle "version master"?
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
à la place, il semble qu'il aura certainement des conflits et j'ai besoin de résoudre manuellement.
ce que je veux vraiment, c'est que l'ancien commit à un moment donné le nouveau commit, peu importe ce qu'il y a dans mon répertoire de travail ou la dernière commande.
Comment pourrais-je faire ça?
6 réponses
git rm -r .
git checkout HEAD~3 .
git commit
après la propagation, les fichiers de la nouvelle HEAD
seront les mêmes que ceux de la révision HEAD~3
.
on dirait que vous voulez simplement réinitialiser en C; c'est-à-dire faire l'arbre:
A-B-C
vous pouvez le faire avec reset
:
git reset --hard HEAD~3
(Note: Vous avez dit trois commits ago donc c'est ce que j'ai écrit; dans votre exemple C est seulement deux commits ago, donc vous pourriez vouloir utiliser HEAD~2
)
Vous pouvez également utiliser revert
si vous voulez, bien que pour autant que je sache vous devez faire les retours un à la fois:
git revert HEAD # Reverts E
git revert HEAD~2 # Reverts D
qui va créer un nouveau commit F qui est le même contenu que D, et G qui est le même contenu que C. Vous pouvez rebase
pour écraser ceux ensemble si vous voulez
C'est exactement ce que je voulais faire. Je n'étais pas sûr de la commande précédente git cherry-pick C
, il sonne bien, mais il semble que vous le faire pour obtenir des changements d'une autre branche, mais pas sur la même branche, quelqu'un a déjà essayé?
donc j'ai fait quelque chose d'autre qui a aussi fonctionné : J'ai récupéré les fichiers que je voulais récupérer de l'ancien fichier de propagation par fichier
git checkout <commit-hash> <filename>
ex :
git checkout 08a6497b76ad098a5f7eda3e4ec89e8032a4da51 file.css
- > cela prend les fichiers comme ils étaient à partir de la ancien commit
puis j'ai fait mes changements. Et je me suis engagé à nouveau.
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 histoire avec git log
, et j'ai encore mon histoire avec 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 hachage de la propagation avant les changements indésirables. Assurez-vous également que vous n'avez pas de modifications non validées avant de le faire.
eloone l'a fait fichier par fichier avec
git checkout <commit-hash> <filename>
mais vous pourriez vérifier tous les fichiers plus facilement en faisant
git checkout <commit-hash> .
git cherry-pick C
où C est le hachage de commit pour C. Ceci applique l'ancien commit sur le plus récent.
les autres réponses créent jusqu'à présent de nouvelles propagations qui annulent ce qui est dans les anciennes propagations. Il est possible de revenir en arrière et de "changer l'histoire" en quelque sorte, mais cela peut être un peu dangereux. Vous devez seulement le faire si la propagation que vous changez n'a pas été poussée vers d'autres dépôts.
la commande que vous recherchez est git rebase --interactive
si vous voulez changer de tête~3, la commande que vous voulez émettre est git rebase --interactive HEAD~4
. Ce ouvrira un éditeur de texte et vous permettra de spécifier les propagations que vous souhaitez modifier.
exercez-vous sur un dépôt différent avant d'essayer ceci avec quelque chose d'important. Les pages de manuel devraient vous donner toutes les autres informations dont vous avez besoin.