143 votes

Puis-je faire un retour partiel dans GIT

Est-il possible de revenir d'un seul fichier ou de certains changements dans un fichier dans fichiers multi engager?

Histoire complète J'ai commis un tas de fichiers. Un certain nombre de commits plus tard, quelqu'un qui restera sans nom (JACK!!!) copier un fichier dans son référentiel et commis plusieurs fichiers, la réécriture de certains des changements que j'ai fait. Je veux revenir un fichier qui a tabassé ou mieux encore, aller et revenir deux modifications dans ce fichier. Cela devra être séparé de revenir commettre depuis qu'il a été tiré et poussé.

190voto

bobDevil Points 5986

Vous pouvez annuler la validation sans en créer une nouvelle en ajoutant l'option '--no-commit'. Cela laisse tous les fichiers annulés dans la zone intermédiaire. À partir de là, j'effectuais une réinitialisation logicielle et ajoutais les modifications que je souhaitais vraiment. Pour un exemple de flux de travail:

 git revert <sha-of-bad-commit> --no-commit
git reset   // This gets them out of the staging area
<edit bad file to look like it should, if necessary>
git add <bad-file>
git checkout . // This wipes all the undesired reverts still hanging around in the working copy
git commit
 

81voto

Casey Points 19286

Vous pouvez appliquer de manière interactive l'ancienne version d'un fichier à l'aide de la commande checkout .

Par exemple, si vous connaissez les COMMIT où le code à rajouter a été supprimé, vous pouvez exécuter la commande suivante:

 git checkout -p COMMIT^ -- FILE_TO_REVERT
 

Git vous demandera de rajouter les éléments manquants dans la version actuelle du fichier. Vous pouvez utiliser e pour créer un correctif de la modification avant de l'appliquer.

39voto

Brian Campbell Points 101107

Vous pouvez simplement vérifier manuellement l'ancienne, un bon contenu des fichiers que vous souhaitez revenir à l'aide de git checkout. Par exemple, si vous souhaitez revenir my-important-file à la version qu'il était dans la version abc123, vous pouvez le faire

git checkout abc123 -- my-important-file

Maintenant, vous avez l'ancien contenu de my-important-file de retour, et même les modifier si vous le souhaitez, et de s'engager comme d'habitude pour faire un commit qui va annuler les changements qu'il a fait. Si il y a seulement quelques parties de son commit que vous voulez revenir, utilisez git add -p pour sélectionner seulement quelques mecs à partir du patch que vous commettez.

28voto

ntc2 Points 1643

J'ai trouvé le moyen de le faire sur le Git liste de diffusion:

git show <commit> -- <path> | git apply --reverse

Source: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406

Les Variations de

Cette commande échoue (à l'origine aucune modification) si le patch ne s'applique pas proprement, mais avec --3way vous obtenez plutôt les conflits qui vous pouvez alors régler manuellement (dans ce cas, Casey, la réponse pourrait être plus pratique):

git show <commit> -- <path> | git apply --reverse --3way

Vous pouvez également utiliser cette partie, de revenir plusieurs s'engage, par ex.:

git log -S<string> --patch | git apply --reverse

pour rétablir les fichiers avec les changements de correspondance <string> dans tous les commettre. C'est exactement ce dont j'avais besoin dans mon cas d'utilisation (un peu distincte s'engage introduit des changements similaires dans des fichiers différents, avec des changements d'autres fichiers sans rapport avec les moyens que je n'ai pas envie de revenir).

Si vous avez diff.noprefix=true ensemble dans votre ~/.gitconfig ensuite, vous devez ajouter -p0 de la git apply de commande, par ex.

git show <commit> -- <path> | git apply -p0 --reverse

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