Est-il possible de restaurer un seul fichier ou certaines modifications dans un fichier en commit multi-fichiers?
Histoire complète J'ai commis un tas de fichiers. Un certain nombre de commits plus tard, quelqu'un qui restera sans nom (JACK !!!) a copié un fichier dans son référentiel et a validé plusieurs fichiers, écrasant certaines des modifications que j'ai faites. Je veux restaurer le fichier qui a été bloqué ou mieux encore, entrer et annuler deux modifications dans ce fichier. Cela devra être un commit de retour séparé car il a été tiré et poussé.
--3way
entraîne des conflits de fusion au lieu de l'échec de l'application des correctifs.Réponses:
Vous pouvez annuler le commit sans en créer un nouveau en ajoutant l'option '--no-commit'. Cela laisse tous les fichiers rétablis dans la zone intermédiaire. À partir de là, j'effectuerais une réinitialisation logicielle et ajouterais les modifications que je voulais vraiment. Pour un exemple de workflow:
la source
git add -p
démarrer une session interactive qui vous permet d'ajouter sélectivement des morceaux de fichiers au lieu de fichiers entiers. (Il y a aussigit reset -p
à désinstaller sélectivement les changements. Bon à savoir, mais probablement pas ce que vous voulez dans ce scénario.)revert
,reset
,stash -p
(Stash « annule que je ne veux pas faire actualy »),add
le reste,commit
Vous pouvez appliquer de manière interactive l'ancienne version d'un fichier à l'aide de la
checkout
commande.Par exemple, si vous savez
COMMIT
où le code à rajouter a été supprimé, vous pouvez exécuter la commande suivante:Git vous demandera de rajouter les morceaux manquants dans la version actuelle du fichier. Vous pouvez utiliser
e
pour créer un correctif du changement avant de le réappliquer.la source
git checkout -p path/to/file
Vous pouvez simplement extraire manuellement l'ancien et bon contenu des fichiers que vous souhaitez rétablir
git checkout
. Par exemple, si vous souhaitez revenirmy-important-file
à la version qu'il était dans la versionabc123
, vous pouvez faireVous avez maintenant l'ancien contenu de
my-important-file
back, et pouvez même les éditer si vous le souhaitez, et vous engager comme d'habitude pour faire un commit qui annulera les modifications qu'il a apportées. S'il n'y a que quelques parties de son commit que vous souhaitez annuler, utilisezgit add -p
pour sélectionner seulement quelques morceaux du patch que vous validez.la source
revert
, vous reprenez simplement une ancienne version du fichier. Un correctrevert
supprimera les mauvaises modifications de commit dans le fichier, même s'il a été modifié plusieurs fois depuis ce mauvais commit, et vous ne voulez pas perdre ces modifications.git checkout -p
.J'ai trouvé un moyen de le faire sur la liste de diffusion Git:
Source: http://git.661346.n2.nabble.com/Revert-a-single-commit-in-a-single-file-td6064050.html#a6064406
Variations
Cette commande échoue (ne provoquant aucun changement) si le correctif ne s'applique pas proprement, mais avec
--3way
vous, des conflits que vous pouvez ensuite résoudre manuellement (dans ce cas, la réponse de Casey pourrait être plus pratique):Vous pouvez également l'utiliser pour annuler partiellement plusieurs commits, par exemple:
pour restaurer les fichiers avec des modifications correspondant
<string>
à n'importe quel commit. C'est exactement ce dont j'avais besoin dans mon cas d'utilisation (quelques commits séparés ont introduit des modifications similaires dans différents fichiers, ainsi que des modifications d'autres fichiers de manière indépendante que je ne voulais pas rétablir).Si vous avez
diff.noprefix=true
défini dans votre~/.gitconfig
alors vous devez ajouter-p0
à lagit apply
commande, par exemplela source
git show ... > foo.txt
(2) éditerfoo.txt
pour supprimer les diffs que je ne voulais pas revenir (3)git apply --reverse foo.txt
pour rétablir les diffs toujours répertoriésfoo.txt
.