Wie kann man nur den aktuellen Zweig ziehen?

81

Gibt es eine Konfigurationsmöglichkeit, um dies einzurichten, ohne angeben zu müssen, welcher Zweig?

Qodeninja
quelle

Antworten:

82

Git zieht bereits nur den aktuellen Zweig. Wenn Sie einen Zweig als Tracking-Zweig eingerichtet haben, müssen Sie den Remote-Zweig nicht angeben. git branch --set-upstream localbranch reponame/remotebranchrichtet die Tracking-Beziehung ein. Sie geben dann aus git pull [--rebase]und nur dieser Zweig wird aktualisiert.

Natürlich werden alle Fernverfolgungszweige und alle Refs für die Fernbedienung aktualisiert, aber nur Ihr lokaler Verfolgungszweig wird geändert.

Nützlicher Bash-Alias, um die Eingabe dieser allgemeinen Operation zu reduzieren:

# Add an alias to pulling latest git changes into your same branch
alias pullhead='git pull origin $(git rev-parse --abbrev-ref HEAD)'

Powershell-Funktion, die dasselbe tut:

Function pullhead {
    $cur_head="$(git rev-parse --abbrev-ref HEAD)"
    & git pull origin ${cur_head}
}
Seth Robertson
quelle
das richtig und vielleicht ein bisschen seltsam, weil "git push" (standardmäßig) versucht, alle Zweige (mit demselben Remote-Namen) zu pushen.
Alessandro De Simone
2
@AlessandroDs Nun, genau aus diesem Grund habe ich push.default auf Upstream gesetzt. Die neue Standardeinstellung für push.default ist "einfach", wodurch wiederum nur der aktuelle Zweig aktualisiert wird.
Seth Robertson
1
@Danjah: Alle Änderungen werden aus dem Remote-Repo abgerufen (in Remote-Tracking-Zweige, z. B. origin / master origin / foo usw.). Wenn Sie in einen lokalen Zweig mit einem definierten Upstream ausgecheckt werden, wird nur dieser lokale Zweig aktualisiert. Wenn Sie in einen lokalen Zweig ohne Upstream ausgecheckt sind, müssen Sie weitere Informationen angeben oder den Upstream festlegen. Versuchen Sie nicht, eine nicht lokale Kasse zu ändern, erstellen Sie eine lokale Verzweigung und fahren Sie fort. Wenn Sie die Übertragung reduzieren möchten, können Sie die Referenzspezifikation Ihrer Fernbedienung in Ihrer lokalen Git-Konfiguration aktualisieren.
Seth Robertson
1
Gibt es eine integrierte Möglichkeit, nicht alle Refs zu aktualisieren, sondern nur den aktuellen Zweig abzurufen?
Aditya MP
1
@aditya menon: Nicht einfach. Sie müssten die Referenzspezifikation (z. B. git config remote.origin.fetch) aktualisieren, um nur die gewünschten Refs (Zweige, Tags usw.) abzurufen. Weitere Beispiele finden Sie unter stackoverflow.com/questions/15507264/… .
Seth Robertson
61

Ich habe es einfach so gemacht:

git pull origin "$(git branch | grep -E '^\* ' | sed 's/^\* //g')"

oder

git pull origin $(git rev-parse --abbrev-ref HEAD)

Dadurch wird der aktuelle Zweig extrahiert git branchund dieser Zweig vom entfernten Ursprung abgerufen.

Beachten Sie, dass, wie Seth Robertson sagte, wenn keine Argumente angegeben werden, nur der aktuelle Zweig geändert wird, aber alle entfernten Zweige abgerufen werden. Ich möchte nicht alle entfernten Zweige abrufen, also habe ich es so gemacht.

Ayke
quelle
3
git branchsollte nicht wirklich nach Brancheninformationen analysiert werden. Diese Informationen sind mit git rev-parsedem Befehl verfügbar :git pull origin $(git rev-parse --abbrev-ref HEAD)
Paul DelRe
@ayke Ich habe Paul DelRe Antwort zu Ihrer hinzugefügt, da es auch funktioniert hat. Ich hoffe, es macht Ihnen beiden nichts aus
Timo Huovinen
1
Nur neugierig: Was ist der Unterschied zwischen einem einfachen "Git Pull" (nachdem ich den Zweig überprüft habe, den ich ziehen möchte) und Ihrem Vorschlag? Ihre Befehlsersetzung führt dazu, git pull origin <current-branch>was sowieso die Standardeinstellung ist, nicht wahr? Bedeuten Sie, dass die anderen Remote-Zweige (z. B. Ursprung / anderer Zweig usw.) nicht aktualisiert werden, sodass der Datenverkehr reduziert wird?
Peter - Monica
Ich habe das vor Ewigkeiten beantwortet, ich weiß es nicht mehr wirklich. Sie sollten wahrscheinlich mit der akzeptierten Antwort gehen ...
Ayke
@ PeterA.Schneider Wenn Sie nur tippen, erhalten git pullSie möglicherweise eine Nachricht wie There is no tracking information for the current branch. Please specify which branch you want to merge with.. Dann tippt man immer git pull origin my-feature-branch. Ich würde wirklich gerne wissen, wie diese Situation eintrifft, dass es keine Tracking-Informationen gibt.
Alfe
18

AKTUALISIEREN

Die alte Antwort, die ich hinzugefügt habe, funktioniert nicht mehr: /. Aber nachdem ich einige positive Stimmen über die von mir platzierte PUSH-Version erhalten habe, bedeutet dies für mich, dass diese Antwort tatsächlich jemandem hilft, der von Suchmaschinen hierher kommt, also werde ich diese Antwort behalten.

Versuchen Sie dies für die neue Version von git:

$ git config --global push.default current
Bruno Casali
quelle
9
Ich glaube nicht, dass pull.default existiert. Siehe git-scm oder kernel.org .
Mort
2
Ja. Git 2.3.4 unter Linux holt alle Zweige auch mit den oben genannten pull.default=current. Ich sehe, dass meine git clonestandardmäßig auch hinzugefügt wurde, remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*aber das ist ziemlich Standard.
Mort
6
Es gibt keine pull.defaultKonfigurationsvariable. Wenn Sie das in Ihre Git-Konfiguration einfügen, wird dies nichts bewirken.
David Sanders
5
Bei der Frage geht es um Git Pull, und die Antwort enthält Git Push mit vielen positiven Stimmen. Dies ist irreführend @BrunoCasali Warum haben Sie Ihre Antwort bearbeitet und entfernt, wenn es für Sie funktioniert hat? Wenn Sie feststellen, dass die Antwort falsch ist, löschen Sie sie bitte, anstatt sie mit irrelevanten Informationen zu versehen, um die positiven Stimmen zu erhalten.
TJ
5

Ja, es gibt eine Konfiguration, die geändert werden kann .gitconfig, zum Beispiel:

[push]
  default = current

Dies würde den aktuellen Zweig dazu bringen, einen Zweig mit demselben Namen auf der Empfangsseite zu aktualisieren.

Überprüfen Sie durch:

git config --global --get push.default

Siehe: git-config .

Kenorb
quelle
3

Das --set-upstreamFlag ist veraltet und wird entfernt. Verwenden Sie daher --trackoder--set-upstream-to

Beispiel: Wenn Sie Tracking-Informationen für diesen Zweig festlegen möchten, können Sie dies tun mit:

git branch --set-upstream-to=<remote>/<branch> develop
biniam
quelle
Es ist möglicherweise veraltet (Quelle?), --set-upstream-to=Wird aber von git immer wieder erwähnt, wenn es nichts über Ihre Tracking-Informationen weiß. Ohne Erwähnung der Abschreibung.
Adrien
@AdrienGiboire Hier sind einige Informationen über die Abwertung: jira.atlassian.com/browse/SRCTREEWIN-588
biniam
0

Hier ist ein Git-Alias, der nicht davon ausgeht, dass sich die Fernbedienung befindet, originund behandelt, wenn der Zweig keine Fernbedienung verfolgt.

pullh = "!f() { set -e; set -o pipefail; arr=($(git rev-parse --abbrev-ref @{u} | sed 's/\\//\\n/')); git pull ${arr[0]} ${arr[1]}; }; f"

(Haftungsausschluss: Ich bin ein Bash-Neuling und das oben Genannte könnte wahrscheinlich stark vereinfacht werden.)

scobi
quelle