wake-up-neo.com

git pull vom master in den entwicklungszweig

Ich habe einen Zweig namens dmgr2 (Entwicklung) und möchte aus dem Master-Zweig (Live-Site) ziehen und alle Änderungen in meinen Entwicklungszweig integrieren. Gibt es einen besseren Weg, dies zu tun? Folgendes hatte ich geplant, nachdem ich Änderungen vorgenommen hatte:

git checkout dmgr2
git pull Origin master

sollte dies die Live-Änderungen in meinen Entwicklungszweig ziehen, oder habe ich das falsch?

352
Matthew Colley

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

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch Origin        # gets you up to date with Origin
git merge Origin/master

Der fetch-Befehl kann an einem beliebigen Punkt vor der merge ausgeführt werden, dh Sie können die Reihenfolge des Abrufs und des Checkouts austauschen, da fetch einfach zur genannten remote (Origin) geht und dazu sagt: "Gib mir alles, was du hast Ich nicht ", dh alle Festschreibungen in allen Zweigen. Sie werden in Ihr Repository kopiert, jedoch mit dem Namen Origin/branch für jeden Zweig mit dem Namen branch auf der Fernbedienung.

An diesem Punkt können Sie einen beliebigen Viewer (git log, gitk usw.) verwenden, um zu sehen, "was er hat", den Sie nicht haben, und umgekehrt. Manchmal ist dies nur für warme, unscharfe Gefühle nützlich ("ach ja, genau das ist es, was ich will"), und manchmal ist es nützlich, Strategien komplett zu ändern ("whoa, ich will das Zeug noch nicht").

Schließlich nimmt der Befehl merge das angegebene Commit an, das Sie als Origin/master benennen können, und unternimmt alles, um dieses Commit und seine Vorfahren in den Zweig zu bringen, in dem Sie sich befinden, wenn Sie die merge ausführen. Sie können --no-ff oder --ff-only einfügen, um einen Schnellvorlauf zu verhindern, oder nur zusammenführen, wenn das Ergebnis ein Schnellvorlauf ist, wenn Sie möchten.

Wenn Sie die Sequenz verwenden:

git checkout dmgr2
git pull Origin master

der Befehl pull weist git an, git fetch und dann das moralische Äquivalent von git merge Origin/master auszuführen. Dies ist also fast das Gleiche wie das Ausführen der beiden Schritte von Hand, aber es gibt einige subtile Unterschiede, die Sie wahrscheinlich nicht allzu beunruhigend machen. (Insbesondere der fetch-Schritt, der von pull ausgeführt wird, führt zu only Origin/master und aktualisiert den Ref in Ihrem Repo nicht:1 Alle neuen Commits werden nur durch die spezielle FETCH_HEAD-Referenz verwiesen.)

Wenn Sie die explizite git fetch Origin (dann optional umsehen) und dann die git merge Origin/master-Sequenz verwenden, können Sie auch Ihre eigene lokale master mit der Remote auf den neuesten Stand bringen, wobei nur eine fetch über das Netzwerk läuft:

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 "repariert" - in git 1.8.4, der nun "remote branch" -Verweise opportunistisch aktualisiert. (Es war, wie in den Versionshinweisen erwähnt, eine bewusste Designentscheidung, das Update zu überspringen, es stellt sich jedoch heraus, dass mehr Leute dieses Update bevorzugen. Wenn Sie den alten Remote-Zweig SHA-1 verwenden möchten, wird er standardmäßig gespeichert und ist somit aus dem reflog wiederherstellbar. Dies ermöglicht auch eine neue git 1.9/2.0-Funktion zum Auffinden von Upstream-Rebases.)

518
torek

Situation : Ich arbeite in meinem lokalen Zweig, aber ich freue mich über Updates im Entwicklungszweig namens dev.

Lösung : Normalerweise bevorzuge ich:

git fetch
git rebase Origin/dev
6
greenridinghood

Szenario

Ich habe ein Master-Update und einen Zweig-Update. Ich möchte, dass mein Zweig den Master beim Umbasieren verfolgt, um die gesamte Historie korrekt zu verfolgen. Lassen Sie uns meinen Zweig Mybranch nennen

Lösung

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git Push -f Origin Mybranch
  • müssen alle Konflikte mit git mergetool &, git rebase --continue, git rebase --skip, git add -u je nach Situation und git-Hinweisen lösen, bis alles gelöst ist

(Korrektur bis zur letzten Stufe, mit freundlicher Genehmigung von Tzachi Cohen, zwingt git "-f", um die Historie auf dem Server zu aktualisieren)

branch sollte jetzt mit master abgeglichen werden und auch mit remote aktualisiert werden, so dass bei git log kein "after" oder "ahead" vorhanden ist.

0
user10556443