2012-08-08 14 views
80

Die man-Seite für git-config listet diese Optionen für push.default:Was ist der Unterschied zwischen git push.default = current und push.default = upstream?

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 als Aufschieben des gleichen Namens zu einem Zweig wäre das gleiche zu einem Zweig des vorderen Schenkel drängen , da der Upstream-Zweig normalerweise denselben Namen hätte und der Zweig mit demselben Namen ("Strom") normalerweise (oder immer per Definition?) stromaufwärts wäre. Was ist der Unterschied?

UPDATE: The man page for git-config wird aktualisiert (wie man erwarten würde), so dass die jetzt viel klarer gemacht Scheidungen there können.

+2

für Entwickler ist es in der Tat nervig, diese zu unterscheiden, so dass "einfach" eingeführt wird, und wird das Standardverhalten für Git-Push sein. tatsächlich ist es in [git 1.7.11] (https://raw.github.com/git/git/master/Documentation/RelNotes/1.7.11.txt) erschienen – xhlwill

+14

Für mehr auf der letzten Git Warnung 'push.default ist Unscharf; sein impliziter Wert ändert sich in Git 2.0' und über 'matching' gegenüber' simple' siehe http://stackoverflow.com/questions/13148066/warning-push-default-is-unset-its-implicit-value-is-changing -in-git-2-0 – Nate

+0

iconoclaust: Ich glaube nicht, dass meine Bearbeitung die Integrität der Frage verändert hat, und veraltete Informationen müssen nur korrigiert werden. Warum sollte der Benutzer die zusätzliche Arbeit tun, indem er auf den Link klickt? – Flimm

Antwort

68

Sie haben den Unterschied in Ihrer Frage zusammengefasst. upstream schiebt die konfiguriert vorgelagerten Zweig, während current davon ausgeht, dass die vorgelagerte Zweigstelle den gleichen Namen wie die aktuellen lokalen Zweig hat, und drückt auf diesen bestimmten Namen. In Wirklichkeit gibt es keinen Grund zu der Annahme, dass der Upstream-Tracking-Zweig eines lokalen Zweigs den gleichen Namen wie der lokale Zweig selbst hat.

Zum Beispiel, wenn Sie in mehreren Repositorys oder über viele gemeinsame Entwickler-Fernbedienungen arbeiten, erhalten Sie häufig verschiedene Gabeln von der gleichen Branche Tracking auf, wie allen-master oder susan-master, von denen beide verfolgen die master Niederlassung in Allen und Susan repos , beziehungsweise. In diesem Fall wäre current die falsche Einstellung, da diese Verzweigungsnamen auf ihren Fernbedienungen nicht vorhanden sind. upstream würde jedoch gut funktionieren. Ein praktischeres Beispiel könnte ein development und production Repository verfolgen. In Ihrem Arbeitsablauf wird möglicherweise jeweils eine andere Hauptzweig-Verzweigung verwendet. Dies kann jedoch zu Verwirrung führen. Angenommen, Sie wären ein Code-Integrator und wollten die Zweigstellen master beider Repositories separat verfolgen.

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

Jetzt haben Sie zwei Zweige bekommen, die ihre jeweiligen Repositories verfolgen, überhaupt keiner von denen verwenden, um die master Namenskonvention. Es gibt wenig Verwirrung über die Zweignamen: Sie beschreiben explizit, was sie verfolgen. Nichtsdestoweniger würde push.default = current keinen Sinn ergeben, da keine der Fernleitungen einen Zweig development oder production enthält.

+6

Sie geben zwei Beispiele, wenn "stromaufwärts" gegenüber "Strom" bevorzugt wird. Ich denke, es ist ziemlich offensichtlich, also sollten Sie lieber ein Beispiel für den umgekehrten Fall geben. – AndreKR

+1

@AndreKR AFAIK 'current' ist besser für den Fall, dass Sie ein neuer Entwickler sind, weil Sie' git config' nicht viel brauchen, besonders wenn Sie von irgendwo geklont haben. 'current' drückt oder erzeugt-dann-schiebt-zu-homonymen Verzweigungen auf dem Remote-Repo * für Sie *, wenn sie nicht bereits existieren, während' simple' dies ablehnen wird, wenn ein gleichnamiger Zweig nicht existiert bereits. 'upstream' hat in diesem Fall das gleiche Verhalten, es sei denn, ein Upstream-Zweig wurde explizit festgelegt oder anderweitig festgelegt, wie in der Antwort von [Yawar] (http://stackoverflow.com/users/20371) erwähnt. – SeldomNeedy

5

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

upstream wird den aktuellen Zweig in den Upstream-Zweig schieben.

Der Upstream-Zweig ist ein Zweig, der explizit oder implizit als stromaufwärts von Ihrem aktuellen Zweig definiert wurde. Das bedeutet, dass Push und Pull standardmäßig mit diesem Zweig synchronisiert werden. Der Upstream-Zweig kann sich im selben Repo wie der aktuelle Zweig selbst befinden. Sie können interessante Dinge wie einrichten lokalen Master-Zweig als vor Ihrem lokalen Feature (Zweig) Zweig, und schieben und ziehen zwischen ihnen.

Die implizite Upstream-Konfiguration erfolgt über den Konfigurationswert branch.autosetupmerge. Sie finden die Dokumentation auf der Hilfeseite git config.Die explizite Upstream-Einrichtung erfolgt mit der Option -u zum Befehl git branch. Weitere Informationen finden Sie auf der Hilfeseite.