Łączenie 2 gałęzi razem w GIT


133

Dopiero zacząłem używać GIT i uważam, że jest cudowny, jednak jestem trochę zdezorientowany, co mergerobi to polecenie.

Powiedzmy, że mamy działający projekt w gałęzi „A”.

Wracam do domu i wprowadzam zmiany w tej gałęzi i zapisuję ją jako „B”. Inny programista wprowadza zmiany w „A” i zapisuje je jako „C”.

Czy istnieje sposób na połączenie dwóch gałęzi „B” i „C”, a następnie zatwierdzenie zmian jako nowej gałęzi, powiedzmy „D”?

A może brakuje mi punktu „scalania”?


nie ma potrzeby „zapisywania zmian” w innej gałęzi.
zrób

Nie nadążam. A byłby na moim komputerze lokalnym, dev1 miałby kopię A na swoim komputerze, a dev2 ma kopię A na swoim komputerze. Obaj programiści wprowadzają zmiany, jak połączyć je razem?
dotty

zobacz < kernel.org/pub/software/scm/git/docs/git-pull.html >. twórcy prawdopodobnie będą musieli najpierw wypchnąć / przesłać swoje repozytorium gdzieś
knittl

Odpowiedzi:


197

merge służy do połączenia dwóch (lub więcej) gałęzi.

mały przykład:

# on branch A:
# create new branch B
$ git checkout -b B
# hack hack
$ git commit -am "commit on branch B"

# create new branch C from A
$ git checkout -b C A
# hack hack
$ git commit -am "commit on branch C"

# go back to branch A
$ git checkout A
# hack hack
$ git commit -am "commit on branch A"

więc teraz są trzy oddzielne gałęzie (a mianowicie AB i C) z różnymi głowicami

aby uzyskać zmiany z B i C z powrotem do A, wyewidencjonuj A (już zrobione w tym przykładzie), a następnie użyj polecenia merge:

# create an octopus merge
$ git merge B C

twoja historia będzie wtedy wyglądać mniej więcej tak:

…-o-o-x-------A
      |\     /|
      | B---/ |
       \     /
        C---/

jeśli chcesz połączyć się przez granice repozytorium / komputera, spójrz na git pullpolecenie, np. z komputera z gałęzią A (ten przykład utworzy dwa nowe zatwierdzenia):

# pull branch B
$ git pull ssh://host/… B
# pull branch C
$ git pull ssh://host/… C

oznacza to, że obie gałęzie zmieniły ten sam fragment kodu. naprawić konflikty, git add conflicting_filesa następniegit commit
knittl

Powiedzmy, że plik w A zawierał słowo „cześć”, A zmienił je na „HELLO”, a B zmienił je na „Hello world”. Jaki byłby wynik scalenia tych plików?
dotty

Ups, mam na myśli to, że B to zmienił, a C to zmienił.
dotty

uważaj na słowo „popraw”, które oznacza coś innego w git (zmiana istniejących zatwierdzeń). zmiana pliku „hello” na „HELLO” z jednej strony i „Hello World” z drugiej strony spowoduje konflikt scalania
knittl

19
@dotty: Chociaż git często wydaje się magią, tak naprawdę nie może czytać w twoich myślach - jeśli dwie gałęzie wprowadzają dwie różne zmiany w tej samej treści, tylko człowiek może dowiedzieć się, jak je pogodzić. Na tym polega konflikt scalania.
Cascabel

48

Jeśli chcesz scalić zmiany w SubBranch do MainBranch

  1. powinieneś być w MainBranch git checkout MainBranch
  2. następnie uruchom polecenie scalania git merge SubBranch

2
@luckytaxi: Zgoda, czasami mniej znaczy więcej
Marcelo Scofano

Czy mogę to cofnąć?
Yohanelly

0

Przypadek: Jeśli chcesz zignorować domyślnie utworzone zatwierdzenie scalające , wykonaj następujące kroki.

Powiedzmy, że nowa gałąź funkcji jest pobierana z mastera, która ma już 2 zatwierdzenia,

  • „Dodano A”, „Dodano B”

Checkout a new feature_branch

  • „Dodano C”, „Dodano D”

Gałąź funkcji dodaje następnie dwa zatwierdzenia ->

  • „Dodano E”, „Dodano F”

wprowadź opis obrazu tutaj

Teraz, jeśli chcesz scalić zmiany feature_branch na master, git merge feature_branchusiądź na master.

Spowoduje to dodanie wszystkich zatwierdzeń do gałęzi głównej (4 w gałęzi głównej + 2 w gałęzi feature_branch = łącznie 6) + dodatkowe zatwierdzenie scalające coś w rodzaju 'Merge branch 'feature_branch'', gdy master jest rozbieżny .

Jeśli naprawdę potrzebujesz zignorować te zatwierdzenia (te wykonane w FB) i dodać wszystkie zmiany wprowadzone w feature_branch jako pojedyncze zatwierdzenie, jak np . 'Integrated feature branch changes into master'Run git merge feature_merge --no-commit.

Z --no-commit wykonuje scalanie i zatrzymuje się tuż przed utworzeniem merge commit. Wszystkie dodane zmiany w gałęzi funkcji będą teraz w master i otrzymamy szansę stworzenia nowego zatwierdzenia jako własnego.

Przeczytaj tutaj, aby uzyskać więcej informacji: https://git-scm.com/docs/git-merge

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.