Utilizzare git rebase --interactive
per modificare quel commit precedente, eseguirlo git reset HEAD~
e quindi git add -p
per aggiungerne alcuni, quindi effettuare un commit, quindi aggiungerne un altro e effettuare un altro commit, tutte le volte che si desidera. Quando hai finito, corri git rebase --continue
e avrai tutti i commit suddivisi in precedenza nel tuo stack.
Importante : nota che puoi giocare e apportare tutte le modifiche che desideri e non devi preoccuparti di perdere le vecchie modifiche, perché puoi sempre correre git reflog
per trovare il punto nel tuo progetto che contiene le modifiche che desideri (chiamiamolo a8c4ab
) e quindi git reset a8c4ab
.
Ecco una serie di comandi per mostrare come funziona:
mkdir git-test; cd git-test; git init
ora aggiungi un file A
vi A
aggiungi questa riga:
one
git commit -am one
quindi aggiungi questa riga ad A:
two
git commit -am two
quindi aggiungi questa riga ad A:
three
git commit -am three
ora il file A è simile al seguente:
one
two
three
e il nostro git log
sembra il seguente (bene, io usogit log --pretty=oneline --pretty="%h %cn %cr ---- %s"
bfb8e46 Rose Perrone 4 seconds ago ---- three
2b613bc Rose Perrone 14 seconds ago ---- two
9aac58f Rose Perrone 24 seconds ago ---- one
Diciamo che vogliamo dividere il secondo commesso, two
.
git rebase --interactive HEAD~2
Questo fa apparire un messaggio simile al seguente:
pick 2b613bc two
pick bfb8e46 three
Cambia il primo pick
in un e
per modificare quel commit.
git reset HEAD~
git diff
ci mostra che abbiamo appena messo in scena il commit che abbiamo fatto per il secondo commit:
diff --git a/A b/A
index 5626abf..814f4a4 100644
--- a/A
+++ b/A
@@ -1 +1,2 @@
one
+two
Mettiamo in scena quel cambiamento e aggiungiamo "e un terzo" a quella linea nel file A
.
git add .
Questo di solito è il punto durante un rebase interattivo in cui verremmo eseguiti git rebase --continue
, perché di solito vogliamo solo tornare indietro nella nostra pila di commit per modificare un commit precedente. Ma questa volta, vogliamo creare un nuovo commit. Quindi correremo git commit -am 'two and a third'
. Ora modifichiamo il file A
e aggiungiamo la linea two and two thirds
.
git add .
git commit -am 'two and two thirds'
git rebase --continue
Abbiamo un conflitto con il nostro impegno, three
, quindi risolviamolo:
Cambieremo
one
<<<<<<< HEAD
two and a third
two and two thirds
=======
two
three
>>>>>>> bfb8e46... three
per
one
two and a third
two and two thirds
three
git add .; git rebase --continue
Ora il nostro git log -p
assomiglia a questo:
commit e59ca35bae8360439823d66d459238779e5b4892
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 13:57:00 2013 -0700
three
diff --git a/A b/A
index 5aef867..dd8fb63 100644
--- a/A
+++ b/A
@@ -1,3 +1,4 @@
one
two and a third
two and two thirds
+three
commit 4a283ba9bf83ef664541b467acdd0bb4d770ab8e
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 14:07:07 2013 -0700
two and two thirds
diff --git a/A b/A
index 575010a..5aef867 100644
--- a/A
+++ b/A
@@ -1,2 +1,3 @@
one
two and a third
+two and two thirds
commit 704d323ca1bc7c45ed8b1714d924adcdc83dfa44
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 14:06:40 2013 -0700
two and a third
diff --git a/A b/A
index 5626abf..575010a 100644
--- a/A
+++ b/A
@@ -1 +1,2 @@
one
+two and a third
commit 9aac58f3893488ec643fecab3c85f5a2f481586f
Author: Rose Perrone <roseperrone@fake.com>
Date: Sun Jul 7 13:56:40 2013 -0700
one
diff --git a/A b/A
new file mode 100644
index 0000000..5626abf
--- /dev/null
+++ b/A
@@ -0,0 +1 @@
+one