Você deve usar o índice. Depois de fazer uma redefinição mista (" git reset HEAD ^"), adicione o primeiro conjunto de alterações no índice e as confirme. Em seguida, comprometa o resto.
Você pode usar " git add " para colocar todas as alterações feitas em um arquivo no índice. Se você não deseja organizar todas as modificações feitas em um arquivo, apenas algumas delas, você pode usar "git add -p".
Vamos ver um exemplo. Vamos supor que eu tivesse um arquivo chamado myfile, que contém o seguinte texto:
something
something else
something again
Eu o modifiquei no meu último commit para que agora fique assim:
1
something
something else
something again
2
Agora eu decido que quero dividi-lo em dois e quero que a inserção da primeira linha esteja no primeiro commit e a inserção da última linha no segundo commit.
Primeiro, volto ao pai do HEAD, mas quero manter as modificações no sistema de arquivos, então uso "git reset" sem argumento (o que fará a chamada redefinição "mista"):
$ git reset HEAD^
myfile: locally modified
$ cat myfile
1
something
something else
something again
2
Agora eu uso "git add -p" para adicionar as alterações que quero confirmar no índice (= eu as preparo). "git add -p" é uma ferramenta interativa que pergunta sobre quais alterações no arquivo devem ser adicionadas ao índice.
$ 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
Então eu confirmo esta primeira alteração:
$ git commit -m "Added first line"
[master cef3d4e] Added first line
1 files changed, 1 insertions(+), 0 deletions(-)
Agora eu posso confirmar todas as outras alterações (ou seja, o número "2" colocado na última linha):
$ git commit -am "Added last line"
[master 5e284e6] Added last line
1 files changed, 1 insertions(+), 0 deletions(-)
Vamos verificar o log para ver o que temos:
$ 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 você pode usar para evitar o problema de ter que fazer issogit add -p
após a redefinição. Estou certo? Usando o git 1.7.9.5.