Was genau macht das "u"? "Git Push -u Origin Master" vs "Git Push Origin Master"

333

Ich bin anscheinend schrecklich darin, Git zu benutzen, trotz meiner besten Versuche, es zu verstehen.

Von kernel.org für git push:

-u

--set-upstream

Fügen Sie für jeden Zweig, der auf dem neuesten Stand ist oder erfolgreich gepusht wurde, eine Upstream-Referenz (Tracking-Referenz) hinzu, die von git-pull (1) ohne Argumente und anderen Befehlen verwendet wird. Weitere Informationen finden Sie branch.<name>.mergein git-config (1).

Hier ist branch.<name>.mergevon git config:

branch.<name>.merge

Definiert zusammen mit branch.<name>.remotedem Upstream-Zweig für den angegebenen Zweig. Es teilt git fetch / git pull mit, welcher Zweig zusammengeführt werden soll, und kann auch git push beeinflussen (siehe push.default). In der Verzweigung <name>teilt es git fetch mit, dass die Standardreferenzspezifikation zum Zusammenführen in FETCH_HEAD markiert werden soll. Der Wert wird wie der entfernte Teil einer Referenzspezifikation behandelt und muss mit einer Referenz übereinstimmen, die von der von angegebenen angegebenen Fernbedienung abgerufen wird "branch.<name>.remote". Die Zusammenführungsinformationen werden von git pull (das zuerst git fetch aufruft) verwendet, um den Standardzweig für das Zusammenführen zu suchen. Ohne diese Option wird bei git pull standardmäßig die erste abgerufene Referenzspezifikation zusammengeführt. Geben Sie mehrere Werte an, um eine Octopus-Zusammenführung zu erhalten. Wenn Sie git pull so einrichten möchten, dass es <name>von einem anderen Zweig im lokalen Repository zusammengeführt wird, können Sie darauf verweisenbranch.<name>.mergezum gewünschten Zweig und verwenden Sie die spezielle Einstellung. (eine Periode) für branch.<name>.remote.

Ich habe erfolgreich ein Remote-Repository mit github eingerichtet und mein erstes Commit erfolgreich durchgeführt mit:

git push -u origin master

Dann habe ich mein zweites Commit unwissentlich erfolgreich in mein Remote-Repository übertragen, indem ich:

git commit -m '[...]'

Da ich jedoch fälschlicherweise dachte, ich müsste noch einmal originvon drängen master, rannte ich:

# note: no -u
git push origin master

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

ClosureCowboy
quelle
43
I'm apparently terrible at using git, despite my best attempts to understand it.- Ich hatte noch nie jemanden, der mich so gut nachgebildet hat.
dgo

Antworten:

335

Der Schlüssel ist "argumentloses Git-Pull". Wenn Sie eine git pullvon einem Zweig aus ausführen, ohne eine Quellfernbedienung oder einen Zweig anzugeben, überprüft git die branch.<name>.mergeEinstellung, um zu wissen, woher sie ziehen soll. git push -uLegt diese Informationen für den Zweig fest, den Sie verschieben.

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

$ git checkout -b test

Zuerst drücken wir 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.

Nun, wenn wir 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 eingerichtet wurden, dass sie git pullwie erwartet funktionieren, ohne die Fernbedienung oder den Zweig anzugeben.

Update: Bonus-Tipps:

  • Wie Mark in einem Kommentar erwähnt, git pullwirkt sich zusätzlich zu dieser Einstellung auch das Standardverhalten von aus git push. Wenn Sie es sich zur Gewohnheit machen -u, den zu verfolgenden Remote-Zweig zu erfassen, empfehle ich, den push.defaultKonfigurationswert auf zu setzen upstream.
  • git push -u <remote> HEADschiebt den aktuellen Zweig auf einen Zweig mit demselben Namen auf <remote>(und richtet auch das Tracking ein, damit Sie es danach tun können git push).
Dahlbyk
quelle
4
git push <remote> <branch>macht die Dinge eindeutig . Wenn Sie die Fernbedienung oder die Zweigstelle auslassen, greift Git auf die Zweigstellenkonfigurationseinstellungen zurück, die für Sie festgelegt wurden git push -u.
Dahlbyk
2
@dahlbyk Ich habe dich als Antwort markiert, aber dieser Kommentar verwirrt mich etwas. In deiner Antwort hast du gezeigt, dass Git danach verwirrt war git push origin test(was nicht der Fall ist -u). Sie haben dann gezeigt, dass die Mehrdeutigkeit git push -u origin test beseitigt wird . Gibt es einen Tippfehler oder bin ich nur wieder dicht?
ClosureCowboy
1
Ich denke, wir reden aneinander vorbei. :) Wenn ich sage, dass git push <remote> <branch>es eindeutig ist, meine ich das, was relativ zur git pushZweigkonfiguration hängt. Ebenso git pull <remote> <branch>ist eindeutig und git pullstützt sich auf die Zweigkonfiguration. Sobald Sie mit gedrückt haben -u, funktionieren beide git pushund git pullwie erwartet.
Dahlbyk
10
@dahlbyk: Ihre Antwort ist in Ordnung, aber in Ihren obigen Kommentaren wiederholen Sie ein häufiges Missverständnis darüber git push- es sei denn, Sie stellen sich push.defaultselbst ein, verwendet git pushnur die Konfiguration des Upstream-Zweigs, um zu entscheiden, auf welche Fernbedienung übertragen werden soll, nicht die zu aktualisierende Fernzweigstelle.
Mark Longair
1
Die beste Praxis für Git ist git push origin masterund das gleiche für andere Seite IE. git pull origin master.. Also wenn Zweigzweigwechsel dann können Sie git push origin branch_nameund das gleiche auf andere Seite IE. git pull origin branch_name
Arpit Vaishnav
87
git push -u origin master

… ist das gleiche wie:

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

Mach die letzte Aussage, wenn du das vergisst -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 dies für Sie tun lassen, werden Ihre Fehler ausgewählt, z. B. wenn Sie einen nicht vorhandenen Zweig eingegeben haben oder nicht git remote add. obwohl das sein könnte, was Sie wollen. :) :)

Sabgenton
quelle
1
Übrigens masterist nur ein Beispiel :)
Sabgenton
Ok, das zweite Bit wird jetzt in neueren Versionen abgeschrieben für: git branch master -u origin/masterdetails @ stackoverflow.com/a/2286030/790359
sabgenton
2
Wenn Sie vergessen, die -uOption zu verwenden, geben Sie git push -usofort OK ein.
Zeekvfu
1
Neuere Versionen von Git weisen darauf hin, dass --setup-upstreamdies veraltet sein wird: The --set-upstream flag is deprecated and will be removed. Consider using --track or --set-upstream-to
Bill Hoag
- Set-Upstream ist veraltet, jetzt funktioniert es:git branch --set-upstream-to=origin/master master
Alberto Perez
43

Einfacher ausgedrückt:

Technisch gesehen -ufügt das Flag einen Tracking-Verweis auf den Upstream-Server hinzu, auf den Sie pushen.

Was hier wichtig ist, ist, dass Sie dies tun können, git pullohne weitere Argumente anzugeben. Wenn Sie beispielsweise einmal eine Aktion ausgeführt haben git push -u origin master, können Sie später anrufen, git pullund Git weiß, dass Sie dies tatsächlich gemeint haben git pull origin master.

Andernfalls müssten Sie den gesamten Befehl eingeben.

Adépòjù Olúwáségun
quelle
1
Wenn ich also -ubei orgin masterjedem nächsten Zug das Flag setze , wird darauf verwiesen. Und wenn ich das git pullVerhalten ändern möchte, sollte ich ausführen git push -u origin some_other_branchund werde git pulljetzt darauf verweisen some_other_branch? Vielen Dank!
Toma Tomov
1
Können wir auch "Git Push" anstelle von "Git Push Origin Master" verwenden?
Cegprakash
Ja, Sie können @cegprakash. Allerdings hätten Sie zunächst einegit push -u origin master
Adépòjù Olúwáségun
-11

Alle notwendigen Git-Bash-Befehle zum Drücken und Ziehen 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 möchten, gehen Sie wie folgt vor:

edit filename.* 

So sehen Sie alle Filialen und ihre Commits:

git show-branch
Kamta Mishra
quelle
4
Ich denke, Sie haben aus dem Rahmen der Frage heraus geantwortet.
Adépòjù Olúwáségun