Dovresti usare l'indice. Dopo aver eseguito un ripristino misto (" git reset HEAD ^"), aggiungi la prima serie di modifiche all'indice, quindi esegui il commit. Quindi commetti il resto.
Puoi usare " git add " per mettere tutte le modifiche apportate in un file all'indice. Se non vuoi mettere in scena tutte le modifiche apportate in un file, solo alcune di esse, puoi usare "git add -p".
Vediamo un esempio. Supponiamo di avere un file chiamato myfile, che contiene il seguente testo:
something
something else
something again
L'ho modificato nel mio ultimo commit in modo che ora assomigli a questo:
1
something
something else
something again
2
Ora decido che voglio dividerlo in due e voglio che l'inserimento della prima riga sia nel primo commit e l'inserimento dell'ultima riga sia nel secondo commit.
Per prima cosa torno al genitore di HEAD, ma voglio mantenere le modifiche nel file system, quindi uso "git reset" senza argomenti (che farà un cosiddetto reset "misto"):
$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2
Ora uso "git add -p" per aggiungere le modifiche che voglio impegnare nell'indice (= le metto in scena). "git add -p" è uno strumento interattivo che ti chiede quali modifiche al file dovrebbe aggiungere all'indice.
$ 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
Quindi commetto questa prima modifica:
$ git commit -m "Added first line"
[master cef3d4e] Added first line
1 files changed, 1 insertions(+), 0 deletions(-)
Ora posso eseguire il commit di tutte le altre modifiche (ovvero il numero "2" inserito nell'ultima riga):
$ git commit -am "Added last line"
[master 5e284e6] Added last line
1 files changed, 1 insertions(+), 0 deletions(-)
Controlliamo il registro per vedere cosa ci impegniamo:
$ 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>
che puoi usare per salvarti la difficoltà di doverlogit add -p
dopo aver ripristinato. Ho ragione? Usando git 1.7.9.5.