Je veux annuler certaines, mais pas toutes, des modifications que j'ai apportées dans un fichier avec le dernier commit. De préférence, le fichier partiellement rétabli devrait alors résider dans mon répertoire de travail.

Je suis confus par checkout --patch filename, quelle est la meilleure façon de procéder?

git
0
LearnOPhile 23 déc. 2015 à 21:30

4 réponses

Meilleure réponse

Comme vous l'avez dit vous-même, git checkout --patch est la meilleure façon de procéder. Vous pourriez être confus car vous devez spécifier l'objet arborescent (commit ou branche) à partir duquel extraire. Dans votre exemple particulier, vous voudriez git checkout --patch HEAD~1

git checkout --patch se comporte de manière très similaire à git add --patch, sauf qu'il ajoute à partir d'une autre arborescence au répertoire de travail au lieu du répertoire de travail à l'index.

Ce qui se passe une fois que vous avez tapé l'arborescence et les chemins que vous souhaitez extraire, c'est que git affiche un différentiel morceau par morceau entre votre fichier et celui que vous souhaitez extraire. Ensuite, vous pouvez spécifier si vous souhaitez appliquer le bloc, rejeter le bloc ou diviser le bloc en plus petits morceaux. Appuyez sur ? dans cet outil interactif pour obtenir une liste complète de ce que vous pouvez faire.

Ça devrait ressembler a quelque chose comme ca:

$ # git checkout --patch <tree>  <path>
$   git checkout --patch 9e881cb conf/nginx.conf 
diff --git b/conf/nginx.conf a/conf/nginx.conf
index ff0454a..a3c3ed7 100644
--- b/conf/nginx.conf
+++ a/conf/nginx.conf
@@ -1,12 +1,8 @@
 server {
   server_name strikeskids.com;
+  root /www/strikeskids;

   location / {
-    root /www/strikeskids/jekyll;
     try_files $uri $uri.html $uri/index.html =404;
   }
-
-  location /up/ {
-    root /www/strikeskids;
-  }
 }
Apply this hunk to index and worktree [y,n,q,a,d,/,s,e,?]? s <=== split 
                             chunk into smaller pieces
Split into 3 hunks.
@@ -1,4 +1,5 @@
 server {
   server_name strikeskids.com;
+  root /www/strikeskids;

   location / {
Apply this hunk to index and worktree [y,n,q,a,d,/,j,J,g,e,?]? y <=== include
                             this chunk in the checkout
@@ -3,5 +4,4 @@

   location / {
-    root /www/strikeskids/jekyll;
     try_files $uri $uri.html $uri/index.html =404;
   }
Apply this hunk to index and worktree [y,n,q,a,d,/,K,j,J,g,e,?]? n <=== do not
                             include this chunk in the checkout
@@ -6,7 +6,3 @@
     try_files $uri $uri.html $uri/index.html =404;
   }
-
-  location /up/ {
-    root /www/strikeskids;
-  }
 }
Apply this hunk to index and worktree [y,n,q,a,d,/,K,g,e,?]? q <== finish now, 
                             including the chunks I've specified but not any others
1
Strikeskids 23 déc. 2015 à 18:45

git checkout HEAD~1 path/to/file vous donne la version précédente du fichier. Ensuite, vous pouvez annuler les modifications que vous souhaitez conserver (ainsi, créer un fichier pour qu'il ressemble à ce que vous voulez), puis valider les modifications comme d'habitude.

1
kan 23 déc. 2015 à 18:42

Si vous êtes autorisé à réécrire votre historique (si votre commit n'a pas encore été transféré vers un référentiel distant, par exemple):

# undo your commit
git reset HEAD~
# now remove the changes you didn't want in your last commit
# and commit again
git commit 
0
Chris Maes 23 déc. 2015 à 18:39

Peut-être serez-vous intéressé par le très bon article sur le blog github sur Comment annuler (presque) tout avec Git...

0
Philippe 23 déc. 2015 à 19:41