Scal gałąź rozwoju z master


763

Mam dwie gałęzie mianowicie mastera developmentw GitHub repozytorium. Cały rozwój robię w branży programistycznej, jak pokazano.

git branch development
git add *
git commit -m "My initial commit message"
git push -u origin development

Teraz chcę scalić wszystkie zmiany w developmentgałęzi z master. Moje obecne podejście to:

git checkout master 
git merge development
git push -u origin master 

Daj mi znać, jeśli procedura, którą wykonuję, jest prawidłowa.


7
git pull -uustawia śledzenie w górę dla gałęzi (lub wszystkich gałęzi, jeśli przekazujesz więcej niż jedną). Po ustawieniu śledzenie będzie się powtarzać. Nie ma powodu, aby używać go w sposób ciągły.
David Culp,

Odpowiedzi:


1164

Zasadniczo lubię łączyć mastersię z developmentpierwszym, aby w razie konfliktów rozwiązać problem w developmentsamej gałęzi i masterzachować czystość.

(on branch development)$ git merge master
(resolve any merge conflicts if there are any)
git checkout master
git merge development (there won't be any conflicts now)

Nie ma dużej różnicy między tymi dwoma podejściami, ale czasami zauważyłem, że nie chcę jeszcze scalać gałęzi master, po ich połączeniu, lub że jest jeszcze wiele do zrobienia, zanim można je połączyć , więc zwykle pozostawiam masternietknięte do końca.

EDYCJA: Z komentarzy

Jeśli chcesz śledzić, kto i kiedy dokonał scalenia, możesz użyć --no-ffflagi podczas scalania, aby to zrobić. Jest to na ogół przydatne tylko podczas łączenia developmentw master(ostatni krok), ponieważ może być konieczne wielokrotne scalenie masterw development(pierwszy krok) w przepływie pracy, a utworzenie dla nich węzła zatwierdzania może nie być bardzo przydatne.

git merge --no-ff development

71
Podejście to ma niewielką wadę: faktyczne scalenie do master jest najprawdopodobniej scaleniem do przodu i dlatego nie tworzy żadnego węzła zatwierdzania. Nie stanowi to problemu z faktycznym kodem w oddziale, ale utrudnia późniejsze ustalenie, kto i kiedy dokonał scalenia w celu opanowania. --no-ffAby to naprawić, potrzebny jest wyraźny komunikat dotyczący scalenia z master.
michas

11
Tak, właśnie po to --no-ffjest. :)
michas

19
To git merge --no-ff developmenttylko w celu poprawienia użycia @ elect.
jewbix.cube

2
@sailesh, czy możesz zaktualizować swoją odpowiedź, dodając flagę git merge, jeśli zgadzasz się z komentarzami?
Użytkownik sieci Web,

2
@Mars, scalanie zastąpi plik, jeśli stara zmiana była bezpośrednim przodkiem zatwierdzenia. Na przykład, niech A->B->Cbędzie panem i A->X->Yjest twoją gałęzią programistów. Jeśli zmienisz część pliku, w Xktórej mogły wystąpić konflikty ze zmianą A, nie będzie to konfliktem, ponieważ Ajest on przodkiem X. Jeśli chodzi o utracone zmiany, sprawdź stackoverflow.com/questions/7147680/..., aby odzyskać wszelkie zmiany.
Sailesh

103

Osobiście moje podejście jest podobne do twojego, z kilkoma dodatkowymi gałęziami i trochę zgniatania zatwierdzeń, kiedy wracają do mistrza.

Jeden z moich współpracowników nie lubi tak bardzo zmieniać gałęzi i pozostaje w gałęzi programistycznej z czymś podobnym do poniższego wykonywanym z gałęzi programistycznej.

git fetch origin master

git merge master

git push origin development:master

Pierwszy wiersz upewnia się, że ma jakieś zatwierdzenia poprzedzające, które zostały wprowadzone do masteringu od czasu ostatniej aktualizacji jego lokalnego repozytorium.

Drugi ciągnie te zmiany (jeśli występują) z mistrza do rozwoju

Trzeci przesuwa gałąź programistyczną (teraz w pełni scaloną z master) do origin / master.

Być może jego podstawowy obieg pracy jest trochę niepoprawny, ale to jest jego główna zaleta.


Dzięki! Ma to dla mnie bardziej intuicyjny sens.
Jamie Nicholl-Shelley

2
Tak - przez ponad 6 lat, odkąd to napisałem, ja też to przyjęłem - choć zamiast tego, rebaseaby zaktualizować devgałąź merge.
David Culp

32

Wyjaśnienie z dołu dla tych, którzy przybyli tutaj bez znajomości gałęzi.

Podstawowa logika rozwoju gałęzi głównej jest następująca: Pracujesz tylko na innych gałęziach i używasz master tylko do łączenia kolejnych gałęzi.

Zaczynasz tworzyć nowy oddział w ten sposób:

1) Klonuj repozytorium w swoim lokalnym katalogu (lub utwórz nowe repozytorium):

$ cd /var/www
$ git clone git@bitbucket.org:user_name/repository_name.git

2) Utwórz nowy oddział. Będzie zawierał najnowsze pliki z twojego repozytorium oddziału głównego

$ git branch new_branch

3) Zmień obecną gałąź git na new_branch

$ git checkout new_branch

4) Wykonuj kodowanie, zatwierdza, jak zwykle…

$ git add .
$ git commit -m “Initial commit”
$ git push (pushes commits only to “new_branch”)

5) Po zakończeniu pracy w tym oddziale połącz z odgałęzieniem „master”:

$ git merge master
$ git checkout master (goes to master branch)
$ git merge development (merges files in localhost. Master shouldn’t have any  commits ahead, otherwise there will be a need for pull and merging code by hands!)
$ git push (pushes all “new_branch” commits to both branches - “master” and “new_branch”)

Aktualizacja: Gorąco polecam użyć GitKraken, aby zobaczyć wizualne drzewo zmian i lepiej zobaczyć całą logikę i zatwierdzenia.


Podobało mi się twoje podejście do pracy nad mistrzem. ale dzisiaj, kiedy grałem z gitflow, stworzyłem releasegałąź naszej develop. Następnie dodano plik informacji o wersji i zatwierdzono. Następnie zakończyłem wydanie, które łączy się z powrotem do obu master/develop. ale moja gałąź główna zawierała tylko nową informację o wydaniu. żadne inne pliki podczas poprzednich zatwierdzeń programistycznych nie zostały w nim zaktualizowane.
Amit Shah

jeśli pracujesz na innej gałęzi niż master, upewnij się, że zatwierdziłeś i przekazałeś zmiany do tej gałęzi. Następnie możesz sprawdzić, jak wyglądają pliki na interfejsie graficznym github.com lub bitbucket.com i spróbować kliknąć Scal tam na stronie internetowej. Powinien aktualizować wszystko, od gałęzi po master. Jeśli master ma nowsze pliki, powinien to być konflikt i pojawi się komunikat o błędzie. Nie jestem pewien, czy odpowiedziałem wystarczająco dobrze, proszę o wiadomość, jeśli nie :)
Gediminas,

Używam sourcetree jako GUI i repozytorium github. Próbowałem 2 razy z testem wydania. master nigdy nie aktualizował o najnowszą gałąź rozwoju.
Amit Shah

spróbuj użyć na stronie internetowej github.com plików swojego oddziału, nad którym pracujesz. Czy oni są popychani? Jeśli tak, spróbuj kliknąć ten sam oddział - Scal, a zobaczysz, co się stanie. Moje osobiste doświadczenia z drzewem źródłowym są dość złe - nie byłem w stanie w pełni zrozumieć, co dzieje się również w moich oddziałach
Gediminas

Dzięki @Gediminas za szczegółowe wyjaśnienie. Byłem zdezorientowany słowami kluczowymi git przed przeczytaniem twojej odpowiedzi .. :)
Dinesh Suthar 18.04.19

21

Byłoby wspaniale, gdybyś mógł użyć przepływu pracy Git Flow . Może łatwo łączyć rozwój gałęzi z mistrzem.

To, co chcesz zrobić, to po prostu postępować zgodnie z instrukcją git-flow wspomnianą tutaj:

KROKI:

  • skonfiguruj projekt git-flow
  • tworzyć oddziały i łączyć wszystko, aby się rozwijać
  • uruchom polecenie git flow release start <version_number>
  • następnie przekaż sensowną wiadomość do wydania
  • uruchom polecenie git flow release finish <version_number>
  • scali wszystko w master i zmieni gałąź na master .
  • uruchom polecenie, git pushaby opublikować zmiany w zdalnym systemie głównym .

Aby uzyskać więcej informacji, odwiedź stronę - http://danielkummer.github.io/git-flow-cheatsheet/


1
Rozwiązanie, jeśli ktoś używa Git Flow!
Csaba Toth,

21
1. //pull the latest changes of current development branch if any        
git pull (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any
git pull

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master


6

Jeśli korzystasz z komputera Mac lub Ubuntu, przejdź do folderu roboczego oddziału. W terminalu

załóżmy, że harisdev jest nazwą gałęzi.

git checkout master

jeśli istnieją nieśledzone lub niezaangażowane pliki, pojawi się błąd i musisz zatwierdzić lub usunąć wszystkie nieśledzone lub niezaangażowane pliki.

git merge harisdev 

git push origin master

Ostatnie polecenie, aby usunąć gałąź.

$ git branch -d harisdev

Co tutaj jest specyficzne dla komputerów Mac lub Ubuntu?
talonx

Przepraszam. Żadna z pozostałych odpowiedzi nie wspomniała, że ​​polecenia powinny być wydawane w terminalu i polecenie usuwania gałęzi. Tak naprawdę chciałem tylko dodać polecenie usuwania gałęzi, aby deweloper nie bałaganił tego samego oddziału w przyszłości. Używam Maca, więc wspomniałem o tym. Twoje pytanie jest prawidłowe i żadne z tych poleceń nie jest specyficzne dla komputerów Mac ani Ubuntu.
Haris Np

Dzięki za wytłumaczenie.
talonx

5

Krok 1

Utwórz i przełącz się na nową gałąź „dev”, w której lokalne pliki git są zsynchronizowane ze zdalną, ale gałąź „dev” jeszcze nie istnieje.

git branch dev # create
git checkout dev # switch
# No need to git add or git commit, the current
# branch's files will be cloned to the new branch by-default.
git push --set-upstream origin dev # push the "dev" branch to the remote.

Krok 2

Wprowadź zmiany w gałęzi „dev” (bieżącej, jeśli wykonasz krok 1), zatwierdź i pchnij je do zdalnej gałęzi „dev”.

git add .
git commit -S -m "my first commit to the dev branch" # remove the -S if you're not "secure", secure = when you already setup crypto private and public keys (i.e "verified" green sign in github)
git push -u origin dev # push the changes to the remote, -u origin dev is optional but good to use.

Krok 3

Scal swoją gałąź „dev” w „master”.

git checkout dev # switch to "dev" branch if you're not already.
git merge master # optionally, this command is being used to resolve any conflicts if you pushed any changes to your "master" but "dev" doesn't have that commit.
git checkout master # switch to "master", which is the branch you want to be merged.
git merge --no-ff dev # merge the "dev" branch into the "master" one.

4

Tak zwykle to robię. Po pierwsze, upewnij się, że jesteś gotowy, aby scalić swoje zmiany w master.

  1. Sprawdź, czy programowanie jest aktualne, wprowadzając najnowsze zmiany ze zdalnego serwera za pomocą git fetch
  2. Po zakończeniu pobierania git checkout master.
  3. Upewnij się, że gałąź główna ma najnowsze aktualizacje, wykonując git pull
  4. Po zakończeniu przygotowań możesz rozpocząć scalanie git merge development
  5. Naciśnij zmiany za pomocą git push -u origin masteri gotowe.

Więcej informacji na temat łączenia git można znaleźć w tym artykule.


3

1) W rozwoju oddziału sprawdź status git za pomocą następującego polecenia:

git status

Nie powinno być nieprzydzielonego kodu. Jeśli tak, wciśnij kod w gałęzi programistycznej:

git add *

git commit -m "My initial commit message"

git push origin Development

2) W gałęzi Programowanie uruchom następujące dwa polecenia:

git branch -f master HEAD

git push -f origin master

Spowoduje to wypchnięcie kodu gałęzi rozwoju do gałęzi master.


Czy to popycha wszystkie zobowiązania programistyczne do masterowania, czy po prostu dodaje nowy pojedynczy zatwierdzenie do master?
rzuca

1
jak to właściwie działa? szczególnie „Git Branch Master”, gdy jesteś w fazie rozwoju, wygląda jak szaleństwo. jak możesz utworzyć nową gałąź o nazwie master, jeśli istnieje już gałąź o nazwie master? Dokumenty mówią, że -f robi to: Zresetuj <nazwa_gałęzi> do <startpoint>. Co to znaczy?
John Little

Czy ta siła nie popycha lokalnego mistrza do zdalnego mistrza? To wydaje się złym pomysłem, jeśli pracujesz w zespole.
Nick

-fnie jest zalecane.
DawnSong

2

Na podstawie @Sailesh i @DavidCulp:

(on branch development)
$ git fetch origin master
$ git merge FETCH_HEAD
(resolve any merge conflicts if there are any)
$ git checkout master
$ git merge --no-ff development (there won't be any conflicts now)

Pierwsze polecenie upewni się, że wszystkie wcześniejsze zatwierdzenia zostały wykonane dla zdalnego mistrza, z odpowiedzią Sailesh, która by się nie zdarzyła.

Drugi wykona scalenie i stworzy konflikty, które możesz następnie rozwiązać.

Po wykonaniu tej czynności możesz w końcu dokonać transakcji wzorca, aby przełączyć się na wzorzec.

Następnie scalasz gałąź rozwoju z lokalnym wzorcem. Flaga no-ff utworzy węzeł zatwierdzania w systemie głównym, aby śledzenie całego scalenia było możliwe.

Następnie możesz zatwierdzić i pchnąć swoje scalenie.

Ta procedura upewni się, że istnieje połączenie zatwierdzania przez programistę do opanowania, które ludzie mogą zobaczyć, a następnie, jeśli przejdą do gałęzi programistycznej, zobaczą poszczególne zatwierdzenia dokonane w tej gałęzi podczas jej rozwoju.

Opcjonalnie możesz zmienić zatwierdzenie scalania przed wypchnięciem go, jeśli chcesz dodać podsumowanie tego, co zostało zrobione w gałęzi programistycznej.

EDYCJA: moja oryginalna odpowiedź sugerowała, że git merge masternic nie zrobiłem, lepiej zrobić git merge FETCH_HEADpo pobraniu źródła / wzorca


2

Po „przejściu” do działu rozwoju ...

 git add .
 git commit -m "first commit"
 git push origin dev
 git merge master

 git checkout master 
 git merge dev
 git push origin master 

1

Jeśli używasz gerrit, poniższe polecenia działają doskonale.

git checkout master
git merge --no-ff development

Możesz zapisać przy pomocy domyślnej wiadomości zatwierdzenia. Upewnij się, że identyfikator zmiany został wygenerowany. Aby się upewnić, możesz użyć następującego polecenia.

git commit --amend

Następnie naciśnij następujące polecenie.

git push origin HEAD:refs/for/refs/heads/master

Może pojawić się komunikat o błędzie, taki jak poniżej.

! [remote rejected] HEAD -> refs/for/refs/heads/master (you are not allowed to upload merges)

Aby rozwiązać ten problem, administrator projektu gerrit musi utworzyć w gerrit inne odwołanie o nazwie „refs / for / refs / heads / master” lub „refs / for / refs / heads / *” (które obejmie wszystkie gałęzie w przyszłości). Następnie udzielić zezwolenia „Push Merge Commit” na to odniesienie i uprawnienia „Prześlij”, jeśli jest to wymagane do przesłania GCR.

Teraz spróbuj ponownie wykonać powyższe polecenie push i powinno działać.

Kredyty:

https://github.com/ReviewAssistant/reviewassistant/wiki/Merging-branches-in-Gerrit

https://stackoverflow.com/a/21199818/3877642


1

Myślę, że najłatwiejszym rozwiązaniem byłoby

git checkout master
git remote update
git merge origin/Develop -X theirs
git commit -m commit -m "New release"
git push --recurse-submodules=check --progress "origin" refs/heads/Master

To także zachowuje historię wszystkich używanych gałęzi


-4
1. //push the latest changes of current development branch if any        
git push (current development branch)

2. //switch to master branch
git checkout master 

3. //pull all the changes if any from (current development branch)
git pull origin (current development branch)

4. //Now merge development into master    
git merge development

5. //push the master branch
git push origin master

Error
To https://github.com/rajputankit22/todos-posts.git
 ! [rejected]        master -> master (fetch first)
error: failed to push some refs to 'https://github.com/rajputankit22/todos-posts.git'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

Then Use 
5. //push the master branch forcefully
git push -f origin master

1
Naciskanie na siłę, gdy widzisz ten błąd, prawie nigdy nie jest właściwą rzeczą, chyba że masz pewność, że wiesz, dlaczego brakuje twojej gałęzi lokalnej, zatwierdzeń z gałęzi zdalnej. Ogólnie o wiele lepiej jest wrócić do kroku 3 i pulljeszcze raz. Ponadto nie jest jasne, jaką wartość ta odpowiedź dodaje w porównaniu z istniejącymi odpowiedziami.
Kyle Strand
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.