2010-06-11 18 views
8

Po kilku tygodniach pracy z pół tuzinem różnych oddziałów i fuzji, zarówno na moim laptopie i pracy, jak i na moim biurku w domu, moja historia stała się nieco zawikłana. Na przykład po prostu wykonałem pobieranie, a następnie połączono wzorzec z początkiem/wzorcem. Teraz, kiedy mam zrobić git show-oddziałów, wyjście wygląda następująco:jak używać git rebase do czyszczenia skomplikowanej historii

 
! [login] Changed domain name. 
! [master] Merge remote branch 'origin/master' 
    ! [migrate-1.9] Migrating to 1.9.1 on Heroku 
    ! [rebase-master] Merge remote branch 'origin/master' 
---- 
- - [master] Merge remote branch 'origin/master' 
+ + [master^2] A bit of re-arranging and cleanup. 
- - [master^2^] Merge branch 'rpx-login' 
+ + [master^2^^2] Commented out some debug logging. 
+ + [master^2^^2^] Monkey-patched Rack::Request#ip 
+ + [master^2^^2~2] dump each request to log 
.... 

Chciałbym to posprzątać z rebase git. W tym celu utworzyłem nowy oddział, rebase-master, aw tej gałęzi wypróbowałem git rebase < wspólnego przodka >. Muszę jednak rozwiązać wiele konfliktów, a wynik końcowy na podstawie rebase-master gałęzi już nie pasuje do wersji na master, która już została przetestowana i działa!

Wydawało mi się, że widzę gdzieś rozwiązanie tego problemu, ale nie mogę go już znaleźć. Czy ktoś wie, jak to zrobić? Czy te zawiłe nazwy ref nie znikną, gdy zacznę usuwać niepotrzebne gałęzie, z którymi się już połączyłem?

Jestem jedynym programistą w tym projekcie, więc nikt inny nie zostanie dotknięty.

+9

;-) Uwaga filozoficzna: historia ulega zawiłościom. To jest fakt życia. Przeżyj to. –

Odpowiedz

5

normalnego procesu, dla transakcji repo gdzie można wymusić pchania oddział (w zastępstwie pilota historię o nowym utworzonym lokalnie przez rebase), to zrobić:

git rebase --interactive 

Ale znowu, to tylko ważne, jeśli jesteś jedynym, który wycofuje się z twoich repozytoriów, i nawet wtedy będziesz musiał ponownie zainicjować niektóre z twoich lokalnych oddziałów do nowych, zdalnie śledzących, które zostały przepisane.

Z sesji rebase możesz trimming Git commits and squash history, aby uzyskać historię, której potrzebujesz.

+0

Zobacz także http://stackoverflow.com/questions/2719579/howto-add-a-changed-file-to-an-older-not-last-commit-in-git/2719631#2719631 – VonC

+0

umm ... to jest obfitość ważna bez wyciągania z pilota. możesz z łatwością przekartkować -i (lub praktycznie praktycznie wszystko) lokalny oddział, zdalny oddział, zatwierdzenie. – xenoterracide

10

Najlepszym sposobem na uporządkowanie zawiłej historii jest zachowanie linearności historii. Robisz to, unikając jakiegokolwiek scalania innego niż szybkie przewijanie do przodu.

Przepływ pracy przebiega w ten sposób.

$ git checkout -b foobranch 
<do stuff> 
$ git commit 
<do stuff> 
$ git commit 
... 

Kiedy nadszedł czas, aby zintegrować oddział w master, nie łącz go. Zamiast tego, zmień gałąź na master. To sprawi, że gałąź nie będzie już wyglądała jak gałąź, ale po prostu wzrost na szczycie drzewa. Rozwiązujesz wszelkie konflikty podczas scalania podczas reorganizacji.

$ git fetch origin 
$ git rebase origin/master 

Teraz połącz oddział w master. To będzie szybkie łączenie.

$ git checkout master 
$ git merge foobranch 

A teraz popchnij pracę w górę.

$ git push