2012-12-06 18 views
23

ich den git Mann über Push-Befehl gelesen, aber ich verstehe immer noch nicht den genauen Unterschied zwischen aktuellen und Upstream im Push eingestellt werden. Standardgit - Push-Strom-Push-Upstream (Tracking)

Ich möchte, dass unser Team nur drücken, und nur Änderungen an der Branche, an der sie gerade arbeiten, wird geschoben werden. Wie ich verstehe, ist dieser Zweig der, der mit * (Stern) markiert ist, wenn ich git Zweig mache.

Vielen Dank für Ihre Hilfe.

Antwort

38

Die Frage ist was Sie drängen, und , wo:

  • current:

    • "was" ist nur Ihr aktueller Zweig (keine andere Verzweigungen),
    • "wo "ist ein Zweig mit dem gleichen Namen (erstellt, wenn es nicht existiert) in upstream repo.
  • upstream:

    • "was" auch nur der aktuelle Zweig ist,
    • ", wo" ist, was auch immer Zweig (nicht unbedingt mit dem gleichen Namen) auf dem Upstream-Repo has been assigned as an upstream branch für die lokale Niederlassung drücken Sie.

Als explained here, Git2.0 wird zusätzlich einen neuen Standard für push.default vorstellen: simple

simple ist wie upstream, aber der Upstream hat den gleichen Namen hat, wie gut oder der Push wird fehlschlagen.


nur ein Zweig Pushing (mit dem Modus „simple“, „current“ oder „upstream‚) vermeidet the scenario wo alle passenden Zweige gedrückt werden (Modus‘matching“, die der Standard für eine lange Zeit) , auch wenn einige Ihrer Filialen möglicherweise nicht bereit sind, um sie zu pushen.

(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. 

Der Unterschied zwischen den beiden (current und upstream) im Pull (was von der Fernbedienung, um Ihre Niederlassung zu ziehen?):

  • "current" Schieben bedeutet nicht, dass Ihr aktueller Zweig B hat remote/B hat seinen Upstream-Zweig.
    Ie: branch.B.merge wird nicht gesetzt, wenn Sie den Zweig "current" drücken.
    Dh: wenn man an B zieht, weiß git nicht, welcher Zweig zu ziehen ist.

  • pushen "upstream" bedeutet, dass Ihr aktueller Zweig B hat remote/B hat seinen Upstream-Zweig.
    Ie: branch.B.mergeist eingestellt, wenn Sie den Zweig "upstream" drücken.
    Dh: wenn zu B ziehen, git weiß, welchen Zweig (wie auch die Remote-Repo: branch.B.remote) zu ziehen

+0

'push.default' hat keinen Einfluss auf' pull'! - Richtig wäre zu sagen, dass die Konfiguration eines Upstream-Zweiges einen Einfluss darauf hat, was gezogen wird. Aber beides (upstream und push.default) sind zwei verschiedene Dinge. –

2

push.default ist am besten in der Manpage von git Config bedeckt (man git config).

Um den Unterschied zwischen „stromaufwärts“ und „Strom“ für push.default verstehen Sie den Begriff Upstream wissen sollten:

Upstream ist ein lokaler Zeiger von einer normalen lokalen Niederlassung zu einem lokalen Fernverfolgung Zweig. (Ja, sind alle diese lokal.) Beispiele:

  • Zweig blabla hat origin/blabla als Upstream-konfiguriert (sehr häufig)
  • Zweig blabla hat origin/foo als stromaufwärts (Zweig hat einen anderen lokalen Namen, nicht so häufig)
  • Zweig blabla hat Ursprungs2/foo als Upstream

Beachten Sie, dass Ursprung/* Verzweigungen sind lokal und (neu) bei jedem Abruf vom Ursprung festgelegt. Diese werden als "lokale Remote-Tracking-Zweige" bezeichnet. Sie repräsentieren den Zustand der Zweige auf dem entfernten "Ursprung" zum Zeitpunkt des letzten Abrufs.

Für jeden (normalen) lokalen Zweig kann ein Upstream konfiguriert sein, aber das ist kein Muss: Die Konfiguration einer Upstream-Beziehung dient nur der Bequemlichkeit einiger git-Befehle!

Wenn Sie zum Beispiel ein git status machen, sagt Git Ihnen "x commits behind/ahead", wenn es den Upstream kennt (also kann git damit vergleichen).

Eine normale initiale git checkout blabla richtet normalerweise die Upstream-Konfiguration für Sie ein (wenn Herkunft/blabla vorhanden ist, wird sie ausgecheckt und als Upstream eingerichtet - andernfalls schlägt der Checkout fehl).

git push kann auch die Upstream-Konfiguration eines Zweiges verwenden, d. H., Um Ihre neuen Commits in den Remote-Zweig zu kopieren, der den Upstream darstellt. (Dies ist push.default = upstream.)

push.default = current lässt ein git push die neuen Commits über an den Remote-unter dem gleichen Namen kopieren. Es ignoriert die Upstream-Konfiguration vollständig. - Wenn Ihr lokaler Zweigname immer derselbe ist wie der entfernte Zweig, haben beide Konfigurationen den gleichen Effekt, außer dass git push mit push.default = upstream fehlschlägt, wenn der Upstream noch nicht konfiguriert ist.

PD: Ja, * in der Ausgabe von git branch zeigt den aktuellen Zweig.