2012-12-06 14 views
23

Czytałem o komendzie git człowieka pchania, ale ja nadal nie rozumiem dokładną różnicę między bieżącym i upstream być ustawione w naciśnięciem. domyślniegit - pchania prąd vs. pchnąć w górę (śledzenie)

Chcę, aby nasz zespół po prostu pchnął i tylko zmiany w oddziale, nad którym obecnie pracują, zostaną wypchnięte. Jak rozumiem, ta gałąź to ta, która jest oznaczona gwiazdką (*), gdy wykonuję git branch.

Dzięki za pomoc.

Odpowiedz

38

Pytanie jest co ty popychanie i gdzie:

  • current:

    • "co" jest tylko aktualna gałąź (żadna inna gałęzie),
    • "gdzie "to gałąź o tej samej nazwie (utworzona, jeśli nie istnieje) w upstream repo.
  • upstream:

    • "co" jest tylko bieżąca gałąź,
    • "gdzie" jest jakiegokolwiek oddziału (niekoniecznie o tej samej nazwie) na wyższym repozytorium has been assigned as an upstream branch dla lokalnego oddziału, który pchasz.

Jak explained here, Git2.0 dodatkowo wprowadzić nowe wartości domyślne dla push.default: simple

simple jest jak upstream, ale pod prąd musi mieć taką samą nazwę jak cóż, albo push nie powiedzie się.


Pushing tylko jeden oddział (z włączonym trybem „simple”, „current” lub „upstream«) unika the scenario gdzie wszystkie pasujące gałęzie są popychane (tryb»matching”, który został domyślny przez dłuższy czas) , chociaż niektóre z twoich oddziałów mogą nie być gotowe do wypchnięcia.

(master)> git push 
... 
To [email protected]:jkubicek/my_proj.git 
    21b430d..dd378ca master -> master 
! [rejected]  release -> release (non-fast-forward) 
error: failed to push some refs to '[email protected]:jkubicek/my_proj.git' 
hint: Updates were rejected because a pushed branch tip is behind its remote 
hint: counterpart. 
hint: If you did not intend to push that branch, you may want to 
hint: specify branches to push or set the 'push.default' configuration 
hint: variable to 'current' or 'upstream' to push only the current branch. 

Różnica między nimi (current i upstream) jest w pociągnięciem (co ciągnąć z pilota do swojej branży?):

  • popychanie "current" nie oznacza, że ​​twój bieżący oddział ma B ma swoją gałąź rozgałęzienia.
    Np .: branch.B.merge nie jest ustawiony, gdy naciskasz gałąź "current".
    Np .: przy ciągnięciu do B git nie będzie wiedział, którą gałąź ma ciągnąć.

  • naciśnięcie "upstream" oznacza, że ​​bieżący oddział B ma remote/B ma swoją gałąź upstream.
    Tj.: branch.B.mergeto zestaw, gdy przesuwasz gałąź "upstream".
    Ie: kiedy pociągnięcie do B git wie, co oddział do ciągnięcia (jak również aktywnego pilota repo: branch.B.remote)

+0

'push.default' nie ma wpływu na' pull'! - Raczej byłoby powiedzieć, że konfiguracja gałęzi upstream ma wpływ na to, co zostanie wyciągnięte. Ale obie rzeczy (upstream i push.default) to dwie różne rzeczy. –

2

push.default najlepiej pokryte stronę man git config (man git config).

Aby zrozumieć różnicę między „przed” i „prąd” dla push.default, należy wiedzieć, termin upstream:

Upstream to lokalny wskaźnik od normalnego lokalnego oddziału do lokalnej zdalnego śledzenia oddział. (Tak, to są wszystkie lokalne). Przykłady:

  • Branża blabla został Origin/blabla skonfigurowane jako upstream (bardzo często)
  • oddział blabla ma pochodzenia/foo jak powyżej (oddział ma inną nazwę lokalnego; nie tak powszechne)
  • oddział blabla ma źródło2/foo jako upstream

Należy pamiętać, że gałęzie: origin/* są lokalne i (ponownie) ustawione dla każdego pobrania z punktu początkowego. Są one nazywane "lokalnymi oddziałami zdalnego śledzenia". Reprezentują one stan rozgałęzień na zdalnym "pochodzeniu" w momencie ostatniego pobrania.

Każda (normalna) gałąź lokalna może mieć skonfigurowaną konfigurację, ale nie jest to konieczne: konfiguracja relacji typu "upstream" jest tylko dla wygody dla niektórych poleceń git!

Na przykład, jeśli robisz git status, git mówi "x zatwierdza tył/przód", jeśli zna wcześniej (tak, żeby git mógł się z nim porównywać).

Normalny początkowy git checkout blabla zwykle ustawia upstream konfigurację dla Ciebie (jeżeli pochodzenie/blabla istnieje, to jest wyrejestrowany i konfiguracja jak powyżej - w przeciwnym razie kasa zawiedzie).

może również użyć konfiguracji odgałęzienia oddziału, tj. Skopiować nowe zatwierdzenia do odległego oddziału reprezentującego poprzedni. (Jest to push.default = upstream).

push.default = current pozwala git push skopiować nowe zobowiązuje się do zdalnego pod tą samą nazwą. Całkowicie ignoruje konfigurację wyższego rzędu. - Jeśli nazwa lokalnego oddziału jest zawsze taka sama, jak nazwa zdalnego, obie konfiguracje mają ten sam efekt, z tym wyjątkiem, że git push z push.default = upstream zakończy się niepowodzeniem, jeśli strona nie jest jeszcze skonfigurowana.

PD: Tak, * na wyjściu z git branch pokazuje bieżącą gałąź.