Was ist der Unterschied zwischen git push.default = current und push.default = upstream?

89

Die Manpage für git-config listet diese Optionen für push.default auf:

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.

In den meisten Fällen würde ich davon ausgehen, dass das Verschieben in den Upstream-Zweig eines Zweigs dasselbe ist wie das Verschieben in einen Zweig mit demselben Namen, da der Upstream-Zweig normalerweise denselben Namen hat und der Zweig mit demselben Namen ("aktuell"). ) wäre normalerweise (oder immer per Definition?) vorgelagert. Was ist der Unterschied?

UPDATE : Die man - Seite für git-config wird aktualisiert (wie man erwarten würde), so dass die Unterscheidungen es kann jetzt viel klarer.

Bilderstürmer
quelle
2
Für Entwickler ist es in der Tat ärgerlich, diese zu unterscheiden. Daher wird "einfach" eingeführt und ist das Standardverhalten für Git-Push. Eigentlich ist es in Git 1.7.11
Xhlwill
14
Weitere Informationen zur aktuellen Git-Warnung push.default is unset; its implicit value is changing in Git 2.0und zu matchingvs finden simpleSie unter stackoverflow.com/questions/13148066/…
Nate
iconoclaust: Ich glaube nicht, dass meine Bearbeitung die Integrität der Frage verändert hat, und veraltete Informationen müssen nur korrigiert werden. Warum muss der Benutzer die zusätzliche Arbeit erledigen, indem er auf den Link klickt?
Flimm

Antworten:

72

Sie haben den Unterschied in Ihrer Frage zusammengefasst. upstreamwird an den konfigurierten Upstream-Zweig weitergeleitet, während currentdavon ausgegangen wird , dass der Upstream-Zweig denselben Namen wie der aktuelle lokale Zweig hat, und an diesen bestimmten Namen gesendet wird. In Wirklichkeit gibt es keinen Grund anzunehmen, dass der Upstream-Tracking-Zweig eines lokalen Zweigs denselben Namen hat wie der lokale Zweig selbst.

Wenn Sie beispielsweise in mehreren Repositorys oder in mehreren gemeinsam genutzten Entwicklerfernbedienungen arbeiten, verfolgen Sie häufig verschiedene Gabeln desselben Zweigs, z. B. allen-masteroder susan-master, die beide den masterZweig in den Repos von Allen bzw. Susan verfolgen . In diesem Fall currentwäre dies die falsche Einstellung, da diese Zweigstellennamen auf ihren Fernbedienungen nicht vorhanden sind. upstreamwürde jedoch gut funktionieren.

Ein praktischeres Beispiel könnte das Verfolgen von a developmentund productionRepository sein. Ihr Workflow verwendet möglicherweise für jeden einen anderen Hauptzweig, dies kann jedoch verwirrend werden. Angenommen, Sie waren ein Code-Integrator und wollten die masterZweige beider Repositorys getrennt verfolgen .

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

Jetzt haben Sie zwei Zweige, die ihre jeweiligen Repositorys verfolgen, von denen keiner die masterNamenskonvention verwendet. Es gibt wenig Verwirrung über die Filialnamen: Sie beschreiben explizit, was sie verfolgen. Dennoch push.default = currentwürde keinen Sinn machen , da weder Fern einen enthält developmentoder productionZweig.

Christopher
quelle
6
Sie geben zwei Beispiele dafür, wann upstreames vorgezogen wird current. Ich denke, es ist ziemlich offensichtlich, deshalb sollten Sie lieber ein Beispiel für den umgekehrten Fall geben.
AndreKR
1
@AndreKR AFAIK currentist besser für den Fall, dass Sie ein neuer Entwickler sind, weil Sie nicht git configviel brauchen, besonders wenn Sie von irgendwoher geklont haben. currentPushs zu oder Erstellen-dann-Pushes-zu-gleichnamigen Zweigen auf dem Remote-Repo für Sie, wenn sie noch nicht vorhanden sind, wohingegen simpledies sofort abgelehnt wird, wenn ein gleichnamiger Zweig noch nicht vorhanden ist. upstreamhat in diesem Fall das gleiche Verhalten, es sei denn, ein Upstream-Zweig wurde explizit oder anderweitig festgelegt, wie in Yawars Antwort erwähnt.
Selten Needy
6

current schiebt den aktuellen Zweig zu einem Zweig mit demselben Namen auf dem Remote-Repo.

upstream schiebt den aktuellen Zweig in den vorgelagerten Zweig.

Der Upstream-Zweig ist ein Zweig, der explizit oder implizit als Upstream von Ihrem aktuellen Zweig definiert wurde. Das bedeutet, dass Push and Pull standardmäßig mit diesem Zweig synchronisiert wird. Der Upstream-Zweig befindet sich möglicherweise im selben Repo wie der aktuelle Zweig selbst. Sie können interessante Dinge tun, z. B. Ihren lokalen Hauptzweig vor Ihrem lokalen Feature-Zweig (Thema) einrichten und zwischen ihnen verschieben und ziehen.

Das implizite Upstream-Setup erfolgt über den branch.autosetupmergeKonfigurationswert. Dokumentation finden Sie auf der git configHilfeseite. Das explizite Upstream-Setup erfolgt mit der -uOption zum git branchBefehl. Weitere Informationen finden Sie auf der Hilfeseite.

Yawar
quelle
Ich denke branch.autoSetupMergenicht das gleiche wie -u/ --set-upstream. Zumindest sehe ich in der Dokumentation nichts, was darauf hindeutet, dass sich Git Push so verhält, als ob es -ustandardmäßig aufgerufen worden wäre, was es mir scheint, wie Sie sagen. Können Sie klarstellen, was Sie meinten?
Waldyrious
@waldyrious sicher; Wenn Sie einen Remote-Tracking-Zweig branch.autoSetupMergeauschecken , erstellt die Konfiguration standardmäßig einen neuen lokalen Zweig und legt dessen Upstream als Remote-Tracking-Zweig fest. Diese implizite Aktion kann explizit ausgeführt werden, indem entweder die Flags -t( --track) oder -u ...( --set-upstream-to=...) verwendet werden, die dasselbe mit leicht unterschiedlichen Syntaxen tun.
Yawar
1
Ich sehe, was hier passiert ist - da es um diese Frage geht git push, habe ich (fälschlicherweise) angenommen, dass Sie über die -uOption von git pushund nicht über die -uOption von gesprochen haben git branch. Entschuldigung für die Verwirrung :)
waldyrious