Warum muss ich einen neuen Zweig explizit pushen?

179

Ich bin neu in gitund ich übe. Ich habe eine lokale Verzweigung erstellt, aber ich habe festgestellt, dass git pushmeine Verzweigung nicht in das Repository hochgeladen wurde. Ich musste eigentlich tun : git push -u origin --all.
Warum ist das? Ist ein Zweig nicht eine neue Änderung, die standardmäßig verschoben werden soll? Warum muss ich den zweiten Befehl ausführen?

Cratylus
quelle
15
Beachten Sie, dass dies konfigurierbar ist (Einstellung push.defaultsiehe man git-config). Wenn Sie dies tun git config --add push.default current, git pushwird bei Bedarf automatisch der Zweig im Remote-Repo erstellt. Warum dies nicht die Standardeinstellung ist, wird in den Antworten erläutert.
Sleske
@sleske Ich stimme zu. Die anderen Richtlinien ' current' und ' upstream' finden Sie in meiner älteren Antwort stackoverflow.com/a/13751847/6309 .
VonC
Warum nicht eine Antwort annehmen?
Laike9m

Antworten:

223

Der eigentliche Grund ist, dass es in einem neuen Repo (git init) keine Verzweigung gibt (nein master, überhaupt keine Verzweigung, keine Verzweigungen)

Wenn Sie also zum ersten Mal auf ein leeres Upstream-Repo (im Allgemeinen ein nacktes ) drängen , hat dieses Upstream-Repo keinen gleichnamigen Zweig.

Und:

In beiden Fällen, da das vorgelagerte leere Repo keine Verzweigung hat:

  • Es gibt noch keinen passenden benannten Zweig
  • Es gibt überhaupt keine vorgelagerte Niederlassung (mit oder ohne gleichen Namen! Tracking oder nicht)

Das heißt, Ihr lokaler erster Push hat keine Ahnung:

  • wo zu schieben
  • was zu pushen ist (da kein Upstream-Zweig gefunden werden kann, der entweder als Remote-Tracking-Zweig aufgezeichnet wurde und / oder denselben Namen hat)

Sie müssen also mindestens Folgendes tun:

git push origin master

Aber wenn Sie nur das tun, werden Sie:

  • erstellt einen Upstream- masterZweig im Upstream (jetzt nicht leeres Repo): gut.
  • wird nicht aufzeichnen, dass der lokale Zweig ' master' nach upstream ( origin) ' master' (vorgelagerter Zweig) verschoben werden muss: schlecht.

Aus diesem Grund wird empfohlen, beim ersten Druck Folgendes zu tun:

git push -u origin master

Das wird aufgezeichnet origin/masterals Remote - Tracking - Zweig , und bei den nächsten Push aktivieren , um automatisch schieben masterzu origin/master.

git checkout master
git push

Und das wird auch mit Push-Richtlinien funktionieren. 'current ' oder ' upstream'.
In jedem Fall reicht nach dem ersten git push -u origin masterSchritt ein einfacher Git-Push aus, um den Master weiter in den rechten Upstream-Zweig zu schieben.

VonC
quelle
2
Nach diesem Punkt git pusherwartet der nächste auch, dass der Zweig bereits existiert?
Cratylus
2
Ja. Alle Aktualisierungen dieses Zweigs werden in das Upstream-Repository übertragen.
RyPeck
@Cratylus ja, aufgrund der neuen Standard-Push-Richtlinie ' simple': Push an einen aufgezeichneten Upstream-Zweig, wenn dieser Upstream-Zweig denselben Namen wie der lokale hat. Ein einfaches git pushwird ausreichen.
VonC
1
@ ButtleButkus Danke. Ich habe den Link wiederhergestellt.
VonC
3
Für den allgemeineren Fall des Fragestellers eines neuen Zweigs 'new_branch' würden Sie git push --set-upstream origin new_branchoder git push -u origin new_branchkurz verwenden. Das -all, was der Fragesteller verwendet hat, hat die Benennung eines bestimmten neuen Zweigs umgangen, indem alle Zweige eingeschlossen wurden. Dies wird von + Klas Mellbourn in seiner Antwort behandelt.
Paul Masri-Stone
106

Sie nicht, siehe unten

Ich finde diese 'Funktion' ziemlich ärgerlich, da ich nicht versuche, Raketen zum Mond zu schießen, sondern nur meinen verdammten Ast schiebe. Sie tun es wahrscheinlich auch, sonst wären Sie nicht hier!

Hier ist das Update: wenn Sie es wollen implizit für den aktuellen Zweig drücken , um unabhängig davon , ob dieser Zweig auf Herkunft existiert nur diesen Befehl einmal und Sie werden nie irgendwo wieder haben:

git config --global push.default current

Wenn Sie also Zweige wie diesen erstellen:

git checkout -b my-new-branch

und dann einige Commits machen und dann a

git push -u

um sie zum Ursprung zu bringen (sich in diesem Zweig zu befinden) und dieser Zweig wird für Sie erstellt, wenn er nicht existiert.

Beachten Sie, dass das Bit -u sicherstellt, dass sie verknüpft sind, wenn Sie später aus diesem Zweig ziehen. Wenn Sie nicht vorhaben, den Zweig später zu ziehen (oder wenn Sie dies mit einem anderen Liner tun), ist dies nicht erforderlich.

John Culviner
quelle
3
Wenn ich das mache, wenn ich einen Git-Pull mache, sind die beiden Zweige unmittelbar danach nicht miteinander verbunden. :(
Alisso
Dies ist die einzige Antwort, die mein Problem behoben hat.
Raymond Chenon
2
Um sie zu verknüpfen, verwenden Siegit push -u
Ben Creasy
Vielen Dank! Diese Antwort sollte als schnelle und "schmutzige" Lösung akzeptiert werden. Ich bin mir ziemlich sicher, dass es der Absicht von OP am nächsten kommt.
youngrrrr
3
> Ich versuche nicht, Raketen zum Mond zu schießen. -- JA.
VCavallo
39

Ausgabe git pushbeim Verschieben eines neuen Zweigs

> git checkout -b new_branch
Switched to a new branch 'new_branch'
> git push
fatal: The current branch new_branch has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin new_branch

Eine einfache git pushAnnahme setzt voraus, dass bereits ein Remote-Zweig vorhanden ist, den der aktuelle lokale Zweig verfolgt. Wenn kein solcher Remote-Zweig vorhanden ist und Sie ihn erstellen möchten, müssen Sie diesen mit dem Flag -u(Kurzform von --set-upstream) angeben .

Warum ist das so? Ich denke, die Implementierer waren der Meinung, dass das Erstellen eines Zweigs auf der Fernbedienung eine so wichtige Aktion ist, dass es schwierig sein sollte, dies versehentlich zu tun. git pushist etwas, was du die ganze Zeit machst.

"Ist ein Zweig nicht eine neue Änderung, die standardmäßig verschoben werden soll?" Ich würde sagen, dass "eine Änderung" in Git ein Commit ist. Ein Zweig ist ein Zeiger auf ein Commit. Für mich ist es sinnvoller, sich einen Push als etwas vorzustellen, das Commits auf die anderen Repositories überträgt. Welche Commits übertragen werden, hängt davon ab, in welchem ​​Zweig Sie sich befinden und in welcher Verfolgungsbeziehung dieser Zweig zu den Zweigen auf der Fernbedienung steht.

Weitere Informationen zum Verfolgen von Zweigen finden Sie im Kapitel Remote-Zweige des Pro Git-Buches .

Klas Mellbourn
quelle
Ich habe keine bekommen, fatalaber ich hatte bereits ein Commit in der Filiale gemacht. Ist das wichtig?
Cratylus
@Catylus nein es spielt keine Rolle. Das Commit ist in Ihrem Repository sicher und wird git push -u originin das Remote-Repository kopiert.
Klas Mellbourn
Nein, ich meine die Tatsache, dass ich keine fatalNachricht wie die in der Antwort erwähnte erhalten habe. Hängt dieser Unterschied von der Tatsache ab, dass ich etwas für die Branche festgelegt habe?
Cratylus
@Catylus Ich weiß nicht, warum du die fatalNachricht nicht bekommen hast . Ich würde vermuten, dass der Unterschied genau davon abhängt, welche Git-Implementierung Sie verwenden. Meine Ausgabe ist von 1.8.1.msysgit.1 unter Windows 8.
Klas Mellbourn
Ich habe die gleiche Version, aber auf Vista
Cratylus
4

Ich konnte so schnell keine Begründung von den ursprünglichen Entwicklern finden, aber ich kann Ihnen eine fundierte Vermutung geben, die auf einigen Jahren Git-Erfahrung basiert.

Nein, nicht jeder Zweig ist etwas, das Sie nach außen drängen möchten. Es könnte ein privates Experiment darstellen.

Wohin sollen außerdem git pushalle Filialen geschickt werden? Git kann mit mehreren Fernbedienungen arbeiten und Sie möchten möglicherweise unterschiedliche Zweige auf jedem haben. Beispielsweise kann ein zentrales GitHub-Repo-Projekt Release-Zweige haben. Eine GitHub-Gabel kann Themenzweige zur Überprüfung haben. und ein lokaler Git-Server kann Zweige haben, die lokale Konfiguration enthalten. Wenn git pushalle Zweige auf die Fernbedienung geschoben würden, die der aktuelle Zweig verfolgt, wäre diese Art von Schema leicht zu vermasseln.

Fred Foo
quelle
1) It might represent a private experimentOkay, aber was ist die große Sache? Der "Haupt" -Zweig, in dem alle arbeiten, ist also masternicht betroffen. Es sei denn, Sie wollen den Quellcode versteckt halten 2) git push, without a remote, pushes to the current branch's remoteIch habe Sie hier verloren :(
Cratylus
@Cratylus: 1) In einem Projekt mit Dutzenden von Entwicklern, die alle nach Belieben verzweigen, werden Sie sehr unordentliche Repos bekommen. Ich arbeite an solchen Projekten und möchte nicht git fetchjedes Mal Hunderte von halbarbeitenden Filialen besuchen. 2) Ich beziehe mich auf git pushdas Standardverhalten. Es wird an die Fernbedienung gesendet, dass der aktuelle Zweig gegebenenfalls verfolgt wird.
Fred Foo
3

HEAD ist die Abkürzung für Current Branch, daher funktioniert Git Push -u Origin HEAD. Um diese Eingabe jedes Mal zu vermeiden, wenn ich einen Alias ​​verwende:

git config --global alias.pp 'push -u origin HEAD'

Danach kann ich jedes Mal, wenn ich einen über git -b branch erstellten Zweig pushen möchte, ihn pushen mit:

git pp

Hoffe das spart Zeit für jemanden!

Aurimas Rekštys
quelle
2

Bei der ersten Überprüfung

Schritt 1: git remote -v
// Wenn git initialisiert gefunden wird, entfernen oder überspringen Sie Schritt 2

Schritt 2: git remote rm origin
// Dann konfiguriere deine E-Mail-Adresse global git

Schritt 3: git config --global user.email "[email protected]"

Schritt 4: git initial

Schritt 5: git commit -m "Initial Project"
// Wenn Sie bereits ein Projekt-Repo hinzugefügt haben, überspringen Sie Schritt 6

Schritt 6: git remote add origin %repo link from bitbucket.org%

Schritt 7: git push -u origin master

Md.Milton
quelle
1

Ich habe gerade eine weitere Permutation dieses Themas erlebt.

Ich hatte einen Zweig mit dem Namen, feat/XYZ-1234-some-descriptionweil ich an der Jira-Ausgabe 1234 arbeitete. Während der Arbeit erstellte ich eine neue Jira-Ausgabe, um eine kleinere Arbeit zu verfolgen, und als ich zu Push kam, entschied ich mich, zu einem Zweigstellennamen mit dieser neuen Ausgabenummer zu wechseln im:

git push -u origin feat/XYZ-5678-a-different-description # failed

Dies gab mir den Fehler, der in diesem SO-Thread diskutiert wurde. Da ich jedoch versucht habe, auf einen anderen Zweigstellennamen als meinen aktuellen Zweig zu wechseln, war mein Problem anders als das hier beschriebene. Am Ende habe ich meine lokale Niederlassung umbenannt, bevor ich sie pushen konnte:

git branch -m feat/XYZ-1234-some-description feat/XYZ-5678-a-different-description
git push -u origin feat/XYZ-5678-a-different-description # now works

Nach etwas mehr lesen um erkannte ich, dass ich einen Satz hätte srcauf die git pushentweder auf den aktuellen Zweignamen, oder einfach nur HEADfalls:

git push -u origin feat/XYZ-1234-some-description:feat/XYZ-5678-a-different-description # also works
Mark Birbeck
quelle
-1

Wenn Sie aktivieren, dass beim ersten Mal neue Änderungen aus Ihrem neuen Zweig übertragen werden. Und unter Fehler:

*git push -f
fatal: The current branch Coding_Preparation has no upstream branch.

Verwenden Sie, um den aktuellen Zweig zu pushen und die Fernbedienung als Upstream einzustellen

git push -u origin new_branch_name


** Successful Result:** 
 git push -u origin Coding_Preparation
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 599 bytes | 599.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'Coding_Preparation' on GitHub by visiting: ...
 * [new branch]      Coding_Preparation -> Coding_Preparation
Branch 'Coding_Preparation' set up to track remote branch 'Coding_Preparation' from 'origin'.
Mukesh Kumar
quelle