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.
git
git-branch
git-push
ikonoklasta
źródło
źródło
push.default is unset; its implicit value is changing in Git 2.0
i informacji omatching
porównaniu,simple
zobacz stackoverflow.com/questions/13148066/…Odpowiedzi:
Podsumowałeś różnicę w swoim pytaniu.
upstream
wypycha do skonfigurowanej gałęzi upstream, podczas gdycurrent
zakł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-master
lubsusan-master
, z których oba śledząmaster
gałąź odpowiednio w repozytoriach Allena i Susan. W tym przypadkucurrent
byłoby to nieprawidłowe ustawienie, ponieważ te nazwy gałęzi nie istnieją na ich pilotach.upstream
jednak będzie działać dobrze.Bardziej praktycznym przykładem może być śledzenie zarówno repozytorium, jak
development
iproduction
repozytorium. 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śmaster
oddzielnie śledzić gałęzie obu repozytoriów .Teraz masz dwie gałęzie, które śledzą swoje repozytoria, z których żadna nie używa
master
w ogóle konwencji nazewnictwa. Nie ma wątpliwości co do nazw gałęzi: wyraźnie opisują to, co śledzą. Niemniej jednakpush.default = current
nie miałoby to sensu, ponieważ żaden pilot nie zawiera gałęzidevelopment
aniproduction
.źródło
upstream
jest preferowanecurrent
. Myślę, że jest to dość oczywiste, więc powinieneś raczej podać przykład dla przypadku odwrotnego.current
jest lepszy w przypadku, gdy jesteś nowym programistą, ponieważ nie potrzebujeszgit config
wiele, zwłaszcza jeśli skądś sklonowałeś.current
wypycha lub tworzy-następnie-wypycha-do homonimicznych gałęzi w zdalnym repozytorium , jeśli jeszcze nie istnieją, natomiastsimple
odmówi zrobienia tego wprost, gdy gałąź o tej samej nazwie już nie istnieje.upstream
zachowuje 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 .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.autosetupmerge
wartości config. Dokumentację można znaleźć nagit config
stronie pomocy. Jawna konfiguracja nadrzędna jest wykonywana za pomocą-u
opcjigit branch
polecenia. Szczegółowe informacje można znaleźć na stronie pomocy.źródło
branch.autoSetupMerge
tak 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-u
domyślnie, co wydaje mi się, że mówisz. Czy możesz wyjaśnić, co miałeś na myśli?branch.autoSetupMerge
konfiguracja 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ą.git push
, (omyłkowo) założyłem, że mówisz o-u
opcjigit push
, a nie o-u
opcjigit branch
. Przepraszam za zamieszanie :)