Vous devez utiliser l'index. Après avoir effectué une réinitialisation mixte (" git reset HEAD ^"), ajoutez le premier ensemble de modifications dans l'index, puis validez-les. Engagez ensuite le reste.
Vous pouvez utiliser " git add " pour mettre toutes les modifications apportées dans un fichier à l'index. Si vous ne voulez pas mettre en scène toutes les modifications apportées dans un fichier, seulement certaines d'entre elles, vous pouvez utiliser "git add -p".
Voyons un exemple. Supposons que j'avais un fichier appelé monfichier, qui contient le texte suivant:
something
something else
something again
Je l'ai modifié dans mon dernier commit pour que maintenant ça ressemble à ceci:
1
something
something else
something again
2
Maintenant, je décide que je veux le diviser en deux, et je veux que l'insertion de la première ligne soit dans le premier commit, et l'insertion de la dernière ligne dans le deuxième commit.
Je reviens d'abord au parent de HEAD, mais je veux conserver les modifications dans le système de fichiers, donc j'utilise "git reset" sans argument (ce qui fera une réinitialisation dite "mixte"):
$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2
Maintenant, j'utilise "git add -p" pour ajouter les changements que je veux valider à l'index (= je les mets en scène). "git add -p" est un outil interactif qui vous demande quelles modifications du fichier doit-il ajouter à l'index.
$ git add -p myfile
diff --git a/myfile b/myfile
index 93db4cb..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,5 @@
+1
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,s,e,?]? s # split this section into two!
Split into 2 hunks.
@@ -1,3 +1,4 @@
+1
something
something else
something again
Stage this hunk [y,n,a,d,/,j,J,g,e,?]? y # yes, I want to stage this
@@ -1,3 +2,4 @@
something
something else
something again
+2
Stage this hunk [y,n,a,d,/,K,g,e,?]? n # no, I don't want to stage this
Ensuite, je commets ce premier changement:
$ git commit -m "Added first line"
[master cef3d4e] Added first line
1 files changed, 1 insertions(+), 0 deletions(-)
Maintenant, je peux valider toutes les autres modifications (à savoir le chiffre "2" mis à la dernière ligne):
$ git commit -am "Added last line"
[master 5e284e6] Added last line
1 files changed, 1 insertions(+), 0 deletions(-)
Vérifions le journal pour voir quels engagements nous avons:
$ git log -p -n2 | cat
Commit 5e284e652f5e05a47ad8883d9f59ed9817be59d8
Author: ...
Date: ...
Added last line
Diff --git a/myfile b/myfile
Index f9e1a67..2f113ce 100644
--- a/myfile
+++ b/myfile
@@ -2,3 +2,4 @@
something
something else
something again
+2
Commit cef3d4e0298dd5d279a911440bb72d39410e7898
Author: ...
Date: ...
Added first line
Diff --git a/myfile b/myfile
Index 93db4cb..f9e1a67 100644
--- a/myfile
+++ b/myfile
@@ -1,3 +1,4 @@
+1
something
something else
something again
git reset [--patch|-p] <commit>
que vous pouvez utiliser pour vous éviter d'avoir à le fairegit add -p
après la réinitialisation. Ai-je raison? Utiliser git 1.7.9.5.