Tylko ja w mojej organizacji dokonuję zatwierdzeń z następującym komunikatem:
Połącz gałąź zdalnego śledzenia „pochodzenie / rozwój” w programować
Nie jestem pewien, co robię, żeby je wywołać, ale chciałbym przestać.
Jakie polecenie wydaję, aby utworzyć to zatwierdzenie i jakie jest właściwe polecenie, którego powinienem użyć, aby go nie wyprodukować?
git
branching-and-merging
git-merge
git-remote
Jordan Feldstein
źródło
źródło
git pull --autostash --rebase
działa dla Ciebie @Johnjohn?Odpowiedzi:
git pull
prawdopodobnie tworzy zatwierdzenie. Jeśli wykonasz lokalne zatwierdzenie, a następnie uruchomiszgit pull
po tym, jak ktoś inny umieści zatwierdzenie w repozytorium, Git pobierze zatwierdzenie innego programisty, a następnie scali go z lokalną gałęzią.Jak uniknąć tych zatwierdzeń scalających w przyszłości
Mógłbyś użyć,
git pull --rebase
aby temu zapobiec w przyszłości, ale ponowne bazowanie ma swoje niebezpieczeństwa i zalecampull
całkowite unikanie tego .Zamiast tego zachęcam do przestrzegania tego schematu użytkowania:
Wyjaśnienie
git remote update -p
pobiera wszystkie zatwierdzenia ze zdalnych repozytoriów i aktualizuje zdalne gałęzie śledzenia (nporigin/master
.). NIE dotyka twojego katalogu roboczego, indeksu ani lokalnych gałęzi.Te
-p
śliwki argumentów usunięte oddziałów wydobywczych. Zatem jeślifoo
oddział zostanie usunięty zorigin
repozytorium,git remote update -p
automatycznie usunie Twójorigin/foo
ref.git merge --ff-only @{u}
mówi Gitowi, aby scalił gałąź upstream (@{u}
argument) z gałęzią lokalną, ale tylko wtedy, gdy gałąź lokalna może zostać „szybko przekazana” do gałęzi upstream (innymi słowy, jeśli się nie rozdzieliła).git rebase -p @{u}
efektywnie przenosi zatwierdzenia, które stworzyłeś, ale nie zostały jeszcze umieszczone na górnej gałęzi, co eliminuje potrzebę tworzenia głupich zatwierdzeń scalających, których próbujesz uniknąć. Poprawia to liniowość historii rozwoju, ułatwiając przeglądanie.Ta
-p
opcja mówi Gitowi, aby zachować scalenia. Zapobiega to linearyzacji zatwierdzeń przez Git. Jest to ważne, jeśli na przykład scaliłeś gałąź funkcji zmaster
. Bez tego-p
każde zatwierdzenie w gałęzi feature byłoby zduplikowanemaster
jako część linearyzacji wykonywanej przezgit rebase
. Utrudniłoby to przeglądanie historii rozwoju, a nie łatwiejsze.Uwaga :
git rebase
możesz nie robić tego, czego oczekujesz, więc przejrzyj wyniki przed naciśnięciem. Na przykład:Preferuję to podejście
git pull --rebase
z następujących powodów:-p
(--preserve-merges
) dogit rebase
w przypadku konieczności zmiany bazy zamierzonego scalenia (np. Scalenia już wypchniętej gałęzi funkcji domaster
).Stenografia:
git up
zamiastgit pull
Aby ułatwić powyższe, polecam utworzenie aliasu o nazwie
up
:Teraz wszystko, co musisz zrobić, aby zaktualizować swój oddział, to uruchomić:
zamiast
git pull
. Jeśli pojawi się błąd, ponieważ lokalna gałąź oddzieliła się od gałęzi upstream, jest to wskazówka do ponownej bazy danych.Dlaczego nie
git pull --rebase
?Bieganie
git pull --rebase
jest równoznaczne z bieganiem,git fetch
po którym następujegit rebase
. To próbuje szybko przewinąć do nowych zatwierdzeń upstream, ale jeśli to nie jest możliwe, to przełoży twoje lokalne zatwierdzenia do nowych zatwierdzeń upstream. Zwykle jest to w porządku, ale bądź ostrożny:git pull --rebase
nie daje możliwości zbadania zatwierdzeń przed ich wprowadzeniem. W zależności od tego, co upstream zmieniło, to całkiem możliwe, że rebase jest zła praca-arebase --onto
,merge
,reset
, lubpush -f
może być bardziej odpowiednie niż zwykłyrebase
.--preserve-merges
do operacji rebase, więc każde celowe scalenie gałęzi funkcji zostanie zlinearyzowane, odtwarzając (a tym samym powielając) wszystkie zatwierdzenia gałęzi funkcji.„Naprawianie” istniejącego zatwierdzenia scalającego utworzonego przez
git pull
Jeśli jeszcze nie wypchnąłeś zatwierdzenia scalającego utworzonego przez
git pull
, możesz zmienić bazę zatwierdzenia scalającego. Zakładając, że nie dokonałeś żadnych celowych scaleń (np. Scalenie już wypchniętej gałęzi funkcji do bieżącej gałęzi), wykonaj następujące czynności:Powyższe polecenie nakazuje Gitowi wybranie wszystkich zatwierdzeń nie-scalających dostępnych z
HEAD
(bieżącego zatwierdzenia), pomniejszonych o wszystkie zatwierdzenia osiągalne z@{u}
(co jest skrótem dla "gałęzi upstream", tj.origin/master
JeśliHEAD
jestmaster
), powtórka (wybór wiśniowy ) je na górnej gałęzi, a następnie przenieś odwołanie do bieżącej gałęzi, aby wskazywało wynik ponownego odtworzenia zatwierdzeń. To skutecznie przenosi zatwierdzenie nie-scalające do ostatniego zatwierdzenia nadrzędnego, co eliminuje scalanie utworzone przezgit pull
.Jeśli masz celowe zatwierdzenie przez scalanie, nie chcesz uruchamiać,
git rebase @{u}
ponieważ odtworzy wszystko z innej gałęzi. Radzenie sobie z tym przypadkiem jest znacznie bardziej skomplikowane, dlatego dobrze jest go używaćgit up
igit pull
całkowicie unikać . Prawdopodobnie będziesz musiał użyć,reset
aby cofnąć scalenie utworzone przez,pull
a następnie to zrobićgit rebase -p @{u}
.-p
Argumentgit rebase
nie działa niezawodnie dla mnie, więc może skończyć się konieczności korzystaniareset
cofnąć celowe seryjnej, aktualizować swój lokalny oddział do@{u}
, a następnie przerobić celowe seryjnej (co jest uciążliwe, gdyby nie było dużo owłosionej seryjnej konflikty).źródło
-p
. Unikałem wcześniejszego polecania go, ponieważ nie jest potrzebny zbyt często, a jego zachowanie nie jest dobrze udokumentowane.git remote update -p
igit fetch
?git remote update -p
to to samo cogit fetch --all -p
. Przyzwyczaiłem się do używania zgit remote update -p
powrotem, kiedyfetch
nie miałem takiej-p
możliwości.Że należy to zrobić. Lub jeśli chcesz nadal używać pull
Możesz również ustawić tę gałąź w swoim configu, aby automatycznie przestawiać bazę, lub ustawić ją w ten sposób automatycznie dla wszelkich innych tworzonych w przyszłości gałęzi śledzenia. Następnie możesz wrócić do zwykłego używania
Więcej na ten temat w sekcji „Wyciągnij z rebase zamiast scalać” na tej stronie:
http://mislav.uniqpath.com/2010/07/git-tips/
źródło