869 Stimmen

Wie man "git pull" von master in den Entwicklungsbranch macht

Ich habe einen Zweig namens "dmgr2" in der Entwicklung und möchte aus dem Master-Zweig (Live-Site) ziehen und alle Änderungen in meinen Entwicklungszweig einbeziehen. Gibt es einen besseren Weg, das zu tun?

Hier ist, was ich geplant hatte, nachdem ich Änderungen übernommen hatte:

git checkout dmgr2
git pull origin master

Sollte dies die Live-Änderungen in meinen Entwicklungszweig ziehen oder liege ich falsch?

1228voto

torek Punkte 381305

Die von Ihnen aufgeführten Schritte funktionieren, aber es gibt einen längeren Weg, der Ihnen mehr Optionen bietet:

git checkout dmgr2      # setzt Sie auf den Branch dmgr2
git fetch origin        # holt Sie auf den aktuellen Stand von origin
git merge origin/master

Der fetch-Befehl kann zu jedem beliebigen Zeitpunkt vor dem merge ausgeführt werden, d.h. Sie können die Reihenfolge des fetch und des checkout vertauschen, da fetch einfach zum benannten Remote (origin) übergeht und ihm sagt: "gib mir alles, was du hast und ich nicht habe", d.h. alle Commits auf allen Branches. Sie werden in Ihr Repository kopiert, aber für jeden Branch namens branch auf dem Remote als origin/branch benannt.

An diesem Punkt können Sie jeden Viewer (git log, gitk, usw.) verwenden, um "was sie haben", was Sie nicht haben, und umgekehrt zu sehen. Manchmal ist dies nur für ein Warmes Gefühl ("ah, ja, das ist tatsächlich das, was ich will") nützlich und manchmal ist es nützlich, um die Strategie vollständig zu ändern ("Wow, ich will DIESE Dinge noch nicht").

Schließlich nimmt der merge-Befehl den angegebenen Commit, den Sie als origin/master bezeichnen können, und tut alles, um diesen Commit und seine Vorgänger in den Branch zu bringen, auf dem Sie sind, wenn Sie den merge ausführen. Sie können --no-ff oder --ff-only einfügen, um ein Fast-Forward zu verhindern oder nur zusammenzuführen, wenn das Ergebnis ein Fast-Forward ist, falls gewünscht.

Wenn Sie die Sequenz verwenden:

git checkout dmgr2
git pull origin master

Der pull-Befehl weist git an, git fetch auszuführen und dann das moralische Äquivalent von git merge origin/master. Das ist also fast das gleiche wie die beiden Schritte von Hand zu machen, aber es gibt einige subtile Unterschiede, die wahrscheinlich nicht allzu besorgniserregend für Sie sind. (Insbesondere führt der fetch-Schritt, den pull ausführt, nur origin/master herüber und aktualisiert nicht die Referenz in Ihrem Repo: 1 alle neuen Commits werden nur durch die spezielle FETCH_HEAD-Referenz referenziert.)

Wenn Sie die expliziteren Abfolge von git fetch origin (dann optional herumschauen) und dann git merge origin/master verwenden, können Sie auch Ihr lokales master mit dem Remote auf den neuesten Stand bringen, mit nur einem fetch, der über das Netzwerk ausgeführt wird:

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

zum Beispiel.


1Dieser zweite Teil wurde geändert—ich sage "korrigiert"—in git 1.8.4, das jetzt "Remote-Branch"-Referenzen opportunistisch aktualisiert. (Es war, wie es in den Versionshinweisen heißt, eine bewusste Designentscheidung, das Update zu überspringen, aber es stellt sich heraus, dass mehr Menschen es bevorzugen, dass git es aktualisiert. Wenn Sie den alten Remote-Branch-SHA-1 möchten, wird er standardmäßig im Reflog gespeichert und somit wiederherstellbar. Dies ermöglicht auch eine neue git 1.9/2.0-Funktion zum Auffinden von Upstream-Rebases.)

48voto

greenridinghood Punkte 649

Bei der Arbeit in meinem lokalen Zweig halte ich gerne Updates im Entwicklungszweig mit dem Namen dev.

Normalerweise verwende ich:

git fetch
git rebase origin/dev

31voto

Pratik Gaurav Punkte 495

Dies hat funktioniert, um den neuesten Code von master in meinem Branch zu erhalten:

git rebase origin/master

25voto

Dr-Bracket Punkte 2605

Wenn du auf dem Feature-1-Zweig bist und den Master-Zweig pullen möchtest - (vielleicht um die neuesten zusammengeführten Updates zu erhalten/um die Wahrscheinlichkeit von Merge-Konflikten zu reduzieren), führe folgendes aus:

git pull
git merge origin/master

Holt den Master in deinen Zweig - Beeinflusst den Master nicht!

Dadurch werden alle Änderungen, die im Master-Zweig gemacht wurden, in deinen Zweig geholt, seitdem sich die beiden Zweige getrennt haben.

Es ist in Ordnung, dies zu tun, wenn dein Zweig bereits veröffentlicht wurde, da es die Historie nicht verändert.

13voto

user10556443 Punkte 191

Ich habe das Aktualisieren des Master und das Aktualisieren meines Branches gemeistert, ich möchte, dass mein Branch den Master mit Rebasen im Auge behält, um die gesamte Historie ordnungsgemäß zu verfolgen. Nennen wir meinen Branch Mybranch:

git checkout master
git pull --rebase
git checkout Mybranch
git rebase master
git push -f origin Mybranch

I muss alle Konflikte mit git mergetool, git rebase --continue, git rebase --skip und git add -u auflösen, je nach Situation und den Git-Hinweisen, bis alles gelöst ist.

Hinweis: Korrektur zum letzten Schritt, auf Anraten von Tzachi Cohen, mit Verwendung von "-f" zwingt git dazu, die "Historie zu aktualisieren" am Server.

Jetzt sollte der Branch mit dem Master abgeglichen und rebased sein, auch mit dem Remote aktualisiert, damit es bei git log keine "hinter" oder "vor" gibt, und ich muss nur alle lokalen Konflikt *.orig-Dateien entfernen, um den Ordner "sauber" zu halten.

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