Git pull bez kasy?

133

Jestem przyzwyczajony do uruchamiania git pull i innych poleceń z gałęzi, nad którą pracuję. Ale skonfigurowałem serwer programistyczny, na którym pracuje kilka osób, więc nie chcę zmieniać gałęzi, kiedy to robię. Jeśli chcę zaktualizować istniejącą gałąź na serwerze deweloperskim z repozytorium github, z którego wszyscy korzystamy, jaki byłby właściwy sposób na zrobienie tego? Jeśli uruchomię polecenie „git pull github branchname”, czy to po prostu ściągnie gałąź do bieżącej gałęzi?

Wszystkie przykłady gita, które mogę znaleźć, wydają się wskazywać, że najpierw uruchamiasz 'checkout branchname', a następnie wykonujesz pull. Próbuję tego uniknąć. Jak powiedziałem, jest to istniejąca gałąź i chcę tylko zaktualizować do najnowszej wersji.

Diana Saunders
źródło
6
git fetchpowinieneś robić, co chcesz.
Brad
11
git fetchzaktualizowałaby lokalną kopię zdalnego oddziału, ale nie żadnego lokalnego oddziału, nawet jeśli jeden jest skonfigurowany do śledzenia tej konkretnej zdalnej gałęzi. Może, ale nie musi, być tym, czego chcieliśmy. (Edycja: w każdym razie domyślnie. Można to wywołać z argumentami, aby zachowywał się inaczej, ale w takim przypadku argumenty powinny być naprawdę podkreślone.)
2
Nie do końca rozumiem ... czy wszyscy używają tego samego lokalnego repozytorium na serwerze deweloperskim? Czy to dlatego nie chcesz zmieniać oddziałów? Dlaczego po prostu nie pozwolić każdemu stworzyć własnego prywatnego klona, ​​w którym mogą pracować? Zobacz także git: update a local branch bez sprawdzania go? .

Odpowiedzi:

221

Szukałem tego samego i w końcu znalazłem odpowiedź, która zadziałała dla mnie w innym poście z przepełnieniem stosu : Scal, aktualizuj i wyciągaj gałęzie Git bez korzystania z kasy

Gruntownie:

git fetch <remote> <srcBranch>:<destBranch>

koral
źródło
Czy istnieje sposób na użycie gałęzi upstream zamiast określania gałęzi źródłowej?
kambunctious
Niestety, ale pullposiada parametry, że fetchnie: -s <strategy>, -Xsubtree=...co było istotne dla mnie, więc nie jest to odpowiednik wymiana. Miałem problem opisany tutaj: congruityservice.com/blog/… ale w moim przypadku w ogóle nie chciałem kasy.
Andry
2
Biorąc pod uwagę, że pytanie dotyczy przyciągania, wydaje się, że zamiast tego należy odpowiedzieć git pull <remote> <srcBranch>:<destBranch>.
J Woodchuck,
Jeśli zatwierdzenia są już w twoim lokalnym repozytorium:git fetch . origin/master:master
Evan
74

Miałem ten sam problem z koniecznością zatwierdzania lub przechowywania bieżących zmian funkcji, gałęzi głównej kasy , wykonaj pullpolecenie, aby uzyskać wszystko, od zdalnego do lokalnego masterobszaru roboczego, a następnie przełączyć się ponownie na gałąź funkcji i wykonać, rebaseaby zaktualizować ją z mistrz.

Aby to wszystko zrobić, zachowaj obszar roboczy w gałęzi funkcji i unikaj przełączania, robię to:

git fetch origin master:master

git rebase master

I to ładnie załatwia sprawę.

Marcin TP Łuczyński
źródło
19
To dobra rada, ale zagłębia lede: zgodnie z poniższymi odpowiedziami, jeśli jesteś włączony featurei WSZYSTKO, co chcesz zrobić, to zaktualizować lokalny, masteraby był zgodny z pochodzeniem, BEZ dotykania feature, po prostu zrób git fetch origin master:master... i to tak, jakbyś to zrobił Kasa-w-kasieMaster-pull-checkoutFeature-stashPop!
btown
7
Aby scalić pierwotny wzorzec z lokalnym oddziałem, nie musisz ściągać lokalnego wzorca. Możesz użyć git merge origin/master
Dan
-1

Jeśli chcesz, aby wskazówki lokalnego oddziału zostały ponownie skierowane pogit fetch , potrzebujesz dodatkowych kroków.

Bardziej konkretnie, załóżmy repo github ma oddziałów D, B, Coraz master(powodem tego oddziału nieparzystej nazwa-zestawu będzie jasne za chwilę). Jesteś na hoście devhosti jesteś w repozytorium, w którym originznajduje się repozytorium github. Robisz git fetch, co przynosi w stosunku do wszystkich obiektów i aktualizacji origin/D, origin/B, origin/C, i origin/master. Na razie w porządku. Ale teraz mówisz, że chcesz coś się wydarzy, na devhost, do lokalnych oddziałów D, B, C, i / lub master?

Mam te oczywiste (przynajmniej dla mnie) pytania:

  1. Dlaczego chcesz zaktualizować wskazówki wszystkich oddziałów?
  2. Co jeśli jakaś gałąź (np. B ) Ma zatwierdzenia, których brakuje w zdalnym (github) repozytorium? Czy powinny zostać scalone, przebudowane, czy ...?
  3. Co jeśli jesteś w jakiejś gałęzi (np. C), A katalog roboczy i / lub indeks są zmodyfikowane, ale nie zatwierdzone?
  4. Co się stanie, jeśli zdalne repozytorium ma dodane nowe gałęzie ( A) i / lub usunięte gałęzie ( D)?

Jeśli odpowiedź na (1) brzmi „ponieważ devhost nie jest w rzeczywistości przeznaczona do programowania, ale raczej jest lokalnym serwerem lustrzanym, który po prostu przechowuje lokalnie dostępną kopię repozytorium github, aby wszyscy nasi programiści mogli szybko czytać z niego zamiast powoli czytać github ”, wtedy chcesz mieć„ lustro ”zamiast„ normalnego ”repozytorium. Nie powinien mieć katalogu roboczego i być może nie powinien też akceptować wypychania, w takim przypadku pozostałe pytania po prostu znikają.

Jeśli jest jakaś inna odpowiedź, (2-4) stają się problematyczne.

W każdym razie, oto sposób na rozwiązanie problemu aktualizowania lokalnych referencji na podstawie zdalnych referencji ( git fetch -pna przykład po uruchomieniu ):

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

To, co znajduje się w tej ... code here ...sekcji, zależy od odpowiedzi na pytania (2-4).

torek
źródło
-5

Posługiwać się

git fetch

zamiast. Aktualizuje zdalne referencje i obiekty w repozytorium, ale pozostawia lokalne oddziały, HEAD i obszar roboczy w spokoju.

SzG
źródło
17
Ale to nie aktualizuje lokalnych gałęzi jego serwera deweloperskiego… Odświeża tylko gałęzie „origin” w tym folderze git, które odpowiadają repozytorium github pytającego.
ANeves
1
Lub, jeśli chcesz moją wersję problemu: chcę połączyć moją gałąź roboczą z „master”, a nie z „origin / master of ssh: // bla bla bla”. Wykonywanie pobierania zaktualizuje źródło / wzorzec, ale nie nadrzędny.
ANeves
-6

EDYTUJ: Użyj 'git pull' Pobierze wszystkie gałęzie z repozytorium i zaktualizuje również do najnowszej, jeśli oddział zostanie zamknięty w systemie lokalnym tylko dla bieżącej gałęzi. Uwaga: git pull jest odpowiednikiem funkcji fetch + merge, która pobiera wszystkie gałęzie, ale łączy tylko bieżącą gałąź.

Anuj Aneja
źródło
6
Lepiej powiedzieć: pullwykonuje pobieranie (które, tak, pobiera wszystko z pilota), ale następnie scala tylko bieżącą gałąź.
torek
Bez urazy moim głosem przeciw, wiem, że to, co mówisz, jest poprawne i zgodne z faktami, a OP rzeczywiście poprosił o potwierdzenie tego, co robi pull (i dałeś mu to wyjaśnienie), ale nie odnosi się do sedno tego, czego szukał: Czy istnieje sposób na zaktualizowanie jednego z lokalnych oddziałów do najnowszych zatwierdzeń w powiązanej z nim gałęzi zdalnej bez konieczności uprzedniego sprawdzania tego oddziału.
Gurce