2015-05-16 28 views
17

Se sono nella seguente situazione,Come utilizzare il rebase interattivo sul primo commit (radice) di un ramo?

$ git log --oneline 
* abcdef commit #b 
* 123456 commit #a 

so che posso sempre correre

$ git reset HEAD~ 
$ git commit --amend 

Tuttavia, ho provato a correre

$ git rebase -i HEAD~2 

ma ho avuto

fatal: Needed a single revision 
invalid upstream HEAD~2 

Quindi la mia domanda: c'è un modo per usare git rebase per schiacciare questi due commit o no?

risposta

23

Volete rebase alla radice del vostro impegnarsi master ramo. Più in particolare, di schiacciare i due commit, è necessario eseguire

git rebase -i --root 

e poi sostituire squash per pick sulla seconda riga nel buffer dell'editor che si apre:

pick 123456 a               
squash abcdef b 

vi rimando al git-rebase man page per maggiori dettagli su quella bandiera:

--root

Rebase tutti i commit raggiungibili da <branch>, invece di limitarli con un <upstream>. Ciò consente di ribasare i commit principali su un ramo. [...]

Esempio di rebase interattivo della radice

# Set things up 
$ mkdir testgit 
$ cd testgit 
$ git init 

# Make two commits 
$ touch README 
$ git add README 
$ git commit -m "add README" 
$ printf "foo\n" > README 
$ git commit -am "write 'foo' in README" 

# Inspect the log 
$ git log --oneline --decorate --graph 
* 815b6ca (HEAD -> master) write 'foo' in README 
* 630ede6 add README 

# Rebase (interactively) the root of the current branch: 
# - Substitute 'squash' for 'pick' on the second line; save and quit the editor. 
# - Then write the commit message of the resulting commit; save and quit the editor. 
$ git rebase -i --root 
[detached HEAD c9003cd] add README; write 'foo' in README 
Date: Sat May 16 17:38:43 2015 +0100 
1 file changed, 1 insertion(+) 
create mode 100644 README 
Successfully rebased and updated refs/heads/master. 

# Inspect the log again 
$ git log --oneline --decorate --graph 
* c9003cd (HEAD -> master) add README; write 'foo' in README 
8

Sembra che questo parametro può aiutare:

--root 

REBASE tutti i commit raggiungibile da <ramo>, invece di limitare un <monte>. Ciò consente di rebase del root commit (s) su un ramo.

Questo dovrebbe farvi schiacciare (Credo che si vuole realmente fixup) il secondo commit sul primo:

git rebase --root -i 

Prenditi cura nella comprensione di ciò che l'opzione --root fa, perché nel tuo caso risponde alle tue esigenze, ma può essere complicato, ad esempio quando viene usato nei rami, perché rimbalza sull'antenato più lontano nella storia che è raggiungibile (cioè la radice dell'albero); così rebase --root si rebase z su a-A-B-D-E-X-Y-Z:

master  A-B-C 
       \ 
upstream  D-E 
        \  
current branch  X-Y-Z 
+0

stavo scrivendo la mia risposta al tempo stesso :) – Jubobs

+1

sì; ho cliccato "postare la tua risposta" e la pagina di ricarica ha riportato entrambe le risposte :) ma sei arrivato secondo:;) –

Problemi correlati