Ich habe einen Zweig namens dmgr2 (Entwicklung) und möchte aus dem Hauptzweig (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
Dies sollte die Live-Änderungen in meinen Entwicklungszweig ziehen, oder habe ich das falsch?
dev
Zweig mit agit checkout dev
. Danngit pull --rebase origin master
. Wenn Sie Glück haben, gibt es keine Konflikte und der Entwickler hat die neuesten Änderungen vom Master.Antworten:
Die von Ihnen aufgelisteten Schritte funktionieren, aber es gibt einen längeren Weg, der Ihnen mehr Optionen bietet:
Der
fetch
Befehl kann zu jedem Zeitpunkt vor dem ausgeführt werdenmerge
, dh Sie können die Reihenfolge des Abrufs und des Auscheckens austauschen, da Siefetch
einfach zur benannten Fernbedienung (origin
) gehen und zu ihr sagen: "Geben Sie mir alles, was Sie haben, was ich nicht habe." ", dh alle Commits in allen Filialen. Sie werden in Ihr Repository kopiert, aber nachorigin/branch
jedembranch
auf der Fernbedienung genannten Zweig benannt .An dieser Stelle können Sie einen beliebigen Viewer verwenden (
git log
,gitk
usw.) , um zu sehen „ was sie haben“ , dass Sie dies nicht tun, und vice versa. Manchmal ist dies nur nützlich für warme Fuzzy-Gefühle ("ah, ja, das ist tatsächlich das, was ich will") und manchmal ist es nützlich, um Strategien komplett zu ändern ("whoa, ich will DIESES Zeug noch nicht").Schließlich
merge
übernimmt der Befehl das angegebene Commit, das Sie benennen könnenorigin/master
, und unternimmt alles, um dieses Commit und seine Vorfahren in den Zweig zu bringen, in dem Sie sich befinden, wenn Sie das ausführenmerge
. Sie können einen Schnellvorlauf einfügen--no-ff
oder--ff-only
verhindern oder zusammenführen, wenn das Ergebnis ein Schnellvorlauf ist, wenn Sie möchten.Wenn Sie die Sequenz verwenden:
Der
pull
Befehl weist git angit fetch
, zu rennen , und dann das moralische Äquivalent vongit merge origin/master
. Das ist also fast das Gleiche wie die beiden Schritte von Hand, aber es gibt einige subtile Unterschiede, die Sie wahrscheinlich nicht allzu sehr betreffen. (Insbesondere derfetch
Schritt Lauf durchpull
bringt über nurorigin/master
, und es aktualisiert nicht den Referee in Ihrem Repo: 1 Alle Commits windet sich durch die besondere bezeichnet zu nur bisFETCH_HEAD
. Referenz)Wenn Sie die explizitere
git fetch origin
(dann optional umschauende) und dann diegit merge origin/master
Sequenz verwenden, können Sie auch Ihre eigene lokalemaster
Version mit der Fernbedienung auf den neuesten Stand bringen , wobei nur einefetch
über das Netzwerk ausgeführt wird:zum Beispiel.
1 Dieser zweite Teil wurde in Git 1.8.4 geändert - ich sage "behoben" - und aktualisiert nun "Remote Branch" -Referenzen opportunistisch. (Es war, wie in den Versionshinweisen angegeben, eine bewusste Entwurfsentscheidung, das Update zu überspringen, aber es stellt sich heraus, dass mehr Leute das Git-Update bevorzugen. Wenn Sie den alten Remote-Zweig SHA-1 möchten, wird er standardmäßig gespeichert Dies ermöglicht auch eine neue Git 1.9 / 2.0-Funktion zum Auffinden von Upstream-Rebases.)
quelle
git checkout
ist normalerweise zerstörungsfrei und es gibt normalerweise keinen Grund, ein rückgängig zu machen.git fetch
Es hört sich also so an, als würden Sie fragen, wie Sie ein Zusammenführungs-Commit zurücksetzen können. Die Antwort ist dieselbe wie bei anderen Commits: entwedergit reset
odergit revert
. Für unveröffentlichte Änderungengit reset
ist normalerweise die beste Methode; Für Änderungen, die andere bereits vorgenommen haben, ist esgit revert
vielleicht besser, aber siehe Linus Torvalds Ratschläge zum Zurücksetzengitk
,git log --graph
mit oder ohne--oneline
, und so weiter) , und Sie könnengit show
odergit show -m
eine Zusammenführung begehen oder Verwendunggit diff
. In all diesen Fällen geben Sie das Programm an, wenn Sie den Befehl in der Befehlszeile eingeben.Situation : Ich arbeite in meiner lokalen Niederlassung, aber ich halte mich gerne über Aktualisierungen in der genannten Entwicklungsniederlassung auf dem Laufenden
dev
.Lösung : Normalerweise mache ich lieber:
quelle
Das hat bei mir funktioniert. Um den neuesten Code vom Master in meine Filiale zu bekommen
git rebase origin/master
quelle
git fetch origin
zuerst.Szenario :
Ich habe eine Master-Aktualisierung und eine Zweigaktualisierung. Ich möchte, dass mein Zweig den Master mit Neugründung verfolgt. Um den gesamten Verlauf ordnungsgemäß zu verfolgen, nennen wir meinen Zweig Mybranch
Lösung :
(Korrektur der letzten Stufe mit freundlicher Genehmigung von Tzachi Cohen unter Verwendung von "-f" zwingt git, den Verlauf auf dem Server zu "aktualisieren")
Jetzt sollte der Zweig mit dem Master ausgerichtet und neu basiert werden, auch mit der Remote-Aktualisierung. Im Git-Protokoll gibt es also kein "Zurück" oder "Voraus". Sie müssen lediglich alle lokalen Konflikt * .orig-Dateien entfernen, um den Ordner "sauber" zu halten.
quelle