Question

J'ai modifié un script et je l'ai validé. Ensuite, j'ai apporté quelques modifications et les ai placées dans un référentiel distant, par exemple.

Ensuite, j'ai réalisé que le premier changement que j'ai mentionné était stupide et que je voulais l'annuler .. Puis-je & "désappliquer &"; ce commit, sans copier / coller manuellement le diff?

Par exemple: j'ai deux fichiers, a.py et b.py:

.
Commit 1:
I delete a function in a.py

Commit 2:
I change a few lines in b.py

Commit 3:
I change the docstring in a.py

Puis-je annuler la suppression de cette fonction et la faire apparaître comme " commit 4 " (plutôt que de supprimer la validation 1)

Était-ce utile?

La solution

Oui, vous pouvez utiliser Git Revert pour cela. Reportez-vous à la section de ce manuel git pour plus d'informations.

En substance, vous pouvez dire:

git revert 4f4k2a

Où 4f4k2a est l'identifiant du commit que vous souhaitez annuler, il essaiera de l'annuler.

Autres conseils

Juste un commentaire:

git revert aCommit

annule la toute validation (comme dans " tous les fichiers faisant partie de la validation "):
il calcule un patch inverse, l'applique sur HEAD et le valide.

Donc, deux problèmes ici (le premier est facilement résolu):

  • il valide toujours, vous pouvez donc ajouter l'option -no-commit : & "; git revert --no-commit aCommit &": ceci est utile lorsque vous annulez plus d'une validation. " effectuer sur votre index dans une ligne.
  • il ne s'applique pas à un fichier spécifique (que se passe-t-il si vous faites partie d'un commit avec 1 000 autres modifications que vous ne souhaitez peut-être pas annuler)?
    Pour cela, si vous souhaitez extraire des fichiers spécifiques tels qu’ils étaient dans un autre commit, vous devriez voir git-checkout , en particulier la syntaxe git checkout <commit> <filename> (cependant, ce n'est pas exactement ce dont vous avez besoin dans ce cas)

Easy Git (Elijah Newren) a tenté d'apporter plus " retour complet " sur la liste de diffusion Git ; mais sans grand succès:

  

Les gens veulent parfois & "annuler les modifications &";

     

Maintenant, cela peut être:

     
      
  • les changements entre 32 et 29 révisions il y a,
  •   
  • il pourrait s'agir de toutes les modifications depuis la dernière validation,
  •   
  • cela pourrait être les changements depuis 3 commits ou
  •   
  • cela pourrait être juste un commit spécifique.
  •   
  • Il est possible que l'utilisateur veuille créer un sous-ensemble de ces reprises uniquement dans des fichiers spécifiques ,
  •   

(eg revert est documenté ici , mais je le suis pas sûr que cela fasse partie de la distribution actuelle de, par exemple)

  

mais tout se résume à & "annuler les modifications &"; à la fin.

eg revert --since HEAD~3  # Undo all changes since HEAD~3
eg revert --in HEAD~8     # much like git revert HEAD~8, but nocommit by default
eg revert --since HEAD foo.py  # Undo changes to foo.py since last commit
eg revert foo.py               # Same as above
eg revert --in trial~7 bar.c baz.  # Undo changes made in trial~7 to bar.[ch]
  

Ces types de " inverser les données " vraiment si différent qu'il devrait y avoir plusieurs commandes ou que certaines de ces opérations ne soient pas supportées par la simple commande revert?
  Bien sûr, la plupart des utilisateurs utiliseront probablement le & Quot; eg revert FILE1 FILE2... & Quot;   forme, mais je n'ai pas vu le mal à supporter les capacités supplémentaires.

     

Aussi ... y a-t-il quelque chose de fondamental qui empêcherait un idiot d'adopter un tel comportement?

     

Élie

     

Remarque: les validations par défaut n'ont pas de sens pour la commande revert généralisée, et " git revert REVISION " erreur avec des instructions (indiquant à l'utilisateur d'ajouter le drapeau --in).

Disons que vous avez, sur 50 validés, 20 fichiers pour lesquels vous réalisez que l'ancien commit X introduisait des modifications qui n'auraient pas dû avoir lieu.
Un peu de plomberie est en ordre.
Il vous faut un moyen de répertorier tous les fichiers spécifiques dont vous avez besoin pour rétablir

(comme dans " annuler les modifications apportées à la validation X tout en conservant toutes les modifications ultérieures " ),
et ensuite, pour chacun d'eux:

git-merge-file -p a.py X X^

Le problème ici est de récupérer la fonction perdue sans effacer toutes les modifications ultérieures dans a.py que vous voudrez peut-être conserver.
Cette technique est parfois appelée & Quot; fusion négative & Quot;.

.

Depuis git merge-file <current-file> <base-file> <other-file> signifie :
incorpore toutes les modifications qui mènent de <base-file> à <other-file> dans <current-file>, vous pouvez restaurer la fonction supprimée en indiquant que vous souhaitez intégrer toutes les modifications.)

  • à partir de: X (où la fonction a été supprimée)
  • à: X ^ (le commit précédent avant X, où la fonction était toujours là)

Remarque: l'argument '-p' vous permet de passer en revue en premier les modifications sans rien faire de mal.fichier de loyer. Lorsque vous êtes sûr, supprimez cette option.

Remarque : le git merge-file est pas si simple : vous ne pouvez pas faire référence aux versions précédentes du fichier comme ça.
(vous auriez sans cesse le message frustrant: error: Could not stat X )

Vous devez:

git cat-file blob a.py > tmp/ori # current file before any modification
git cat-file blob HEAD~2:a.py > tmp/X # file with the function deleted
git cat-file blob HEAD~3:a.py > tmp/F # file with the function which was still there

git merge-file a.py tmp/X tmp/F # basically a RCS-style merge
                                 # note the inversed commit order: X as based, then F
                                 # that is why is is a "negative merge"
diff -u a.py tmp/ori # eyeball the merge result
git add a.py 
git commit -m "function restored" # and any other changes made from X are preserved!

Si cela doit être fait pour un grand nombre de fichiers dans un commit précédent ... certains scripts sont en ordre;)

Pour rétablir les modifications apportées à un seul fichier dans une validation, procédez comme suit: VonC a souligné, je ferais checkout la branche (maître ou coffre ou autre) puis diff la version du fichier que je voulais rétablir et le traiter comme un nouveau commit:

$ git checkout trunk
$ git checkout 4f4k2a^ a.py
$ git add a.py
$ git diff              #verify I'm only changing what I want; edit as needed
$ git commit -m 'recover function deleted from a.py in 4f4k2a'

Il existe probablement une commande de plomberie qui le ferait directement, mais je ne l'emploierais pas si je le savais. Ce n'est pas que je ne fais pas confiance à Git, mais je ne me fie pas à moi-même - je ne crois pas que je savais sans regarder ce qui a été changé dans ce fichier dans ce commit et depuis lors. Et une fois que je regarde, il est plus facile de construire un nouveau commit en modifiant le <=>. Peut-être que c'est juste un style de travail personnel.

Découvrez ce retour git question . Il semble y avoir un problème lors de l’annulation de validations anciennes, si ce n’est dans une séquence consécutive incluant la validation la plus récente.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top