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.

Pawan
źródło
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
Sailesh
źródło
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.

David Culp
źródło
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 [email protected]: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.

Giedymina
źródło
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/

Harsha
źródło
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
Rizwan Siddiquee
źródło
9

Tak, jest to poprawne, ale wygląda na bardzo podstawowy przepływ pracy, w którym buforujesz zmiany, zanim będą gotowe do integracji. Powinieneś przyjrzeć się bardziej zaawansowanym przepływom pracy obsługiwanym przez git. Może ci się spodobać podejście do gałęzi tematu , które pozwala pracować równolegle nad wieloma funkcjami, lub podejście stopniowe, które nieco rozszerza bieżący przepływ pracy.

Sergiu Dumitriu
źródło
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
Haris Np
źródło
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.
kataras
źródło
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.

Nesha Zoric
źródło
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.

Himanshu Mahajan
źródło
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

Cisco
źródło
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 
Tiago Medici
źródło
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

Sankaran Srinivasan
źródło
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

Vishal
źródło
-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
Ankit Kumar Rajpoot
źródło
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