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?
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.)
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
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
(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.