400 Stimmen

Wie kann man "git pull" ausführen, ohne den Branch zu wechseln (git checkout)?

Ich bin es gewohnt, git pull und andere Befehle innerhalb eines Branches auszuführen, an dem ich arbeite. Aber ich habe einen Entwicklungsserver eingerichtet, an dem mehrere Personen arbeiten, daher möchte ich nicht den Branch wechseln müssen, wenn ich das mache.

Wenn ich einen vorhandenen Branch auf dem Entwicklungsserver aus dem Github-Repository aktualisieren möchte, das wir alle verwenden, wie sollte ich das richtig machen?

Wenn ich den Befehl git pull github branchname ausführe, wird der branch einfach in den aktuellen branch übernommen?

All die Git-Beispiele, die ich finden kann, deuten darauf hin, dass man zuerst checkout branchname ausführen soll und dann den pull machen soll. Das versuche ich zu vermeiden. Wie gesagt, dies ist ein vorhandener branch und ich möchte einfach auf die neueste Version aktualisieren.

542voto

koral Punkte 4120

Ich suchte nach demselben und fand schließlich die Antwort, die für mich in einem anderen Beitrag auf Stackoverflow funktionierte: Branches in Git zusammenführen, aktualisieren und pullen, ohne Checkouts zu verwenden

Grundlegend:

git fetch  :

Beispiel:

git fetch origin branchname:branchname

222voto

Ich hatte genau das gleiche Problem mit der Notwendigkeit, aktuelle Feature-Änderungen zu commiten oder zu verwerfen, den master branch auszuchecken, den Befehl pull auszuführen, um alles vom Remote in den lokalen master workspace zu bekommen, dann wieder zu einem Feature-Branch zu wechseln und ein rebase durchzuführen, um es mit dem master up-to-date zu halten.

Um das alles zu erledigen, den Workspace auf dem Feature-Branch zu belassen und alle Wechsel zu vermeiden, mache ich Folgendes:

git fetch origin master:master

git rebase master

Und das erledigt die Sache sehr schön.

5voto

Piyush Punkte 1060

Ich habe folgenden Befehl verwendet, um den Ursprungszweig auf den lokalen Zweig ohne Checkout zu aktualisieren. git fetch origin [BranchName]:[BranchName]

1voto

torek Punkte 381305

Wenn Sie möchten, dass die Spitzen des lokalen Zweigs nach git fetch neu ausgerichtet werden, sind einige zusätzliche Schritte erforderlich.

Genauer gesagt, angenommen, das GitHub-Repository hat die Branches D, B, C und master (der Grund für diesen ungewöhnlichen Branch-Namen wird in einem Moment klar). Sie befinden sich auf dem Host devhost und befinden sich in einem Repository, in dem origin das GitHub-Repository ist. Sie führen git fetch aus, das alle Objekte mitbringt und origin/D, origin/B, origin/C und origin/master aktualisiert. Bisher so gut. Aber was möchten Sie nun, dass auf devhost mit den lokalen Branches D, B, C und/oder master passiert?

Ich habe diese offensichtlich (in meinen Augen) Fragen:

  1. Warum möchten Sie, dass die Spitzen aller Branches aktualisiert werden?
  2. Was ist, wenn ein Branch (z. B. B) Commits enthält, die im entfernten (GitHub-)Repository fehlen? Sollten sie gemergt, rebased oder ... werden?
  3. Was ist, wenn Sie sich auf einem Branch befinden (z. B. C) und das Arbeitsverzeichnis und/oder der Index modifiziert, aber nicht committet sind?
  4. Was ist, wenn dem entfernten Repository neue Branches hinzugefügt werden (A) und/oder Branches gelöscht werden (D)?

Wenn die Antwort auf (1) lautet "weil devhost eigentlich nicht für die Entwicklung gedacht ist, sondern vielmehr ein lokaler Spiegel ist, der einfach eine lokal verfügbare Kopie des GitHub-Repositorys aufbewahrt, damit alle unsere tatsächlichen Entwickler schnell davon lesen können, anstatt langsam von GitHub zu lesen", dann möchten Sie einen "Spiegel" anstelle eines "normalen" Repositories. Es sollte kein Arbeitsverzeichnis haben und möglicherweise auch keine Pushes akzeptieren, in diesem Fall erledigen sich die restlichen Fragen einfach.

Wenn es eine andere Antwort gibt, werden die Fragen (2-4) problematisch.

In jedem Fall gibt es eine Möglichkeit, lokale Verweise basierend auf entfernten Verweisen zu aktualisieren (nachdem beispielsweise git fetch -p ausgeführt wurde):

für ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    lokal=${ref#refs/remotes/origin/}
    ... Code hier ...
done

Was in den Abschnitt ... Code hier ... gehört, hängt von den Antworten auf die Fragen (2-4) ab.

-15voto

SzG Punkte 11697

Verwenden

git fetch

stattdessen. Es aktualisiert die Remote-Verweise und Objekte in Ihrem Repository, lässt jedoch die lokalen Branches, HEAD und den Arbeitsbereich unverändert.

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