Jak używać scalania Git
Opublikowany: 2023-01-03Git używa gałęzi do izolowania strumieni programistycznych, aby zapobiec zanieczyszczeniu gałęzi wydania stabilnego. Włączenie pracy w oddziale do głównego strumienia oznacza łączenie oddziałów. Oto jak to zrobić.
Co to jest scalanie w Git?
Przygotowanie do połączenia gałęzi w Git
Wykonywanie scalania
Wykonywanie szybkiego scalania w przód w Git
Jak rozwiązywać konflikty scalania w Git
Wszystko się w końcu łączy
Co to jest scalanie w Git?
Git został zaprojektowany tak, aby tworzenie rozgałęzień było proste i szybkie. W przeciwieństwie do innych systemów kontroli wersji rozgałęzianie na Git to banalna sprawa. Szczególnie w projektach z wieloma programistami rozgałęzianie jest jednym z podstawowych narzędzi organizacyjnych Gita.
Branches tworzy piaskownicę nowych prac programistycznych, dzięki czemu kod można modyfikować lub dodawać bez wpływu na kod w innych gałęziach, zwłaszcza w gałęzi głównej lub głównej. Zwykle zawiera stabilną wersję bazy kodu.
Wyizolowanie tych zmian ze stabilnej wersji kodu ma sens. Ale prędzej czy później nowy kod zostanie przetestowany, przejrzany i zapieczętowany w celu wprowadzenia go do gałęzi głównej. W tym momencie musisz połączyć swoją gałąź z gałęzią główną.
W rzeczywistości gałęzie mogą mieć podgałęzie, więc możesz scalać swoją gałąź z inną gałęzią zamiast gałęzi głównej. Pamiętaj tylko, że scalanie zawsze bierze jedną gałąź i łączy ją z gałęzią docelową , jakakolwiek może być ta gałąź. Jeśli chcesz połączyć swoją gałąź główną z inną gałęzią, możesz to zrobić.
Podobnie jak większość działań w Git, scalanie wykonujesz w lokalnym repozytorium i przesyłasz je do zdalnego repozytorium.
Przygotowanie do połączenia gałęzi w Git
Mamy mały projekt programistyczny z lokalnym repozytorium Git i zdalnym repozytorium Git. Stworzyliśmy gałąź o nazwie „bugfix14” z gałęzi „master” i pracowaliśmy nad rozwiązaniem błędu.
Ta praca została zakończona i przetestowaliśmy nasz kod. Wszystko działa zgodnie z oczekiwaniami. Chcemy przenieść te zmiany do gałęzi głównej, aby nasza poprawka była częścią następnej wersji oprogramowania.
Zanim przeprowadzimy fuzję, trzeba trochę się przygotować. Musimy się upewnić, że zarówno gałąź docelowa — w tym przypadku „główna” — jak i gałąź, którą zamierzamy scalić, są aktualne.
W tym celu użyjemy polecenia git status
.
status gita
- Na gałęzi bugfix14 : To jest nasza aktualna gałąź.
- Twoja gałąź jest aktualna z „origin/bugfix” : gałąź w naszym lokalnym repozytorium ma taką samą historię zatwierdzeń jak gałąź w zdalnym repozytorium. To znaczy, że są identyczne.
- nic do zatwierdzenia W obszarze przejściowym nie ma żadnych zmian, które nie zostały zatwierdzone.
- czyszczenie drzewa roboczego : w katalogu roboczym nie ma nieetapowych zmian.
Wszystko to wskazuje, że gałąź jest aktualna i możemy kontynuować. Jeśli którykolwiek z nich wskazywałby na istnienie zmian, musielibyśmy je wystawić, zatwierdzić i przesłać do pilota. Jeśli ktoś inny pracował nad tymi plikami, być może będziemy musieli pobrać jego zmiany ze zdalnego repozytorium.
Sprawdzenie gałęzi, do której zamierzamy się połączyć, upraszcza proces łączenia. Pozwala nam to również zweryfikować jego aktualność. Przyjrzyjmy się gałęzi master.
git mistrz kasy
status gita
Dostajemy te same potwierdzenia, że gałąź „master” jest aktualna.
POWIĄZANE: Jak wybrać model przepływu pracy i rozgałęzień Git odpowiedni dla Twojego zespołu
Wykonywanie scalania
Zanim się połączymy, nasze zobowiązania wyglądają tak.
Gałąź „bugfix14” została odgałęziona od gałęzi „master”. Nastąpiło zatwierdzenie gałęzi „master” po utworzeniu gałęzi „bugfix14”. Było kilka zatwierdzeń w gałęzi „bugfix14”.
Upewniliśmy się, że nasze dwie gałęzie są aktualne i sprawdziliśmy gałąź „główną”. Możemy wydać polecenie scalenia gałęzi „bugfix14” z gałęzią „master”.
poprawka łączenia git 14
Następuje fuzja. Gałąź „bugfix14” nadal istnieje, ale teraz zmiany wprowadzone w tej gałęzi zostały scalone z gałęzią „master”.
W tym przypadku polecenie merge wykonuje scalanie trójstronne . Istnieją tylko dwie gałęzie, ale zaangażowane są trzy zatwierdzenia. Są głową każdej gałęzi i trzecim zatwierdzeniem, które reprezentuje samą akcję scalania.
Aby zaktualizować nasze zdalne repozytorium, możemy użyć polecenia git push .
git push
Niektóre osoby wolą usuwać gałęzie boczne po ich połączeniu. Inni dbają o ich zachowanie jako zapis prawdziwej historii rozwoju projektu.
Jeśli chcesz usunąć gałąź, możesz to zrobić za pomocą polecenia git branch
z opcją -d
(delete).
git branch -d bugfix14
Aby usunąć gałąź w zdalnym repozytorium, użyj tego polecenia:
git push origin --delete bugfix14
Będziesz mieć liniową historię zatwierdzeń, ale nie będzie to prawdziwa historia.
POWIĄZANE: Jak usunąć gałęzie Git w lokalnych i zdalnych repozytoriach
Wykonywanie szybkiego scalania w przód w Git
Jeśli nie zrobiłeś żadnych zatwierdzeń w gałęzi „master”, twoja historia będzie wyglądać tak. Będzie to również wyglądać tak, jeśli zmieniłeś bazę gałęzi programistycznej, tak aby była dołączona na końcu gałęzi „głównej”.
Ponieważ w gałęzi „master” nie ma zatwierdzeń, aby scalić gałąź „bugfix15”, wszystko, co Git musi zrobić, to wskazać główny wskaźnik „master” na ostatnie zatwierdzenie gałęzi „bugfix15”.
Możemy użyć zwykłego polecenia git merge
:
poprawka git merge 15
To daje nam ten wynik.
Który jest taki sam jak ten:
Co jest dokładnie takie samo jak to:
Git wykona szybkie scalanie do przodu , kiedy tylko będzie to możliwe . Jeśli zatwierdzenie gałęzi „głównej” oznacza, że szybkie scalanie nie jest możliwe, Git użyje trójstronnego scalania .
Nie możesz wymusić szybkiego łączenia do przodu — w końcu może to być niemożliwe — ale możesz zadeklarować, że będzie to szybkie łączenie do przodu lub nic. Istnieje opcja, która instruuje Gita, aby używał scalania z szybkim przewijaniem do przodu, jeśli to możliwe, ale nie wykonywał scalania trójstronnego, jeśli nie może. Opcją jest --ff-only
(tylko szybkie scalanie do przodu).
Spowoduje to scalenie gałęzi „bugfix15” z gałęzią „master”, ale tylko wtedy, gdy możliwe jest szybkie scalenie.
git merge --ff-only bugfix15
Git złoży skargę i zakończy działanie, jeśli nie będzie to możliwe.
git merge --ff-only bugfix16
W tym przypadku dokonano zatwierdzeń w gałęzi „głównej”, więc szybkie scalenie nie jest możliwe.
Jak rozwiązywać konflikty scalania w Git
Jeśli te same części tego samego pliku zostały zmienione w obu gałęziach, gałęzie nie mogą zostać scalone. Do rozwiązania sprzecznych zmian wymagana jest interakcja człowieka.
Tutaj dokonaliśmy zmian w pliku o nazwie „rot.c” w gałęzi o nazwie „bugfix17”, którą chcemy scalić z gałęzią „master”. Ale „rot.c” również został zmieniony w gałęzi „master”.
poprawka git merge 17
Kiedy próbujemy go scalić, otrzymujemy ostrzeżenie, że występują konflikty. Git wyświetla listę plików będących w konflikcie i informuje nas, że scalanie nie powiodło się. Moglibyśmy całkowicie wycofać się, używając opcji --abort
:
git merge --przerwanie
Ale rozwiązywanie fuzji nie jest tak przerażające, jak się wydaje. Git wykonał trochę pracy, aby nam pomóc. Jeśli edytujemy jeden z plików będących w konflikcie — w naszym przypadku mamy tylko jeden — sekcje kodu będące w konflikcie zostaną dla nas podświetlone.
Każdy konflikt jest ograniczony przez siedem znaków mniej niż „ <<<<<<<
” i siedem znaków większych niż „ >>>>>>>
”, z siedmioma znakami równości „ =======
” między nimi .
- Kod nad znakami równości pochodzi z gałęzi, z którą się łączysz .
- Kod pod znakiem równości to kod z gałęzi, którą próbujesz scalić .
Możesz łatwo wyszukać jeden z zestawów siedmiu znaków i przechodzić od konfliktu do konfliktu w swoim pliku. W przypadku każdego konfliktu musisz wybrać, który zestaw zmian chcesz zachować. Musisz wyedytować kod, który odrzucasz, oraz siedmioznakowe linie dodane przez Gita.
Zachowamy kod z gałęzi „bugfix17”. Po edycji nasz plik wygląda tak.
Teraz możemy kontynuować fuzję. Ale zauważ, że używamy do tego polecenia commit
, a nie polecenia merge
.
Zatwierdzamy zmianę, umieszczając plik i zatwierdzając go jak zwykle. Sprawdzimy status, zanim dokonamy ostatecznego zatwierdzenia.
git add rot.c
status gita
git commit -m „Połączona poprawka błędu 17”
Fuzja jest zakończona. Możemy teraz przesłać to do naszego zdalnego repozytorium.
POWIĄZANE: Jak naprawić, edytować lub cofnąć zatwierdzenia Git (zmiana historii Git)
Wszystko się w końcu łączy
Wszystkie gałęzie trzeba docelowo połączyć, aby zmiany w nich nie zostały osierocone i zapomniane.
Łączenie oddziałów jest łatwe, ale radzenie sobie z konfliktami może być skomplikowane w zapracowanych, większych zespołach. Rozwiązywanie konfliktów może wymagać wkładu każdego programisty w celu wyjaśnienia, co robi jego kod i dlaczego wprowadzili zmiany. Musisz to zrozumieć, zanim podejmiesz świadomą decyzję o tym, które zmiany zachować.
Niestety, Git nie może w tym pomóc.
POWIĄZANE: Czy powinieneś używać klienta GUI Git?