457 Stimmen

Was genau bewirkt das "u"? "git push -u origin master" vs. "git push origin master"

Ich bin offensichtlich schrecklich im Umgang mit Git, trotz meiner besten Versuche, es zu verstehen.

Von kernel.org para git push :

-u

--set-upstream

Fügen Sie für jeden Zweig, der aktuell ist oder erfolgreich gepusht wurde, eine Upstream-Referenz (Tracking) hinzu, die von dem argumentlosen git-pull(1) und anderen Befehlen verwendet wird. Für weitere Informationen, siehe branch.<name>.merge in git-config(1).

Hier ist branch.<name>.merge von git config :

branch.<name>.merge

Definiert, zusammen mit branch.<name>.remote den Upstream-Zweig für den angegebenen Zweig. Er teilt git fetch/git pull mit, welcher Zweig zusammengeführt werden soll und kann auch git push beeinflussen (siehe push.default). Wenn im Branch <name> wird git fetch mitgeteilt, dass die Standard-Refspec zum Zusammenführen in FETCH_HEAD markiert werden soll. Der Wert wird wie der entfernte Teil einer refspec gehandhabt und muss mit einer ref übereinstimmen, die aus der entfernten Datei geholt wird, die durch "branch.<name>.remote" . Die Merge-Informationen werden von git pull (das zunächst git fetch aufruft) verwendet, um den Standardzweig für das Zusammenführen zu ermitteln. Ohne diese Option fügt git pull standardmäßig die erste geholte Refspec zusammen. Geben Sie mehrere Werte an, um ein Octopus-Merge zu erhalten. Wenn Sie git pull so einstellen möchten, dass es in <name> aus einem anderen Zweig des lokalen Repositorys, können Sie auf branch.<name>.merge auf die gewünschte Verzweigung, und verwenden Sie die spezielle Einstellung . (ein Punkt) für branch.<name>.remote .

Ich habe erfolgreich ein Remote-Repository mit Github eingerichtet und meinen ersten Commit erfolgreich dorthin verschoben:

git push -u origin master

Dann habe ich unwissentlich erfolgreich meine zweite Übergabe an mein entferntes Repository mit:

git commit -m '[...]'

Allerdings dachte ich fälschlicherweise, ich müsste noch einmal drücken, um origin von master rannte ich:

# note: no -u
git push origin master

Was hat das bewirkt? Es schien überhaupt keine Wirkung zu haben. Habe ich "rückgängig" gemacht git push -u origin master ?

434voto

dahlbyk Punkte 71222

Der Schlüssel ist "argumentloses git-pull". Wenn Sie einen git pull von einem Zweig zu starten, ohne eine entfernte Quelle oder einen Zweig anzugeben, schaut sich git die branch.<name>.merge Einstellung, um zu wissen, woher man sie nehmen kann. git push -u setzt diese Informationen für den Zweig, den Sie verschieben.

Um den Unterschied zu sehen, verwenden wir einen neuen leeren Zweig:

$ git checkout -b test

Erstens, wir schieben ohne -u :

$ git push origin test
$ git pull
You asked me to pull without telling me which branch you
want to merge with, and 'branch.test.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "test"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

Wenn wir nun hinzufügen -u :

$ git push -u origin test
Branch test set up to track remote branch test from origin.
Everything up-to-date
$ git pull
Already up-to-date.

Beachten Sie, dass die Tracking-Informationen so eingestellt sind, dass git pull funktioniert wie erwartet, ohne dass der entfernte Standort oder der Zweig angegeben wird.

Aktualisierung: Bonus-Tipps:

  • Wie Mark in einem Kommentar erwähnt, sind zusätzlich zu den git pull diese Einstellung beeinflusst auch das Standardverhalten von git push . Wenn Sie es sich zur Gewohnheit machen, die -u um den entfernten Zweig, den Sie verfolgen wollen, zu erfassen, empfehle ich, Ihre push.default Konfigurationswert auf upstream .
  • git push -u <remote> HEAD verschiebt den aktuellen Zweig zu einem Zweig mit demselben Namen auf <remote> (und auch die Nachverfolgung einrichten, damit Sie git push danach).

120voto

sabgenton Punkte 1663
git push -u origin master

ist dasselbe wie:

git push origin master ; git branch --set-upstream master origin/master

Machen Sie die letzte Anweisung, wenn Sie die -u ¡!

Oder Sie könnten es erzwingen:

git config branch.master.remote origin
git config branch.master.merge refs/heads/master

Wenn Sie den Befehl für sich arbeiten lassen, wird er Ihre Fehler erkennen, z. B. wenn Sie einen nicht existierenden Zweig eingegeben haben oder wenn Sie nicht git remote add obwohl das vielleicht genau das ist, was Sie wollen :)

93voto

Einfacher ausgedrückt:

Technisch gesehen, ist die -u fügt einen Tracking-Verweis auf den Upstream-Server hinzu, auf den Sie pushen.

Wichtig ist dabei, dass Sie damit eine git pull ohne weitere Argumente anzugeben. Zum Beispiel, wenn Sie eine git push -u origin master können Sie später aufrufen git pull und git wird wissen, dass Sie eigentlich gemeint haben git pull origin master .

Andernfalls müssten Sie den gesamten Befehl eintippen.

-18voto

Kamta Mishra Punkte 45

Alle notwendigen Git-Bash-Befehle für Push und Pull in Github:

git status 
git pull
git add filefullpath

git commit -m "comments for checkin file" 
git push origin branch/master
git remote -v 
git log -2 

Wenn Sie eine Datei bearbeiten wollen, dann:

edit filename.* 

Um alle Zweige und ihre Übertragungen zu sehen:

git show-branch

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X