GIT master master w oddziale

49

Pracuję nad nową funkcją w nowej gałęzi, a z boku wprowadziłem sporo zmian w mojej gałęzi master.

Czy jest możliwe scalenie gałęzi głównej z moją nową gałęzią, aby była aktualna, tak że nie będę mieć zbyt wielu konfliktów scalania po zakończeniu nowej funkcji?

mnml
źródło
Próbowałeś git-merge? Pomóż tutaj .
karatedog

Odpowiedzi:

56

Możesz albo git merge masteralbo git rebase master, w tym przypadku wolałbym git rebase .

Ponieważ git rebasesprawia, że ​​zmiany w gałęzi funkcji zostały wprowadzone na podstawie zmian w gałęzi głównej, co upraszcza wykres wersji.

Rebase

Biorąc przykład z instrukcji git rebase , git rebase masterw gałęzi feature:

      A---B---C feature                             A'--B'--C' feature
     /                   --rebase-->               /
D---E---F---G master                  D---E---F---G master

Jest jednak git rebaseodpowiedni tylko wtedy, gdy gałąź nie została rozdzielona, ​​lub będzie zamieszanie i dodatkowe prace w dół, ponieważ stare zatwierdzenia A, B, C są teraz zastępowane nowymi zatwierdzeniami A ', B', C ', plus F i G, których wcześniej nie było.

Rzeczywisty wynik po git rebase masteroddziale featurejest następujący:

      ( A---B---C )
       /
      /       A'--B'--C' feature
     /       /
D---E---F---G master

Zobowiązania A, B, C zwisają po zmianie, ale są osiągalne przez git reflog feature.

Łączyć

Jeśli ktoś wyciągnął twoją gałąź lub gdzieś ją pchnąłeś, powinieneś się w nią połączyć, aby uniknąć zamieszania i dodatkowej pracy po drugiej stronie. Zobacz Odzyskiwanie z bazy danych upstream .

Jest to wynik git merge masterw gałęzi feature:

      A---B---C feature                    A---B---C---M feature
     /                   --merge-->       /       ,---’
D---E---F---G master                 D---E---F---G master

Alternatywnie, jeśli jesteś git merge featurew oddziale master, wyglądałoby to tak:

      A---B---C feature                    A---B---C feature
     /                   --merge-->       /         \
D---E---F---G master                 D---E---F---G---M master
Christoffer Hammarström
źródło
Powinieneś wyjaśnić, dlaczego wolisz bazowanie i jaka jest różnica. Rebase tworzy historię liniową - to może nie pasować do tego pytania.
Andreas Rehm,
Ok, jeśli dobrze to rozumiem: muszę sprawdzić gałąź master, jeśli nowa funkcja nie jest jeszcze skończona, i dokonać zwrotu, jeśli jest skończona?
mnml
Nie, po wyewidencjonowaniu gałęzi funkcji, zrób to git rebase master, a ona „wprowadzi zmiany” zmian w gałęzi funkcji, tak aby były one „oparte” na zmianach w gałęzi głównej. Jeśli zmiany w gałęzi głównej są sprzeczne ze zmianami w gałęzi funkcji, git poprosi cię o ich rozwiązanie i kontynuowanie, pominięcie ich lub przerwanie. Jeśli nie masz pewności, możesz wypróbować gałąź testową, aby ją wypróbować git checkout -b test-feature feature(zakładając, że gałąź funkcji nosi nazwę „funkcja”).
Christoffer Hammarström,
2
Co masz na myśli mówiąc „nie widzę już mojego oddziału”? Tak git rebaseczy inaczej , należy go używać tylko wtedy, gdy gałąź nie została rozpowszechniona, co, jak zakładam, miało miejsce, ponieważ powiedziałeś, że jest to nowa gałąź, przepraszam za to. Zobacz Odzyskiwanie z wcześniejszej bazy w dokumentach, z którymi się łączyłem. Zamiast tego będziesz musiał użyć git merge. I możesz użyć, git reflogaby znaleźć poprzednią gałąź oddziału, jeśli chcesz ją odzyskać.
Christoffer Hammarström,
1
Nigdy nie widziałem jaśniejszego wyjaśnienia różnic między scalaniem a rebase. Dziękuję Ci.
Paulo Pedroso,