git sélective rétablit les modifications locales d’un fichier

Dans mon repo git qui suit un repository svn, j’ai apporté plusieurs modifications à un seul fichier.

Maintenant, je veux annuler ces modifications (comme svn revert), mais seulement des parties du fichier.

Je souhaite pouvoir afficher les différences sur le fichier, annuler les modifications que je ne souhaite pas et conserver les modifications souhaitées.

la

git add -i 

commande semble avoir une option pour le faire mais je ne veux pas encore mettre cela en scène.

Vous pouvez le faire directement avec git checkout -p . Voir la réponse de Daniel Stutzbach ci-dessous.


Ancienne réponse (avant que checkout -p été introduit):

Vous pouvez le faire comme ceci:

 git add -i 

(sélectionnez les pièces que vous souhaitez conserver)

 git commit -m "tmp" 

Maintenant, vous avez un commit avec seulement les modifications que vous voulez conserver, et le rest n’est pas mis en scène.

 git reset --hard HEAD 

À ce stade, les modifications non validées ont été supprimées. Vous disposez donc d’un répertoire de travail propre, avec les modifications que vous souhaitez conserver engagées.

 git reset --mixed HEAD^ 

Cela supprime le dernier commit (‘tmp’), mais conserve les modifications dans votre répertoire de travail, sans les mettre en scène.

EDIT: remplacé --soft avec --mixed , pour nettoyer la zone de --mixed .

Je crois que vous pouvez le faire le plus simplement avec:

 git checkout -p  

De la page de manuel:

  −p, −−patch Interactively select hunks in the difference between the  (or the index, if unspecified) and the working tree. The chosen hunks are then applied in reverse to the working tree (and if a  was specified, the index). 
  This means that you can use git checkout −p to selectively discard edits from your current working tree. 

Vous pouvez exécuter git diff sur le fichier, enregistrer le diff résultant, le modifier pour supprimer les modifications que vous souhaitez enregistrer, puis l’exécuter via le patch -R pour annuler les diffs restants.

  git diff fichier.txt> patch.tmp
 # modifiez le fichier patch.tmp pour supprimer les objects que vous souhaitez conserver
 patch -R 

On dirait que tu veux

  git revert --no-commit $REVSISON 

Vous pouvez alors utiliser

  git diff --cached 

pour voir quel changement sera effectué avant de valider (comme la restauration est juste un commit dans une direction avant qui réplique l’inverse d’un changement dans le passé)

Si vous utilisiez un repository Git pur, vous pourriez, en fonction de vos objectives, utiliser le rebase interactif ( git rebase -i ) pour revenir à la validation qui ne vous a pas plu et modifier la validation de manière rétroactive Ce n’est jamais arrivé, mais c’est généralement seulement si vous SAVEZ que vous ne voudrez plus jamais le revoir.

En relisant la question, il semble que vous souhaitiez annuler les modifications qui se trouvent dans votre arbre de travail et non les modifications qui ont été précédemment effectuées, mais certaines réponses vous font croire que ma lecture peut être incorrecte. Pouvez-vous clarifier?

Si les modifications ne concernent que votre copie de travail, le moyen le plus simple consiste à mettre en place les modifications que vous souhaitez conserver:

 git add -i  

Ensuite, jetez les modifications que vous ne souhaitez pas conserver en consultant la version d’index:

 git checkout --  

Ensuite, décompressez les modifications si vous ne souhaitez pas encore les mettre en scène:

 git reset --  

Cette recette ne fait que renverser les modifications sélectionnées du fichier (ou des fichiers que vous spécifiez) et ne crée aucune validation temporaire qui doit ensuite être restaurée.

Si vous souhaitez appliquer de manière sélective uniquement certaines des modifications apscopes lors des validations précédentes, vous pouvez d’abord réinitialiser un fichier à un état précédemment validé:

 git reset  --  

Ensuite, vous pouvez suivre la recette précédente de git add -i pour mettre en place les modifications que vous souhaitez conserver, git checkout -- pour éliminer les modifications indésirables et git reset -- pour “unstage” les changements.

Les options de ligne de commande décrites dans les réponses sont utiles lorsque le fichier se trouve sur un serveur auquel j’accède via un terminal ssh. Cependant, lorsque le fichier est sur mon ordinateur local, je préfère la méthode suivante:

Ouvrez le fichier dans l’éditeur netbeans (fourni avec le support git). Netbeans met des marques rouges / vertes / bleues aux numéros de ligne pour indiquer où les éléments ont été supprimés / ajoutés / modifiés (respectivement).

En cliquant avec le bouton droit de la souris sur l’une de ces marques, vous pouvez annuler cette modification. De plus, vous pouvez cliquer avec le bouton droit sur les marques rouges et bleues pour trouver l’ancienne version dans une fenêtre contextuelle.