2008-09-18 4 views
31

Also wenn ich Zweige verwende, die entfernt sind (verfolgt) Filialen, und ich möchte die neuesten, ich bin immer noch unklar, ob ich tun sollte git pull oder git rebase. Ich dachte, ich hätte gelesen, dass git rebase bei der Arbeit an einem Zweig mit anderen Benutzern zu tun, kann es sie vermasseln, wenn sie ziehen oder Rebase. Ist das wahr? Sollten wir alle git pull verwenden?Git - ist es Pull oder Rebase beim Arbeiten an Zweigen mit anderen Menschen

Antwort

48

Git Pull eine Kombination von 2 Befehlen

  • git fetch (synchronisiert Ihre lokalen repo mit dem neuesten Material auf der Fernbedienung)
  • git merge (die Änderungen aus dem fernen Zweig übergeht, falls vorhanden, in Ihren lokalen Verfolgungszweig)

git rebase ist nur eine grobe Entsprechung zu git merge. Es holt nichts aus der Ferne. Tatsächlich führt es auch keine richtige Zusammenführung durch, es gibt die Commits des Zweiges wieder, auf dem Sie nach den neuen Commits aus einem zweiten Zweig stehen.

Sein Zweck ist hauptsächlich, Ihnen eine sauberere Geschichte zu lassen. Es braucht nicht viele Zusammenführungen von vielen Menschen, bevor die Vergangenheit in Gitk schrecklich Spaghetti-ähnlich wird.

Die beste grafische Erklärung finden Sie in den ersten beiden Grafiken here. Aber lassen Sie mich hier mit einem Beispiel erklären.

Ich habe 2 Zweige: Master und mybranch. Wenn auf mybranch Stehen kann ich

git rebase master 

laufen und ich werde vor meinen letzten Commits in mybranch eingefügt etwas Neues in Master bekommen. Das ist perfekt, denn wenn ich nun das Material von mybranch in master fusioniere oder neu bette, werden meine neuen Commits linear nach den letzten Commits hinzugefügt.

Das Problem, auf das Sie verweisen, geschieht, wenn ich in die "falsche" Richtung neugebe. Wenn ich nur den jüngsten Meister bekam (mit neuen Änderungen) und vom Master ich so rebase (vor meinem Zweig Synchronisierung):

git rebase mybranch 

Nun, was ich gerade tat, ist, dass ich meine neue Änderungen irgendwo in Master in der Vergangenheit eingeführt .Die Hauptlinie der Commits hat sich geändert. Und aufgrund der Art, wie Git mit Commit-IDs arbeitet, haben alle Commits (vom Master), die gerade über meine neuen Änderungen wiedergegeben wurden, neue IDs.

Nun, es ist ein bisschen schwer, nur in Worten zu erklären ... Hoffe, dass dies ein wenig Sinn macht :-)

Wie auch immer, meine eigene Workflow ist dies:

  • 'git pull' Nur Änderungen von entfernten
  • Schalter
  • 'git rebase master' mybranch Geschichte meines Herrn neuen Änderungen in begehen
  • Schalter, um wieder zu meistern
  • 'git merge mybranch', die nur schnell nach vorne, wenn alles in Master auch in mybranch ist (also die commit Vermeidung auf einem öffentlichen Zweig Neuordnungs Problem)
  • 'git push'

Ein letztes Wort. Ich empfehle dringend, Rebase zu verwenden, wenn die Unterschiede trivial sind (z. B. Leute, die an verschiedenen Dateien oder mindestens verschiedenen Zeilen arbeiten). Es hat das Problem, dass ich versucht habe, es zu erklären, aber es macht eine viel sauberere Geschichte.

Sobald es zu erheblichen Konflikten kommen kann (z. B. hat ein Mitarbeiter etwas in einer Reihe von Dateien umbenannt), empfehle ich dringend die Zusammenführung. In diesem Fall werden Sie aufgefordert, den Konflikt zu lösen und dann die Lösung zu bestätigen. Auf der positiven Seite ist eine Zusammenführung viel einfacher zu lösen, wenn Konflikte auftreten. Der Nachteil ist, dass Ihre Geschichte schwer folgen kann, wenn viele Leute die ganze Zeit zusammenfließen :-)

Viel Glück!

+1

Es scheint mir, dass Sie gesagt haben sollten: 'git _merge_ mybranch', die nur vorspult, wenn alles im Master ist auch in mybranch (so vermeiden Sie die Neuordnung der Commit-Problem in einer öffentlichen Branche) –

+0

'git Rebase mybranch' sollte definitiv 'git merge mybranch' lesen. –

6

git pull führt eine Zusammenführung durch, wenn Sie Zusagen haben, die sich nicht in der Remote-Verzweigung befinden. git rebase schreibt alle vorhandenen Commits um, die relativ zur Spitze der Remote-Verzweigung sein müssen. Sie sind ähnlich, weil sie beide Konflikte verursachen können, aber ich denke, mit git rebase, wenn Sie für eine reibungslosere Zusammenarbeit ermöglicht. Während der Rebase-Operation können Sie Ihre Commits verfeinern, sodass sie so aussehen, als ob sie neu auf die neueste Version der Remote-Branch angewendet würden. Eine Zusammenführung ist vielleicht für längere Entwicklungszyklen auf einem Zweig, die mehr Geschichte haben, geeigneter.

Wie bei den meisten anderen Dingen in git gibt es viele überlappende Funktionen, die unterschiedlichen Arbeitsstilen gerecht werden.

0

Wenn Sie die Quelle ohne Auswirkungen auf Remote-Zweigstellen und ohne Änderungen in Ihrer lokalen Kopie ziehen möchten, verwenden Sie am besten git pull.

Ich glaube, wenn Sie einen Arbeitszweig haben, dass Sie Änderungen vorgenommen haben, zu verwenden git rebase die Basis dieses Zweiges ändern neuesten Remote-Master werden, werden Sie alle Ihre Niederlassung Änderungen halten, jedoch wird die Niederlassung nun sein Verzweigung von der Master-Position, anstatt wo es vorher verzweigt wurde.

10

Git rebase ist ein Umschreiben der Geschichte. Sie sollten dies niemals an Zweigen tun, die "öffentlich" sind (d. H. Zweige, die Sie mit anderen teilen). Wenn jemand Ihren Zweig klont und Sie dann diesen Zweig neu erstellen, dann können Sie keine Änderungen mehr aus Ihrem Zweig ziehen/zusammenführen. Sie müssen ihren alten wegwerfen und erneut ziehen.

Dieser Artikel auf packaging software with git ist eine sehr lohnende Lektüre. Es geht mehr um die Verwaltung von Software-Distributionen, aber es ist ziemlich technisch und spricht darüber, wie Zweige verwendet/verwaltet/geteilt werden können. Sie reden darüber, wann und wann sie ziehen müssen und was die verschiedenen Folgen eines jeden sind.

Kurz gesagt, sie haben beide ihren Platz, aber Sie müssen wirklich den Unterschied machen.

+0

Ist das wahr, @Pat? Im Falle einer Pull - Rebase, sind Sie nicht gerade neu bestellen Sie Ihre lokalen Commits zu sein, über was Sie aus gezogen? Da dies lokale Commits waren und noch nicht veröffentlicht wurden, wie werden sie jemanden zerbrechen, der versucht, nach dem Pull-Rebase zu ziehen? –

+1

Das Problem ist, wenn jemand anderes aus einem Zweig zieht, den Sie dann rebase. Es ist in Ordnung, wenn ich von 'A' in' local' ziehe, dann 'local' rebase, und jemand anderes zieht von 'A'. Es ist nicht in Ordnung, wenn ich von 'A' ziehe, jemand anderes zieht von' local', dann rebase ich 'local'. –

+1

Kurz gesagt, rebienen Sie keine Commits, die in anderen Repositories existieren. – Ikke