Jak zmienić bazę zmian w bieżącej gałęzi na podstawie zmian, które są scalane?

144

W porządku. Jeśli jestem na gałęzi (powiedzmy working) i chcę scalić zmiany z innej gałęzi (powiedzmy master), uruchamiam polecenie git-merge masterbędąc w workinggałęzi, a zmiany są scalane bez ponownego bazowania historii. Jeśli uruchomię git-rebase master, zmiany w masterprogramie zostaną przeniesione do górnej części mojej workinggałęzi. Ale co, jeśli chcę scalić zmiany z, masterale ponownie bazować moje zmiany, workingaby być na wierzchu? W jaki sposób mogę to zrobić? Czy da się to zrobić?

Mógłbym uruchomić git-rebase workingna mojej mastergałęzi, aby umieścić zmiany na samej górze w mastergałęzi, ale chciałbym móc to zrobić w swojej workinggałęzi i nie mam pojęcia, jak to zrobić . Najbliższe, co przychodzi mi do głowy, to utworzenie nowej gałęzi z, mastera następnie workingzmiany bazy danych na jej podstawie, ale wtedy zamiast modyfikowania workinggałęzi miałbym nową gałąź.

Jonathan M Davis
źródło

Odpowiedzi:

255

Masz to, co rebasedziała wstecz. git rebase masterrobi to, o co prosisz - pobiera zmiany w bieżącej gałęzi (ponieważ jest rozbieżna z wzorcem) i odtwarza je na wierzchu master, a następnie ustawia głowę bieżącej gałęzi jako głowę nowej historii. To nie powtórka z zmian masterna szczycie aktualnej gałęzi.

Hobbs
źródło
3
@Jonathan, jest super. To trochę trudny temat. Nawiasem mówiąc, git rebase workingprzesunąłbym masterzmiany (po punkcie, który się workingrozgałęził), aby znalazły się na szczycie workinggałęzi - ale nie jest to zbyt rozsądne master:)
hobbs
66

Innym sposobem spojrzenia na to jest rozważenie git rebase master:

Zrestartuj bieżącą gałąź na wierzchu master

Tutaj ' master' to gałąź upstream i to wyjaśnia dlaczego, podczas rebase, oursi theirssą odwrócone .

VonC
źródło
To wyjaśnia również, dlaczego LOKALNE i ZDALNE są zamienione. Dzięki.
AVIDeveloper
@AVIDeveloper na LOCAL i REMOTE, możesz także przeczytać stackoverflow.com/a/3052118/6309
VonC
5
@@ VonC: Dzięki. Tak, po spędzeniu popołudnia, mamrocząc do siebie „ZDALNIE to moja gałąź .. LOKALNE nie jest moje”, wszystko się zapadło. Szczerze, wolałbym zobaczyć nazwy oddziałów (lub skrót SHA) zamiast ZDALNIE / LOKALNIE / nasze / ich / moje. Moje myśli są takie same, jeśli chodzi o git difftoolokropną lewą / prawą stronę. Trochę poza tematem, ale difftooltrzymam się git-meld i lubię takie nazwy jak „working-dir”, „stash @ {0}” i tak dalej.
AVIDeveloper
1
@VonC: Czy możesz wyjaśnić, jak to możliwe, gdy to zrobimy: git checkout branch_to_update git rebase masterotrzymuję w git logu zatwierdzenia mastera na szczycie lokalnego oddziału, zamiast tego?
JavaSa
1
@JavaSa To dziwne, chyba że rebase nie został poprawnie zakończony? Być może będziesz musiał zadać osobne pytanie zawierające więcej szczegółów.
VonC