Uzyskaj zmiany z mastera na oddział w Git


690

W moim repozytorium mam gałąź o nazwie, nad aqktórą pracuję.

Następnie wykonałem nową pracę i wprowadziłem błędy master.

Jaki jest najlepszy sposób, aby wprowadzić te zobowiązania do aqoddziału? Utworzyć nowy oddział masteri połączyć go aq?


3
W przyszłości możesz również uruchomić swoją gałąź poprawek błędów od wspólnego przodka master i innych gałęzi, które będą potrzebowały poprawek, abyś mógł połączyć je ze wszystkimi gałęziami, bez zbierania czegokolwiek innego.
Cascabel,

2
@Jefromi, ale to jest poza jego kontrolą, jeśli nie jest jedyną osobą pracującą nad projektem. inne osoby aktualizują mistrza. do diabła, ty sam możesz zaktualizować mistrza z trzeciej gałęzi, a sytuacja byłaby nieunikniona i wymagałaby ogólnego rozwiązania.
ahnbizcad

@ahnbizcad Jestem pewien, że ma kontrolę nad tym, gdzie założył własny oddział. Jeśli jego gałąź jest wspólnym przodkiem tych, z którymi będzie chciał się połączyć, a ludzie następnie dodadzą do tych gałęzi, nadal będzie wspólnym przodkiem.
Cascabel

chłopaki git pull origin my_branch_name
pytają

Odpowiedzi:


794

Sprawdź aqoddział i wypuść bazę master.

git checkout aq
git rebase master

czy rebase może pochodzić z innego oddziału? To znaczy. git rebase otherbranch? Wydaje mi się, że moje pytanie było nieco odbiegające od normy, rozgałęziłem się z gałęzi, a następnie wprowadziłem zmiany w oryginalnej gałęzi.
Slee

2
Jeśli mam rację, wyreżyseruj na żądanie ściągnięcia, pokaże wszystkie główne zatwierdzenia. jeśli użyjesz wzorca scalania / pochodzenia, wszystkie zatwierdzenia wzorca będą wyświetlane jako 1 zatwierdzenie, co ułatwia przegląd kodu.
Użytkownik Foo Bar

4
Czasami git mergebyłoby lepiej. Jeśli obie gałęzie ewoluowały w czasie, powinieneś rozważyć, która z nich jest dla Ciebie najlepsza.
erick2red

70
Późno na imprezę, ale jest to świetny przegląd tego, kiedy zmienić
bazę

7
Jeśli twoje poprzednie zatwierdzenia w gałęzi aq są publiczne, nie rób bazy. atlassian.com/git/tutorials/rewriting-history/git-rebase
Hanmant

301

Powinieneś być w stanie, git merge origin/mastergdy jesteś w swoim oddziale aq.

git checkout aq
git merge origin/master

55
To, czy rebase jest „lepszy”, zależy całkowicie od konkretnej sytuacji.
Bombe,

13
dlaczego po prostu nie nazwiesz „git merge master” zamiast „git merge origin / master”?
Michael Küller

145
Użyj, rebasejeśli twój oddział jest lokalny i nie został zepchnięty origin. Użyj, mergejeśli Twoja gałąź jest już wypchnięta. rebaseprzepisze historię.
garbagecollector

17
@Toskan możesz napotkać problemy, w których lokalny master nie jest na bieżąco z pilotem. W ten sposób zapewnia się scalenie zdalnej kopii kodu.
Chris Kooken,

8
@garbagecollector Jestem przeciw rebase (mogę, ale nie chcę rebase) Nie widzę powodu, aby grać z rebase. To po prostu czyni sprawy niepotrzebnie skomplikowanymi. Zawsze masz pytanie „Czy przekazałem to zdalnie?” zastanowić się i to jest trudność wyjaśnić przybyszom. Niektórzy twierdzą, że pozwala to uniknąć zatwierdzeń scalania. Ale chcę mieć zatwierdzenia scalania. Nie są zagracone, dokumentują, kiedy gałęzie są scalane. Czy po raz ostatni możemy wreszcie przestać zachowywać się tak, jakbyśmy wszyscy zobowiązali się do opanowania? Jeśli nie podoba ci się tak bardzo zatwierdzanie zatwierdzeń w dzienniku, po prostu odfiltruj je za pomocą --no-scales.
nurettin


25

Nie ma gwarancji, że główne poprawki błędów nie znajdują się wśród innych zatwierdzeń, dlatego nie można po prostu scalić. Zrobić

git checkout aq
git cherry-pick commit1
git cherry-pick commit2
git cherry-pick commit3
...

zakładając, że te zatwierdzenia reprezentują poprawki błędów.

Od teraz jednak trzymaj poprawki błędów w osobnej gałęzi. Będziesz mógł po prostu

git merge hotfixes

kiedy chcesz przenieść je wszystkie do zwykłej gałęzi deweloperów.


17

Albo cherry-pickodpowiednie rewizje język oddziału aqlub scalania oddziału masterjęzyk gałęzi aq.


5
@ Uśmiesz się, odpowiedziałeś sobie ... to nie jest rozwiązanie dla tej sytuacji
mtet88


8

Łatwy sposób

# 1. Create a new remote branch A base on last master
# 2. Checkout A
# 3. Merge aq to A

7

Dla mnie wprowadziłem już zmiany i chciałem otrzymywać najnowsze informacje z oddziału podstawowego. Nie byłem w stanie tego zrobić rebasei cherry-picktrwałbym wieczność, więc wykonałem następujące czynności:

git fetch origin <base branch name>  
git merge FETCH_HEAD

więc w tym przypadku:

git fetch origin master  
git merge FETCH_HEAD

7

To ( stąd ) działało dla mnie:

git checkout aq
git pull origin master
...
git push

Cytowanie:

git pull origin masterpobiera i łączy zawartość gałęzi master z gałęzią i tworzy zatwierdzenie scalania. Jeśli wystąpią jakiekolwiek konflikty scalania , na tym etapie zostaniesz powiadomiony, a przed kontynuowaniem musisz rozwiązać zatwierdzenia zatwierdzenia . Gdy będziesz gotowy do przekazania lokalnych zatwierdzeń, w tym nowego zatwierdzenia scalania, do zdalnego serwera, uruchom git push.


Ważne jest, aby pamiętać, że to rozwiązanie jest idealne, jeśli scalenie jest specyficznie wymagane, to znaczy, jeśli z jakiegoś powodu gałąź master nie może zostać ponownie oparta.
cudacoder

3

Masz kilka opcji. git rebase master aqna gałęzi, która zachowa nazwy zatwierdzeń, ale NIE NALEŻY REBASOWAĆ, jeśli jest to gałąź zdalna. Możesz, git merge master aqjeśli nie zależy ci na zachowaniu nazw zatwierdzeń. Jeśli chcesz zachować nazwy zatwierdzeń i jest to gałąź zdalna, git cherry-pick <commit hash>zatwierdza zmiany w gałęzi.


0

Możesz to również zrobić, uruchamiając jedną linię.
git merge aq master

Jest to równoważne z

git checkout aq
git merge master

To nie robi tego, co myślisz. git merge a błączy oddziały ai bdo bieżącego oddziału. Ale git merge akiedy jesteś na gałęzi a, nic nie zrobisz (dlatego wygląda to tak, jakby robił to, co myślisz, że robi). (Zobacz git-scm.com/docs/git-merge#Documentation/.... )
MikeBeaton

0

EDYTOWAĆ:

Moja odpowiedź poniżej dokumentów sposób scalić masterw aq, gdzie jeśli zobaczyć szczegóły scaleniu to wymienia zmiany dokonane na aqprzed scaleniem, nie zmienia się namaster . Uświadomiłem sobie, że prawdopodobnie nie tego chcesz, nawet jeśli tak uważasz!

Właśnie:

git checkout aq
git merge master

jest w porządku.

Tak, to proste scalenie pokaże, że zmiany masterzostały wprowadzone aqw tym punkcie, a nie na odwrót; ale to jest w porządku - skoro tak się stało! Później, kiedy w końcu scalisz swoją gałąź master, to wtedy scalenie w końcu pokaże wszystkie twoje zmiany jako wykonane master(co jest dokładnie tym, czego chcesz, i jest to zatwierdzenie, w którym ludzie i tak będą oczekiwać, aby znaleźć te informacje).

Sprawdziłem, a poniższe podejście pokazuje również dokładnie te same zmiany (wszystkie zmiany wprowadzone aqod czasu pierwotnego podziału na aqi master) jak normalne podejście powyżej, kiedy w końcu scalisz wszystko z powrotem master. Myślę więc, że jego jedyną prawdziwą wadą (poza tym, że jest zbyt skomplikowana i niestandardowa ...: - /) jest to, że jeśli cofniesz n ostatnich zmian, git reset --hard HEAD~<n>a to minie scalenie, to wersja poniżej przesunie się w dół „zła” gałąź, którą należy naprawić ręcznie (np. za pomocą git reflog& git reset --hard [sha]).


[Tak więc wcześniej myślałem, że:]

Wystąpił problem z:

git checkout aq
git merge master

ponieważ zmiany pokazane w zatwierdzeniu scalania (np. jeśli patrzysz teraz w Github, Bitbucket lub ulubionej lokalnej przeglądarce historii git) lub później, są zmianami dokonanymi na masterie, co może nie być tym, czego chcesz.

Z drugiej strony

git checkout master
git merge aq

pokazuje zmiany wprowadzone w aq, co prawdopodobnie jest tym, czego chcesz. (A przynajmniej często tego właśnie chcę!) Ale połączenie pokazujące właściwe zmiany jest w niewłaściwej gałęzi!

Jak sobie radzić?!

Pełny proces, kończący się zatwierdzeniem scalania pokazującym zmiany dokonane na aq (jak w drugim scaleniu powyżej), ale z scaleniem wpływającym na gałąź aq, jest:

git checkout master
git merge aq
git checkout aq
git merge master
git checkout master
git reset --hard HEAD~1
git checkout aq

To: łączy aq w master, przewija do przodu ten sam scalenie w aq, cofa go w master i ponownie przywraca aq!

Czuję, że czegoś mi brakuje - wydaje się, że jest to coś, czego oczywiście chcesz, i coś, co jest trudne do zrobienia.

Również rebase NIE jest równoważne. Traci znaczniki czasu i tożsamość zatwierdzeń wykonanych na aq, co też nie jest tym, czego chcę.


0

Scenariusz:

  • Utworzyłem gałąź od mistrza, powiedzmy gałąź 1 i ściągnąłem ją do mojego lokalnego.
  • Mój przyjaciel utworzył gałąź od mistrza, powiedz gałąź-2.
  • Popełnił kilka zmian kodu do master.
  • Teraz chcę przenieść te zmiany z gałęzi głównej do gałęzi lokalnej.

Rozwiązanie

git stash // to save all existing changes in local branch
git checkout master // Switch to master branch from branch-1
git pull // take changes from the master
git checkout branch-1 // switchback to your own branch
git rebase master // merge all the changes and move you git head  forward
git stash apply // reapply all you saved changes 

Możesz znaleźć konflikty w swoim pliku po wykonaniu „git stash Apply”. Musisz to naprawić ręcznie, a teraz jesteś gotowy do wypchnięcia.

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.