Git ziehen ohne Kasse?

133

Ich bin es gewohnt, Git Pull und andere Befehle in einem Zweig auszuführen, an dem ich arbeite. Ich habe jedoch einen Entwicklungsserver eingerichtet, an dem mehrere Personen arbeiten, sodass ich dabei nicht zwischen Zweigen wechseln muss. Wenn ich einen vorhandenen Zweig auf dem Dev-Server aus dem von uns allen verwendeten Github-Repository aktualisieren möchte, wie wäre das der richtige Weg? Wenn ich den Befehl 'git pull github branchname' ausführe, wird der Zweig dann einfach in den aktuellen Zweig gezogen?

Alle Git-Beispiele, die ich finden kann, scheinen darauf hinzudeuten, dass Sie zuerst 'checkout branchname' ausführen und dann den Pull ausführen. Ich versuche das zu vermeiden. Wie gesagt, dies ist ein bestehender Zweig und ich möchte nur auf die neueste Version aktualisieren.

Diana Saunders
quelle
6
git fetchsollte tun was du willst.
Brad
11
git fetchwürde die lokale Kopie des Remote-Zweigs aktualisieren, aber keinen lokalen Zweig, selbst wenn einer so eingerichtet ist, dass er diesen bestimmten Remote-Zweig verfolgt. Es kann sein oder auch nicht, was gewünscht wird. (Bearbeiten: jedenfalls standardmäßig. Es ist möglich, es mit Argumenten aufzurufen, damit es sich anders verhält, aber in diesem Fall sollten die Argumente wirklich hervorgehoben werden.)
2
Ich verstehe nicht ganz ... verwendet jeder das gleiche lokale Repository auf dem Dev-Server? Wollen Sie deshalb nicht die Filiale wechseln? Warum nicht einfach jeden seinen eigenen privaten Klon erstellen lassen, in dem er arbeiten kann? Siehe auch git: einen lokalen Zweig aktualisieren, ohne ihn auszuchecken? .

Antworten:

220

Ich suchte nach der gleichen Sache und fand schließlich die Antwort, die für mich in einem anderen Stackoverflow-Beitrag funktionierte: Zusammenführen, Aktualisieren und Ziehen von Git-Zweigen ohne Verwendung von Kassen

Grundsätzlich:

git fetch <remote> <srcBranch>:<destBranch>

koral
quelle
Gibt es eine Möglichkeit, den Upstream-Zweig zu verwenden, anstatt den Quellzweig anzugeben?
Cambunctious
Leider, aber die pullhat Parameter , dass das fetchnicht: -s <strategy>, -Xsubtree=...was für mich ein wichtiger war, so dass dies nicht ein äquivalenter Ersatz ist. Ich hatte das hier beschriebene Problem: congruityservice.com/blog/…, aber in meinem Fall wollte ich überhaupt keine Kasse.
Andry
2
In Anbetracht der Frage, ob es um Pull geht, sollte die Antwort stattdessen lauten git pull <remote> <srcBranch>:<destBranch>.
J Woodchuck
Wenn sich die Commits bereits in Ihrem lokalen Repository befinden:git fetch . origin/master:master
Evan
74

Ich hatte das gleiche Problem mit der Notwendigkeit zu begehen oder zu aktuellen Funktionsänderungen, Kasse bunkert Master Zweig, tut pullBefehl alles tun , um aus der Ferne zu lokalem masterArbeitsplatz, wechseln Sie dann wieder zu einem Feature - Zweig und führen Sie ein , rebaseum es up-to-date mit Meister.

Um dies alles zu erledigen, lassen Sie den Arbeitsbereich im Feature-Zweig und vermeiden Sie das Umschalten. Ich mache Folgendes:

git fetch origin master:master

git rebase master

Und es macht den Trick gut.

Marcin TP Łuczyński
quelle
19
Dies ist ein guter Rat, aber er vergräbt die Lede: Gemäß den folgenden Antworten, wenn Sie eingeschaltet sind featureund alles, was Sie tun möchten, ist, Ihren lokalen Standort so masterzu aktualisieren , dass er mit dem Ursprung übereinstimmt, ohne ihn zu berühren feature, tun git fetch origin master:masterSie es einfach ... und es ist, als ob Sie es getan hätten stash-checkoutMaster-pull-checkoutFeature-stashPop!
Btown
7
Um den Ursprungsmaster in Ihrem lokalen Zweig zusammenzuführen, müssen Sie den lokalen Master nicht ziehen. Sie können verwenden git merge origin/master
Dan
-1

Wenn Sie möchten, dass die Tipps für den lokalen Zweig nachher erneut angezeigt werden git fetch, benötigen Sie einige zusätzliche Schritte.

Genauer gesagt, nähme die GitHub Repo - Filialen hat D, B, C, und master(der Grund für dieses ungeradee Zweig-name-Set wird in einem Moment klar sein). Sie sind auf Host devhostund Sie sind in einem Repo, wo originist das Github-Repo. Sie tun git fetch, was über alle Objekte und Updates bringt origin/D, origin/B, origin/C, und origin/master. So weit, ist es gut. Aber jetzt sagen Sie Ihnen etwas passieren soll, auf devhost, um lokale Niederlassungen D, B, Cund / oder master?

Ich habe diese offensichtlichen (für mich jedenfalls) Fragen:

  1. Warum sollen die Tipps aller Branchen aktualisiert werden?
  2. Was ist, wenn ein Zweig (z. B. B) Commits hat, die dem Remote-Repo (Github) fehlen? Sollten sie zusammengeführt, neu gegründet oder ...?
  3. Was ist, wenn Sie sich in einem Zweig befinden (z. B. C) und das Arbeitsverzeichnis und / oder der Index geändert, aber nicht festgeschrieben wurden?
  4. Was ist, wenn im Remote-Repo neue Zweige hinzugefügt ( A) und / oder Zweige gelöscht ( D) wurden?

Wenn die Antwort auf (1) lautet "weil devhostnicht für die Entwicklung, sondern für einen lokalen Spiegel, der einfach eine lokal verfügbare Kopie des Github-Repos aufbewahrt, damit alle unsere tatsächlichen Entwickler schnell daraus lesen können, anstatt langsam daraus zu lesen." github ", dann willst du eher einen" Spiegel "als ein" normales "Repo. Es sollte kein Arbeitsverzeichnis haben, und vielleicht sollte es auch keine Pushs akzeptieren. In diesem Fall verschwinden die verbleibenden Fragen einfach.

Wenn es eine andere Antwort gibt, wird (2-4) problematisch.

In jedem Fall gibt es eine Möglichkeit, die Aktualisierung lokaler Refs basierend auf Remote-Refs ( git fetch -pz. B. nach dem Ausführen ) zu aktualisieren :

for ref in $(git for-each-ref refs/remotes/origin/ --format '%(refname)'); do
    local=${ref#refs/remotes/origin/}
    ... code here ...
done

Was in diesem ... code here ...Abschnitt steht, hängt von den Antworten auf die Fragen ab (2-4).

torek
quelle
-5

Verwenden

git fetch

stattdessen. Es aktualisiert die Remote-Refs und -Objekte in Ihrem Repo, lässt jedoch die lokalen Zweige, HEAD und den Arbeitsbaum in Ruhe.

SzG
quelle
17
Dadurch werden jedoch die lokalen Zweige seines Entwicklungsservers nicht aktualisiert. Es werden nur die "Ursprungs" -Zweige in diesem Git-Ordner aktualisiert, die dem Github-Repo des Fragestellers entsprechen.
ANeves
1
Oder wenn Sie meine Version des Problems möchten: Ich möchte meinen Arbeitszweig mit "master" zusammenführen und nicht mit "origin / master of ssh: // bla bla bla". Durch das Abrufen wird Origin / Master aktualisiert, nicht jedoch Master.
Aneves
-6

BEARBEITEN: Verwenden Sie 'git pull'. Es werden alle Zweige aus dem Repo abgerufen und auch auf den neuesten Stand aktualisiert, wenn der Zweig auf dem lokalen System nur für den aktuellen Zweig beendet wird. Hinweis: Git Pull entspricht Fetch + Merge, bei dem alle Zweige abgerufen werden, jedoch nur der aktuelle Zweig.

Anuj Aneja
quelle
6
Besser zu sagen: pullführt einen Abruf durch (der ja alles von der Fernbedienung abruft), führt dann aber nur den aktuellen Zweig zusammen.
Torek
Ich weiß, dass das, was Sie sagen, richtig und sachlich ist, und das OP hat zwar um Bestätigung gebeten, was Pull bewirkt (und Sie haben ihm diese Erklärung gegeben), aber es geht nicht um das Kern dessen, wonach er gesucht hat: Gibt es eine Möglichkeit, eine Ihrer lokalen Zweigstellen auf die neuesten Commits in der zugehörigen Remote-Zweigstelle zu aktualisieren, ohne zuerst die Zweigstelle auschecken zu müssen.
Gurce