git rebase --interactive
è il comando che desideri.
Esempio:
Lo stato attuale è questo:
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git status
On branch master
nothing to commit, working tree clean
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
a6e3c6a (HEAD -> master) Fourth commit
9a24b81 Third commit
7bdfb68 Second commit
186d1e0 First commit
Voglio riordinare i commit 9a24b81
(Terzo commit) e 7bdfb68
(Secondo commit). Per fare ciò, trovo prima il commit prima del primo commit che vogliamo modificare . Questo è commit 186d1e0
(primo commit).
Il comando da eseguire è git rebase --interactive COMMIT-BEFORE-FIRST-COMMIT-WE-WANT-TO-CHANGE
, in questo caso:
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git rebase --interactive 186d1e0
Questo apre un file nell'editor predefinito con i seguenti contenuti:
pick 7bdfb68 Second commit
pick 9a24b81 Third commit
pick a6e3c6a Fourth commit
# Rebase 186d1e0..a6e3c6a onto 186d1e0 (3 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
Nota che l'ordine dei commit nel file è opposto a quello usato per git log. In git log, il commit più recente è in alto. In questo file, il commit più recente è in fondo.
Come spiega il commento in fondo al file, ci sono varie cose che posso fare, come schiacciare, eliminare e riordinare i commit. Per riordinare i commit, modifico il file in modo che assomigli a questo (i commenti in basso non vengono visualizzati):
pick 9a24b81 Third commit
pick 7bdfb68 Second commit
pick a6e3c6a Fourth commit
Il pick
comando all'inizio di ogni riga significa "usa (cioè includi) questo commit" e quando salvo il file temporaneo con i comandi rebase ed esco dall'editor, git eseguirà i comandi e aggiornerà il repository e la directory di lavoro:
$ git rebase --interactive 186d1e0
Successfully rebased and updated refs/heads/master.
bernt@le3180:~/src/stackoverflow/reordering_of_commits
$ git log --oneline
ba48fc9 (HEAD -> master) Fourth commit
119639c Second commit
9716581 Third commit
186d1e0 First commit
Nota la cronologia del commit riscritta.
Collegamenti: