2015-05-16 31 views
17

Jeśli jestem w następującej sytuacji,Jak korzystać z odskoku interaktywnego przy pierwszym (głównym) zatwierdzeniu oddziału?

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

wiem, że zawsze mogę uruchomić

$ git reset HEAD~ 
$ git commit --amend 

Jednak próbowałem uruchomić

$ git rebase -i HEAD~2 

ale mam

fatal: Needed a single revision 
invalid upstream HEAD~2 

Stąd moje pytanie: czy istnieje sposób na użycie git rebase do zgniecenia tych dwóch zatwierdzeń, czy nie?

Odpowiedz

23

Chcesz rebase do korzenia zobowiązać swojego master gałęzi. Dokładniej, zgnieść dwie rewizje, trzeba uruchomić

git rebase -i --root 

a następnie zastąpić squash dla pick w drugim wierszu w buforze edytora, które pojawia się:

pick 123456 a               
squash abcdef b 

odsyłam do git-rebase man page więcej szczegółów na temat tej flagi:

--root

Rebase all commits osiągalny od <branch>, zamiast ograniczania ich z <upstream>. To pozwala na ponowne ustawienie głównego zatwierdzenia (root) w oddziale. [...]

Przykład interaktywnego rebase korzenia

# 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

Wydaje parametr ten może pomóc:

--root 

rebase wszystko zobowiązuje osiągalny z < oddziału > zamiast ograniczać je z <upstream>. Pozwala to na ponowne przypisanie certyfikatu root w oddziale.

ten powinien pozwolić ci squash (Chyba rzeczywiście chcesz fixup) swój drugi popełnić na pierwszym:

git rebase --root -i 

Zadbaj w zrozumieniu tego, co robi opcja --root, ponieważ w przypadku odpowiada twoim potrzebom, ale może być trudny, na przykład, gdy jest używany w gałęziach, ponieważ będzie odnawiać się na najdalszych przodków w historii, która jest osiągalna (tj. korzeń drzewa); tak rebase --root będzie rebase z na a thru A-B-D-E-X-Y-Z:

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

byłem wpisując moją odpowiedź w tym samym czasie :) – Jubobs

+1

Tak; kliknąłem "opublikuj odpowiedź", a ponowne wczytanie strony przyniosło obie odpowiedzi z powrotem :) ale przyszło ci drugie trudne;) –