Jaka jest różnica między git push.default = current i push.default = upstream?

89

Strona podręcznika dla git-config zawiera następujące opcje dla push.default:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

W większości przypadków założyłbym, że wypchnięcie do gałęzi upstream byłoby tym samym, co wypchnięcie do gałęzi o tej samej nazwie, ponieważ gałąź upstream zwykle miałaby tę samą nazwę, a gałąź o tej samej nazwie ("bieżąca" ) normalnie (czy zawsze, z definicji?) znajdowałby się na wyższym poziomie. Więc jaka jest różnica?

AKTUALIZACJA : Strona podręcznika dla git-config została zaktualizowana (jak można by się spodziewać), więc wprowadzone tam rozróżnieniamogą być teraz dużo jaśniejsze.

ikonoklasta
źródło
2
dla programistów jest to rzeczywiście denerwujące, gdy różnią się nimi, więc wprowadzono „proste” i będzie to domyślne zachowanie dla git-push. faktycznie pojawił się w git
1.7.11
14
Aby uzyskać więcej informacji na temat ostatniego ostrzeżenia gita push.default is unset; its implicit value is changing in Git 2.0i informacji o matchingporównaniu, simplezobacz stackoverflow.com/questions/13148066/…
Nate,
iconoclaust: Nie sądzę, żeby moja zmiana w ogóle zmieniła integralność pytania, a nieaktualne informacje trzeba po prostu poprawić. Po co zmuszać użytkownika do dodatkowej pracy polegającej na kliknięciu linku?
Flimm

Odpowiedzi:

72

Podsumowałeś różnicę w swoim pytaniu. upstreamwypycha do skonfigurowanej gałęzi upstream, podczas gdy currentzakłada, że ​​gałąź upstream ma taką samą nazwę jak bieżąca gałąź lokalna i wypycha do tej konkretnej nazwy. W rzeczywistości nie ma powodu, aby zakładać, że gałąź śledzenia oddziału lokalnego ma taką samą nazwę jak sama gałąź lokalna.

Na przykład, jeśli pracujesz w wielu repozytoriach lub na wielu współdzielonych zdalnych programach deweloperskich, często kończysz śledzenie różnych forków tej samej gałęzi, takich jak allen-masterlub susan-master, z których oba śledzą mastergałąź odpowiednio w repozytoriach Allena i Susan. W tym przypadku currentbyłoby to nieprawidłowe ustawienie, ponieważ te nazwy gałęzi nie istnieją na ich pilotach. upstreamjednak będzie działać dobrze.

Bardziej praktycznym przykładem może być śledzenie zarówno repozytorium, jak developmenti productionrepozytorium. Twój przepływ pracy może korzystać z innej gałęzi głównej dla każdego z nich, ale może to być mylące. Załóżmy, że jesteś integratorem kodu i chciałbyś masteroddzielnie śledzić gałęzie obu repozytoriów .

git checkout -b production --track production/master
git checkout -b development --track development/master

Teraz masz dwie gałęzie, które śledzą swoje repozytoria, z których żadna nie używa masterw ogóle konwencji nazewnictwa. Nie ma wątpliwości co do nazw gałęzi: wyraźnie opisują to, co śledzą. Niemniej jednak push.default = currentnie miałoby to sensu, ponieważ żaden pilot nie zawiera gałęzi developmentani production.

Krzysztof
źródło
6
Podajesz dwa przykłady tego, kiedy upstreamjest preferowane current. Myślę, że jest to dość oczywiste, więc powinieneś raczej podać przykład dla przypadku odwrotnego.
AndreKR
1
@AndreKR AFAIK currentjest lepszy w przypadku, gdy jesteś nowym programistą, ponieważ nie potrzebujesz git configwiele, zwłaszcza jeśli skądś sklonowałeś. currentwypycha lub tworzy-następnie-wypycha-do homonimicznych gałęzi w zdalnym repozytorium , jeśli jeszcze nie istnieją, natomiast simpleodmówi zrobienia tego wprost, gdy gałąź o tej samej nazwie już nie istnieje. upstreamzachowuje się tak samo w tym przypadku, chyba że gałąź upstream została wyraźnie ustawiona lub ustawiona w inny sposób, jak wspomniano w odpowiedzi Yawara .
Rzadko „Gdzie jest Monica” Needy
6

current przeniesie bieżącą gałąź do gałęzi o tej samej nazwie w zdalnym repozytorium.

upstream przeniesie bieżącą gałąź do gałęzi upstream.

Gałąź upstream to gałąź, która została jawnie lub niejawnie zdefiniowana jako znajdująca się powyżej twojej bieżącej gałęzi. Oznacza to, że opcja push and pull będzie domyślnie synchronizowana z tą gałęzią. Gałąź upstream może znajdować się w tym samym repozytorium, co sama gałąź bieżąca. Możesz robić interesujące rzeczy, na przykład skonfigurować lokalną gałąź główną jako wyższą niż lokalna gałąź funkcji (temat) i przesuwać i ciągnąć między nimi.

Niejawna konfiguracja nadrzędna jest wykonywana za pomocą branch.autosetupmergewartości config. Dokumentację można znaleźć na git configstronie pomocy. Jawna konfiguracja nadrzędna jest wykonywana za pomocą -uopcji git branchpolecenia. Szczegółowe informacje można znaleźć na stronie pomocy.

Yawar
źródło
Myślę, że nie myślę branch.autoSetupMergetak samo jak -u/ --set-upstream. Przynajmniej nie widzę w dokumentacji nic, co sugerowałoby, że sprawia, że ​​git push zachowuje się tak, jakby został wywołany -udomyślnie, co wydaje mi się, że mówisz. Czy możesz wyjaśnić, co miałeś na myśli?
waldyrious
@waldyrious pewnie; podczas sprawdzania zdalnej gałęzi śledzenia, branch.autoSetupMergekonfiguracja domyślnie tworzy nową lokalną gałąź i ustawia jej górną gałąź jako zdalną gałąź śledzenia. Ta niejawna akcja może być jawnie wykonana przy użyciu flag -t( --track) lub -u ...( --set-upstream-to=...), które robią to samo z nieco inną składnią.
Yawar
1
Widzę, co się tutaj stało - skoro to pytanie dotyczy git push, (omyłkowo) założyłem, że mówisz o -uopcji git push, a nie o -uopcji git branch. Przepraszam za zamieszanie :)
waldyrious