it-swarm.com.de

Warum muss ich die ganze Zeit "--set-upstream" ausführen?

Ich erstelle einen neuen Zweig in Git:

git branch my_branch

Drück es:

git Push Origin my_branch

Angenommen, jemand hat auf dem Server einige Änderungen vorgenommen, und ich möchte von Origin/my_branch abrufen. Ich mache:

git pull

Aber ich bekomme:

You asked me to pull without telling me which branch you
want to merge with, and 'branch.my_branch.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 "my_branch"]
    remote = <nickname>
    merge = <remote-ref>

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

See git-config(1) for details.

Ich habe gelernt, dass ich damit arbeiten kann:

git branch --set-upstream my_branch Origin/my_branch

Aber warum muss ich das für jeden Zweig tun, den ich erstelle? Ist es nicht offensichtlich, dass ich, wenn ich my_branch in Origin/my_branch schiebe, Origin/my_branch in my_branch ziehen möchte? Wie kann ich dies zum Standardverhalten machen?

1300
Ram Rachum

Eine Verknüpfung, die nicht davon abhängt, ob Sie sich die Syntax für git branch --set-upstream merken. 1 ist zu tun:

git Push -u Origin my_branch

... das erste Mal, dass Sie diesen Zweig drücken. Oder, um zum aktuellen Zweig zu einem Zweig mit demselben Namen zu pushen (praktisch für einen Alias):

git Push -u Origin HEAD

Sie müssen -u nur einmal verwenden. Dadurch wird die Zuordnung zwischen Ihrem Zweig und dem Zweig unter Origin auf dieselbe Weise wie bei git branch --set-upstream hergestellt.

Persönlich halte ich es für eine gute Sache, diese Zuordnung zwischen Ihrer Zweigstelle und einer auf der Fernbedienung explizit einrichten zu müssen. Es ist nur eine Schande, dass die Regeln nterschiedlich für git Push und git pull sind.


1 Es mag albern klingen, aber ich vergesse sehr oft, den aktuellen Zweig anzugeben, vorausgesetzt, das ist der Standard - das ist er nicht und die Ergebnisse sind am verwirrendsten :)

Update 11.10.2012 : Anscheinend bin ich nicht die einzige Person, die es leicht fand, sich zu irren! Dank VonC für den Hinweis, dass git 1.8.0 das offensichtlichere git branch --set-upstream-to einführt, das wie folgt verwendet werden kann, wenn Sie sich im Zweig my_branch befinden:

git branch --set-upstream-to Origin/my_branch

... oder mit der kurzen Option:

git branch -u Origin/my_branch

Diese Änderung und ihre Begründung sind in den Versionshinweisen zu Git 1.8.0, Release Candidate 1 beschrieben:

Es war verlockend, git branch --set-upstream Origin/master zu sagen, aber das veranlasst Git, die lokale Verzweigung Origin/master für die Integration in die derzeit ausgecheckte Verzweigung zu arrangieren, was vom Benutzer höchst unwahrscheinlich ist. Die Option ist veraltet. Verwenden Sie stattdessen die neue Option --set-upstream-to (mit einem kurzen und süßen -u).

1408
Mark Longair

Sie können dies mit weniger Tippaufwand erreichen. Ändern Sie zunächst die Funktionsweise Ihres Push:

git config --global Push.default current

Dadurch wird der Teil Origin my_branch abgeleitet, sodass Sie Folgendes tun können:

git Push -u

Dadurch wird der Zweig mit demselben Namen erstellt und nachverfolgt.

1188
Zamith

Sie können einfach

git checkout -b my-branch Origin/whatever

an erster Stelle. Wenn Sie branch.autosetupmerge oder branch.autosetuprebase (mein Favorit) auf always setzen (Standard ist true), verfolgt my-branch automatisch Origin/whatever.

Siehe git help config.

83
cdunn2001

Sie können Upstream auf zwei Arten einfacher einrichten. Zuerst, wenn Sie den Zweig erstellen:

git branch -u Origin/my-branch

oder nachdem Sie eine Verzweigung erstellt haben, können Sie diesen Befehl verwenden.

git Push -u Origin my-branch

Sie können auch in einem einzigen Befehl verzweigen, auschecken und Upstream einrichten:

git checkout -b my-branch -t Origin/my-branch

Ich persönlich bevorzuge es, dies in zwei Schritten zu tun:

git checkout -b my-branch
git Push -u Origin my-branch
73
Tzen

Dies ist meine häufigste Verwendung für The Fuck .

$ git Push
fatal: The current branch master has no upstream branch.
To Push the current branch and set the remote as upstream, use

    git Push --set-upstream Origin master

$ fuck
git Push --set-upstream Origin master [enter/↑/↓/ctrl+c]
Counting objects: 9, done.
...

Außerdem macht es Spaß, Schimpfwörter in Ihr Terminal einzugeben.

58
Tamlyn

Sie können verwenden:

git config --global branch.autosetupmerge immer

dadurch wird der Upstream-Zweig jedes Mal verknüpft, wenn Sie einen neuen Zweig erstellen oder auschecken.

Siehe https://felipec.wordpress.com/2013/09/01/advanced-git-concepts-the-upstream-tracking-branch/

Dies funktioniert auch mit Autosetuprebase, wenn Sie einem rebase-fokussierten Workflow folgen. Verwenden Sie dies jedoch nicht, es sei denn, Sie wissen, was Sie tun, da Ihr Pull-Verhalten standardmäßig rebase wird, was zu seltsamen Ergebnissen führen kann.

41
Daniel

Übrigens die Verknüpfung zum Verschieben des aktuellen Zweigs zu einer Fernbedienung mit demselben Namen:

$ git Push -u Origin HEAD
36
djanowski

Ich persönlich benutze diesen folgenden Alias ​​in Bash

in der Datei ~/.gitconfig

[alias]
    pushup = "!git Push --set-upstream Origin $(git symbolic-ref --short HEAD)"

nd in der Datei ~/.basehrc oder ~/.zshrc

alias gpo="git pushup"
alias gpof="gpo -f"
alias gf="git fetch"
alias gp="git pull"
12
Amrit Shrestha
git branch --set-upstream-to=Origin/master<branch_name>
11
user3693546

Für das, was es wert ist, wenn Sie versuchen, einen Zweig zu verfolgen, der bereits auf der Fernbedienung vorhanden ist (z. B. Origin/Somebranch), ihn aber noch nicht lokal ausgecheckt haben, können Sie Folgendes tun:

$ git checkout --track Origin/somebranch

Hinweis: '-t' ist die verkürzte Version der Option '--track'.

Dies schafft die gleiche Assoziation von Anfang an.

10
mattacular

Ich verwende diesen Git-Alias, anstatt den Vorschlag jedes Mal von Git zu kopieren/einzufügen: https://Gist.github.com/ekilah/88a880c84a50b73bd306

Quelle unten kopiert (fügen Sie dies zu Ihrer ~/.gitconfig -Datei hinzu):

[alias]
  pushup = "!gitbranchname() { git symbolic-ref --short HEAD; }; gitpushupstream() { git Push --set-upstream Origin `gitbranchname`; }; gitpushupstream"
9
manroe

Sie können git pull auch explizit mitteilen, welcher entfernte Zweig gezogen werden soll (wie in der Fehlermeldung erwähnt):

git pull <remote-name> <remote-branch>

Seien Sie jedoch vorsichtig damit: Wenn Sie sich in einem anderen Zweig befinden und einen expliziten Pull ausführen, wird die von Ihnen gezogene Refspezifikation mit dem Zweig zusammengeführt, in dem Sie sich befinden!

9
mtbkrdave

Sie können einen wirklich guten Alias ​​einrichten, der dies ohne die übermäßig ausführliche Syntax handhabt.

Ich habe den folgenden Alias ​​in ~/.gitconfig:

po = "!git Push -u Origin \"$(git rev-parse --abbrev-ref HEAD)\""

Nach dem Festschreiben eines neuen Zweigs können Sie den neuen Zweig durch Eingabe des folgenden Befehls verschieben:

git po
7
123

Wenn das unten nicht funktioniert:

git config --global Push.default current

Sie sollten auch die lokale Konfiguration Ihres Projekts aktualisieren, da Ihr Projekt möglicherweise lokale Git-Konfigurationen hat:

git config --local Push.default current
5
youngrrrr

Für diejenigen, die nach einem Alias ​​suchen, der mit git pull funktioniert, verwende ich Folgendes:

alias up="git branch | awk '/^\\* / { print \$2 }' | xargs -I {} git branch --set-upstream-to=Origin/{} {}"

Jetzt wann immer Sie bekommen:

$ git pull
There is no tracking information for the current branch.
...

Renn einfach:

$ up
Branch my_branch set up to track remote branch my_branch from Origin.
$ git pull

Und du bist gut zu gehen

3
jchavannes

Weil Git die coole Fähigkeit hat, verschiedene Zweige in verschiedene "Upstream" -Repositorys zu pushen/ziehen. Sie können sogar separate Repositorys für Push- und Pull-Vorgänge auf demselben Zweig verwenden. Dies kann einen verteilten, mehrstufigen Fluss erzeugen. Ich kann sehen, dass dies für Projekte wie den Linux-Kernel nützlich ist. Git wurde ursprünglich für dieses Projekt entwickelt.

Infolgedessen wird nicht vorausgesetzt, welches Repo Ihre Filiale verfolgen soll.

Auf der anderen Seite verwenden die meisten Leute Git nicht auf diese Weise, so dass es ein gutes Argument für eine Standardoption sein könnte.

Git ist im Allgemeinen ziemlich leise und kann frustrierend sein. Es gibt jedoch GUIs und es sollte einfach sein, Hilfsskripte zu schreiben, wenn Sie diese weiterhin über die Shell verwenden möchten.

2
Rolf

Sie können auch git Push -u Origin $(current_branch)

2

Wir benutzen phabricator und drücken nicht mit git. Ich musste einen Bash-Alias ​​erstellen, der unter Linux/Mac funktioniert

vim ~/.bash_aliases

new_branch() {
    git checkout -b "$1"
    git branch --set-upstream-to=Origin/master "$1"
}

sparen

source ~/.bash_aliases
new_branch test #instead of git checkout -b test
git pull
0
om471987

Ich habe legit aufgrund dieses Problems neu entdeckt (nur OS X). Jetzt benutze ich beim Verzweigen nur noch diese beiden Befehle:

legit publish [<branch>] Publiziert den angegebenen Zweig auf der Fernbedienung. (Alias: pub)

legit unpublish <branch> Entfernt den angegebenen Zweig von der Fernbedienung. (Alias: unp)

SublimeGit wird standardmäßig mit legit unterstützt, wodurch die gesamte Verzweigungsroutine so einfach ist wie das Drücken von Strg-B.

0
Benny K

Hier ist ein Bash-Alias ​​für Git-Push, der sicher für jeden Push ausgeführt werden kann und automatisch zwischen der Einstellung des Upstreams für den ersten Push und den anschließenden normalen Pushs umschaltet.

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git Push -u Origin $(git symbolic-ref --short HEAD) || git Push'

Originalbeitrag

0
Loren