2014-09-02 29 views
6

Jako deweloper o PHP-src Niedawno znalazłem się w następującej sytuacji:rebase na upstream zmian z niebanalną seryjnej zobowiązuje obecny lokalnie

A B C 
o---o---o   version1 
     \ 
o---o-----o---o master 
x y  D E 

o---o---o   upstream/master 
x y z 

Więc kiedy zrobić git push --dry-run upstream master version1 pojawia się typowa:

! [rejected]  master -> master (fetch first) 

Moja naturalna reakcja jest rebase poszkodowanemu gałąź i zachować seryjnej zobowiązuje:

git fetch upstream 
git rebase -p upstream/master 

Należy zauważyć, że oryginalne zatwierdzenie scalania nie było trywialne, ponieważ jest tak wiele zmian między gałęzią wersji a wzorcem; podjęcie takiego rozwiązania wymaga rozwiązania.

Wykonanie powyższej operacji ponownego użycia powoduje konflikt seryjny i muszę go ponownie rozwiązać; to prawie dokładnie ta sama praca, którą już wykonałem.

Czy jest lepszy sposób to zrobić? A może zapomniałem o oczywistej opcji rebase?

+0

Czy * masz *, aby dokonać ponownej oceny? Zwykle też bazuję na rebase, ale ja również znajdowałem się w twojej sytuacji, w której to było po prostu niewykonalne i wróciłem ze standardowym scaleniem. – musiKk

+0

Pewnie, mogę po prostu wcisnąć 'D, E, M (z)' zamiast 'D ', E'' ale wolę trzymać historię tak czystą jak tylko potrafię :) –

+1

Słyszę cię. To zależy od twojej sprawy. Pracowałem nad połączeniami, które trwały wiele godzin. Moja miłość do czystej historii idzie tak daleko. :) – musiKk

Odpowiedz

3

Idealnie byłoby „ponowne wykorzystanie nagranego rozdzielczość” z rerere:

w przepływie pracy zatrudniające stosunkowo długo żyli gałęzi tematycznych, deweloper czasami musi rozwiązać te same konflikty w kółko aż gałęzie temat są wykonane albo połączone w gałąź "wydania", albo wysłane i zaakceptowane wcześniej).

To polecenie pomaga programistom w tym procesie poprzez rejestrowanie skonfliktowanych wyników automerge i odpowiednich wyników ręcznego rozwiązywania przy początkowym ręcznym scalaniu i zastosowanie wcześniej zarejestrowanych rozdzielczości dłoni do odpowiadających im wyników automerge.

Niestety, funkcja ta musi być włączony przed pierwszym zrobić scalania:

UWAGA: trzeba ustawić zmienną konfiguracji rerere.enabled w celu umożliwienia tego polecenia.

O ile mi wiadomo, nie ma skrótów do zrobienia czegoś takiego po fakcie. Polecam umożliwiając rerere globalnie a następnie ponawianie scalanie:

git config --global rerere.enabled true 

W przyszłości, to ustawienie może zaoszczędzić mnóstwo czasu!

+0

Myślę, że * to może być dokładnie to, czego potrzebuję, miłe znalezisko! :) –

+2

Skrót do włączania wstecznego tutaj powinien być po prostu 'git config rerere.enabled true; git checkout y; git merge -s nasz --no-commit C; git read-tree -um HEAD D; git commit; git checkout master'. – jthill

+0

@jthill to nie wygląda prosto dla mnie, ale jeśli zadziała, byłoby miłym dodatkiem do tej odpowiedzi lub osobnej :) –