Mam gałąź o nazwie dmgr2 (programowanie) i chcę pobrać z gałęzi master (strona na żywo) i uwzględnić wszystkie zmiany w mojej gałęzi programistycznej. czy jest na to lepszy sposób? oto, co planowałem zrobić po dokonaniu zmian:
git checkout dmgr2
git pull origin master
to powinno pociągnąć za sobą zmiany na żywo w mojej branży programistów, czy mam to źle?
dev
oddziału za pomocągit checkout dev
. Potemgit pull --rebase origin master
. Jeśli będziesz miał szczęście, nie będzie konfliktów, a programista otrzyma najnowsze zmiany od mistrza.Odpowiedzi:
Wymienione kroki będą działać, ale istnieje dłuższy sposób, który daje więcej opcji:
fetch
Polecenie może być wykonane w dowolnym momencie przedmerge
, czyli można zamienić kolejność fetch i kasa, bofetch
po prostu podchodzi do wskazanego zdalnego (origin
) i mówi do niego: „daj mi wszystko, co masz, że nie mam ”, tzn. wszystkie zatwierdzenia we wszystkich oddziałach. Są one kopiowane do twojego repozytorium, ale nazwaneorigin/branch
dla dowolnego oddziału wymienionegobranch
na pilocie.W tym momencie możesz użyć dowolnej przeglądarki (
git log
,gitk
itp.), Aby zobaczyć „to, co mają”, czego nie masz, i odwrotnie. Czasami przydaje się to tylko w przypadku Ciepłych Rozmytych Uczuć („och, tak, to jest właśnie to, czego chcę”), a czasem przydaje się całkowicie do zmiany strategii („kurwa, jeszcze tego NIE chcę”).Na koniec
merge
polecenie przenosi dane zatwierdzenie, które można nazwać jakoorigin/master
, i robi wszystko, co konieczne, aby wprowadzić to zatwierdzenie i jego przodków, do dowolnej gałęzi, na której się znajdujesz podczas uruchamianiamerge
. Możesz wstawić--no-ff
lub,--ff-only
aby zapobiec szybkiemu przewijaniu do przodu, lub scalić tylko, jeśli wynik jest szybkim przewijaniem do przodu, jeśli chcesz.Podczas korzystania z sekwencji:
że
pull
przesyła zlecenie polecenia git uruchomićgit fetch
, a następnie moralnym odpowiednikiemgit merge origin/master
. Jest to więc prawie to samo, co wykonanie dwóch kroków ręcznie, ale istnieją pewne subtelne różnice, które prawdopodobnie nie dotyczą ciebie zbytnio. (W szczególnościfetch
krok po krokupull
przynosi tylkoorigin/master
i nie aktualizuje referencji w twoim repozytorium: 1 wszelkie nowe zatwierdzenia kończą się odniesieniem tylko przez specjalneFETCH_HEAD
odniesienie).Jeśli użyjesz bardziej wyraźnego
git fetch origin
(a następnie opcjonalnie rozejrzyj się), a następniegit merge origin/master
sekwencji, możesz równieżmaster
zaktualizować swój lokalny za pomocą pilota, z tylko jednymfetch
uruchomieniem w sieci:na przykład.
1 Druga część została zmieniona - mówię „naprawiona” - w git 1.8.4, która teraz aktualizuje oportunistycznie odniesienia do „zdalnej gałęzi”. (Była to, jak mówią informacje o wydaniu, celowa decyzja projektowa, aby pominąć aktualizację, ale okazuje się, że więcej osób woli, aby git ją aktualizował. Jeśli chcesz mieć stary SHA-1 ze zdalnej gałęzi, domyślnie jest zapisywany w , a tym samym możliwe do odzyskania po ponownym logowaniu. Umożliwia to także nową funkcję git 1.9 / 2.0 do znajdowania wcześniejszych wersji bazy).
źródło
git checkout
jest zwykle nieniszczący i zwykle nie ma powodu, aby cofaćgit fetch
, więc wygląda na to, że pytasz, jak wycofać zatwierdzenie scalenia. Odpowiedź jest taka sama jak dla innych zatwierdzeń: albogit reset
albogit revert
. W przypadku niepublikowanych zmiangit reset
jest zwykle najlepszą metodą; zmiany, które inni już wprowadzili,git revert
mogą być lepsze, ale zobacz poradę Linusagitk
,git log --graph
z lub bez--oneline
, i tak dalej) i możnagit show
lubgit show -m
scalanie popełnić lub wykorzystaniegit diff
. We wszystkich tych przypadkach program podajesz, wpisując polecenie w wierszu polecenia.Sytuacja : Pracuję w moim oddziale lokalnym, ale uwielbiam na bieżąco otrzymywać informacje o nazwie gałąź rozwoju
dev
.Rozwiązanie : zazwyczaj wolę robić:
źródło
To zadziałało dla mnie. Za pobranie najnowszego kodu z master do mojego oddziału
git rebase origin/master
źródło
git fetch origin
najpierw.Scenariusz :
Mam aktualizację master i aktualizację mojego oddziału, chcę, aby mój oddział śledził master z rebasingiem, aby właściwie śledzić całą historię, nazwijmy mój oddział Mybranch
Rozwiązanie :
(poprawka do ostatniego etapu, dzięki uprzejmości Tzachi Cohen, użycie „-f” zmusza gita do „aktualizacji historii” na serwerze)
teraz gałąź powinna być wyrównana z głównym i ponownie bazowana, również ze zdalną aktualizacją, więc w git log nie ma żadnych „za” ani „naprzód”, wystarczy usunąć wszystkie lokalne pliki konfliktu * .orig, aby utrzymać folder „czysty”
źródło