2013-11-20 7 views
243

Ich habe eine Niederlassung namens dmgr2 (Entwicklung) und ich möchte aus dem Master-Zweig (Live-Site) ziehen und alle Änderungen in meinen Entwicklungszweig integrieren. Gibt es einen besseren Weg, dies zu tun? hier ist das, was ich hatte auf dem Tun geplant:git ziehen vom Master in den Entwicklungszweig

git checkout dmgr2 
git pull origin master 

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

+1

zuerst alle Ihre Änderungen in dmgr2-Zweig festschreiben. und zeigen Sie dann 1.git Kasse Master zu beherrschen und dann die letzte Änderung erhalten 2.git zu ziehen 3.git dmgr2 fusionieren 4.git -u origin master schieben und dann zu Ihrem dmgr2 5.git Kasse gehen zurück dmgr2 –

+0

Ich habe bereits alle meine Änderungen in den Zweig dmgr2 übernommen, leider vergessen, dass –

+0

hinzufügen, wenn ich Schritt 4, nicht, dass Push meine Entwicklung Änderungen in Master? Ich möchte das nicht tun –

Antwort

360

Die Schritte, die Sie arbeiten aufgeführt, aber es gibt einen längeren Weg, die Ihnen mehr Möglichkeiten 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 jedem Punkt vor dem merge erfolgen, dh, können Sie die Reihenfolge der Swap das Holen und Auschecken, denn fetch geht einfach zu der named remote (origin) und sagt dazu: "gib mir alles was du hast das ich nicht mache", dh alle commits in allen Zweigen. Sie werden in Ihr Repository kopiert, aber auf der Fernbedienung origin/branch für einen beliebigen Zweig mit dem Namen branch benannt.

An dieser Stelle können Sie jeden Betrachter verwenden können (git log, gitk, etc.), um zu sehen „was sie haben“, dass Sie dies nicht tun, und umgekehrt. Manchmal ist dies nur nützlich für Warm Fuzzy Feelings ("Ah, ja, das ist in der Tat, was ich will") und manchmal ist es nützlich, Strategien völlig zu ändern ("whoa, ich will das Zeug noch nicht").

Schließlich wird der merge Befehl nimmt den Commit gegeben, was Sie als origin/master nennen kann, und tut, was er in diesem begehen und seine Vorfahren zu bringen braucht, um alles, was Zweig sind Sie an, wenn Sie die merge laufen. Sie können --no-ff oder --ff-only einfügen, um einen schnellen Vorlauf zu verhindern, oder nur zusammenführen, wenn das Ergebnis ein schneller Vorlauf ist, wenn Sie möchten.

Wenn Sie die Reihenfolge verwenden:

git checkout dmgr2 
git pull origin master 

der pull Befehl git instruiert git fetch laufen, und dann das moralische Äquivalent von git merge origin/master. Also das ist fast das gleiche wie die zwei Schritte von Hand zu tun, aber es gibt einige subtile Unterschiede, die wahrscheinlich nicht zu sehr auf Sie bezogen sind. (Insbesondere die fetch Schritt laufen durch pull bringt über nurorigin/master, und es nicht den Referee in Ihrem Repo aktualisieren: alle neuen Commits aufwickelt bezeichnet zu nur durch die besondere FETCH_HEAD Referenz.)

wenn Sie die mehr expliziten git fetch origin (dann optional umsehe) verwenden und dann git merge origin/master Sequenz, können Sie auch Ihre eigenen lokalen master auf dem neuesten Stand mit der Fernbedienung bringen, mit nur einem fetch Lauf über das Netzwerk:

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

zum Beispiel.


Dieser zweite Teil geändert-I wurde "fixed" -in git 1.8.4, sagen die jetzt "remote Zweig" Referenzen opportunistisch aktualisiert. (Es war, wie die Release-Notes sagen, eine bewusste Design-Entscheidung, das Update zu überspringen, aber es stellt sich heraus, dass mehr Leute es bevorzugen, dass git es aktualisiert.Wenn Sie den alten Remote-Zweig SHA-1 verwenden möchten, wird er standardmäßig im Reflog gespeichert und kann daher wiederhergestellt werden. Dies ermöglicht auch eine neue git 1.9/2.0-Funktion zum Auffinden von Upstream-Rebases.)

+12

Ich frage nur nach einem, uh, Freund - wie würdest du den ersten Codeblock rückgängig machen, den du hier hast (checkout/fetch/merge)? –

+4

@RichBradshaw: 'git checkout' ist normalerweise nicht-destruktiv und es gibt normalerweise keinen Grund, ein' git fetch' rückgängig zu machen, also klingt es, als ob du fragst, wie man ein Merge-Commit zurücksetzt. Die Antwort ist die gleiche wie für andere Commits: entweder 'git reset' oder' git revert'. Für * unveröffentlichte * Änderungen ist 'git reset' normalerweise die beste Methode; Für Änderungen, die andere bereits haben, könnte "git revert" besser sein, aber siehe Linus Torvalds Ratschlag zum Zurücksetzen einer Zusammenführung: https://www.kernel.org/pub/software/scm/git/docs/howto/revert-a- defective-merge.txt – torek

+0

Wie legen Sie fest, welches Merge Viewer-Programm verwendet werden soll? – PositiveGuy

Verwandte Themen