Tout d’abord, j’ai déjà vu la réponse à cette question auparavant, mais il y a tant de «réponses» qui ne répondent pas correctement à ma question et que je ne peux pas la retrouver.
Alors voilà: Comment restaurer dans Git une version précédente de mon historique, de sorte qu'il devienne le nouveau commit par-dessus mon historique actuel?
En gros, c’est la chose la plus fondamentale que je voudrais faire avec un système de contrôle de version. Effectuer une réinitialisation ne fonctionne pas, cela jettera mon historique, un simple retour ne fonctionnera pas non plus, parce que parfois cela me donnera des messages d'erreur (ce que je veux faire devrait être possible sans aucun message d'erreur).
Edit: Si je fais juste un git revert
cette erreur se produit:
git revert HEAD~1
error: could not revert f1b44e3... Towards translating API to kernel.
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
Simplement "checkout
le commit". Ceci écrasera votre répertoire de travail actuel avec l'instantané spécifié (commit) de votre dépôt de l'historique et en fera votre nouveau jeu de travail que vous pourrez organiser et valider à votre guise. Si vous commit
immédiatement après, votre référant aura le même contenu de système de fichiers que le commit que vous avez effectué le checkout
à (en supposant que vous n'avez pas d'autres changements non-staged ou staged)
Cela va not réécrire l’histoire, ni éditer ni effacer les commits précédents - il fonctionne donc comme un "retour en arrière" sur Mediawiki:
cd ~/git/your-repo-root
git log
# find the commit id you want
git checkout <commitId> .
# IMPORTANT NOTE: the trailing `.` in the previous line is important!
git commit -m "Restoring old source code"
Voir aussi: Retour à un ancien commit Git dans un dépôt public
.
(point)Le caractère .
(point) signifie "répertoire actuel" - ce n'est rien de spécial ou unique à git, c'est une convention standard de système de fichiers en ligne de commande qui est la même sous Windows, Linux, macOS et même MS-DOS. Cela fonctionne de la même manière que ..
signifie "répertoire parent". Je recommande de lire ces:
checkout
Sachez que checkout
est une commande surchargée dans git - cela peut vouloir dire changer de branche (à la svn switch
) ou obtenir un fichier spécifique ou une validation de l’historique et la placer dans votre espace de travail (à la svn update -r <id>
). Cela peut vouloir dire aussi autre chose: https://git-scm.com/docs/git-checkout - J'apprécie que cela peut dérouter les gens, surtout moi-même quand j'ai commencé à utiliser git après avoir utilisé TFS pendant des années (où "signifie autre chose entièrement).
Utiliser git revert https://git-scm.com/docs/git-revert
git revert HEAD~1
Edit: Je vois que vous voulez conserver l'historique, ma réponse ci-dessous est donc annulée. Cependant, cela reste utile. Vous pouvez réorganiser les lignes dans l'éditeur, puis continuer.
Revenons maintenant à la réponse originale.
Vous pouvez essayer la commande rebase.
git rebase -i HEAD~n
Où n
est environ un de plus que le nombre de commits entre courant et celui auquel vous voulez revenir. Supposons donc que vous supprimiez les 3 derniers commits:
git rebase -i HEAD~4
Une fois là-bas, il s’ouvrira dans VIM ou Nano (ou un autre éditeur). Supprimez simplement les lignes des commits à supprimer et quittez l'éditeur.
Dans VIM, ce serait esc
et tapez :exit
enter
.
Maintenant, appuyez simplement dessus. Cela entraînera une erreur, alors faites un Push Push.
git Push -f
Vous devrez peut-être spécifier le nom de la branche et en amont également. Ça devrait le faire!
Cette méthode supprime complètement les mauvais commits , elle ne va donc pas simplement ajouter un nouveau commit avec les changements de retour.
Voici la documentation: https://git-scm.com/docs/rebase