Betrachten Sie die folgende Situation:
- Sie haben einen Klon eines Git-Repository
- Sie haben einige lokale Commits (Commits, die noch nirgendwo gepusht wurden)
- Das Remote-Repository verfügt über neue Commits, die Sie noch nicht abgeglichen haben
So etwas in der Art:
Wenn Sie git pull
mit den Standardeinstellungen ausführen , erhalten Sie ungefähr Folgendes:
Dies liegt daran, dass git eine Zusammenführung durchgeführt hat.
Es gibt jedoch eine Alternative. Sie können pull anweisen, stattdessen eine Rebase durchzuführen:
git pull --rebase
und du bekommst folgendes:
Meiner Meinung nach hat die neu basierende Version zahlreiche Vorteile, bei denen es hauptsächlich darum geht, Ihren Code und den Verlauf sauber zu halten. Daher bin ich ein wenig überrascht, dass git die Zusammenführung standardmäßig vornimmt. Ja, die Hashes Ihrer lokalen Commits werden geändert, aber dies scheint ein geringer Preis für die einfachere Historie zu sein, die Sie dafür erhalten.
Ich behaupte aber keineswegs, dass dies irgendwie ein schlechter oder falscher Standard ist. Ich habe nur Probleme beim Überlegen von Gründen, warum die Zusammenführung für die Standardeinstellung bevorzugt werden könnte. Haben wir einen Einblick, warum es ausgewählt wurde? Gibt es Vorteile, die es als Standard besser geeignet machen?
Die Hauptmotivation für diese Frage ist, dass mein Unternehmen versucht, einige grundlegende Standards (hoffentlich eher Richtlinien) für die Organisation und Verwaltung unserer Repositorys festzulegen, um Entwicklern die Annäherung an ein Repository zu erleichtern, mit dem sie zuvor noch nicht gearbeitet haben. Ich bin daran interessiert, einen Fall zu machen, in dem wir normalerweise in einer solchen Situation einen Rebase durchführen sollten (und wahrscheinlich, um Entwicklern zu empfehlen, ihre globale Konfiguration standardmäßig auf Rebase zu setzen), aber wenn ich dagegen wäre, würde ich mit Sicherheit fragen, warum Rebase nicht funktioniert. t der Standard, wenn es so toll ist. Also frage ich mich, ob ich etwas vermisse.
Es wurde vermutet, dass diese Frage ein Duplikat von Warum bevorzugen so viele Websites "Git Rebase" gegenüber "Git Merge"? ; Diese Frage ist jedoch etwas umgekehrt . In diesem Artikel werden die Vorteile von Zusammenführung über Zusammenführung erörtert, während in dieser Frage die Vorteile von Zusammenführung über Zusammenführung erörtert werden. Die Antworten dort spiegeln dies wider und konzentrieren sich auf Probleme mit dem Zusammenführen und den Vorteilen von Rebase.
Antworten:
Es ist schwer zu wissen, warum das Zusammenführen die Standardeinstellung ist, ohne von der Person zu hören, die diese Entscheidung getroffen hat.
Hier ist eine Theorie ...
Git kann nicht davon ausgehen, dass es in Ordnung ist, jeden Pull zu löschen. Hören Sie, wie sich das anhört. "Wiederholen Sie jeden Zug." Klingt einfach falsch, wenn Sie Pull-Requests oder ähnliches verwenden. Würden Sie auf eine Pull-Anfrage zurückgreifen?
In einem Team, das Git nicht nur für die zentrale Quellcodeverwaltung verwendet ...
Sie können von stromaufwärts und von stromabwärts ziehen. Einige Leute ziehen viel von stromabwärts, von Mitwirkenden usw.
Möglicherweise arbeiten Sie in enger Zusammenarbeit mit anderen Entwicklern an Features, die Sie aus diesen oder einem Zweig mit gemeinsam genutzten Themen abrufen und gelegentlich noch über den Upstream aktualisieren. Wenn Sie sich immer zurücklehnen, ändern Sie letztendlich die gemeinsame Geschichte, ganz zu schweigen von unterhaltsamen Konfliktzyklen.
Git wurde für ein großes, stark verteiltes Team entwickelt, bei dem nicht jeder an einem einzigen zentralen Repo zieht und pusht. Die Voreinstellung macht also Sinn.
Zum Beweis der Absicht hier ein Link zu einer bekannten E-Mail von Linus Torvalds mit seinen Ansichten darüber, wann sie nicht zurückgewiesen werden sollten. Dri-Devel Git Pull E-Mail
Wenn Sie dem gesamten Thread folgen, können Sie sehen, dass ein Entwickler von einem anderen Entwickler und Linus von beiden Entwicklern zieht. Er macht seine Meinung ziemlich klar. Da er wahrscheinlich über Gits Standardeinstellungen entschieden hat, könnte dies den Grund erklären.
Viele Leute verwenden Git jetzt zentral, wobei jeder in einem kleinen Team nur von einem zentralen Upstream-Repo abruft und auf dieselbe Fernbedienung pusht. Dieses Szenario vermeidet einige Situationen, in denen eine Rebase nicht gut ist, beseitigt sie jedoch normalerweise nicht.
Vorschlag: Machen Sie keine Richtlinie zum Ändern der Standardeinstellung. Jedes Mal, wenn Sie Git mit einer großen Gruppe von Entwicklern zusammenstellen, werden einige der Entwickler Git nicht so gut verstehen (ich selbst eingeschlossen). Sie gehen zu Google, SO, holen sich Kochbuchratschläge und fragen sich dann, warum einige Dinge nicht funktionieren, z. B. warum
git checkout --ours <path>
die falsche Version der Datei abgerufen wird. Sie können Ihre lokale Umgebung jederzeit überarbeiten, Aliase usw. erstellen, um sie Ihrem Geschmack anzupassen.quelle
Wenn Sie die Git-Manpage für Rebase lesen, heißt es :
Ich denke, das sagt es als Grund genug, Rebase überhaupt nicht zu verwenden, geschweige denn es automatisch für jeden Zug zu tun. Einige Leute halten Rebase für schädlich . Vielleicht hätte es gar nicht in Schwung gebracht werden dürfen, denn alles, was es zu tun scheint, ist, die Geschichte zu verschönern. Dies sollte in keinem SCM notwendig sein, dessen einzige wesentliche Aufgabe darin besteht, die Geschichte zu bewahren.
Wenn Sie sagen, dass Sie die Geschichte sauber halten, denken Sie, dass Sie sich irren. Es sieht vielleicht besser aus, aber für ein Tool, mit dem der Verlauf von Revisionen festgehalten werden soll, ist es viel sauberer, jedes Commit beizubehalten, damit Sie sehen können, was passiert ist. Die Geschichte danach zu bereinigen ist wie die Patina wegzupolieren und ein reiches antikes Aussehen wie eine glänzende Reproduktion erscheinen zu lassen :-)
quelle
Sie haben Recht, vorausgesetzt, Sie haben nur ein lokales / geändertes Repository. Denken Sie jedoch beispielsweise daran, dass es einen zweiten lokalen PC gibt.
Sobald Ihre lokale / geänderte Kopie an einen anderen Ort verschoben wird, werden diese Kopien durch eine Neu-Basierung beschädigt. Natürlich kann man das Drücken erzwingen, aber das wird schnell kompliziert. Was passiert, wenn einer oder mehrere von ihnen einen völlig neuen Commit haben?
Wie Sie sehen, ist es sehr situativ, aber die Basisstrategie scheint (für mich) in nicht speziellen Fällen / Kollaborationsfällen viel praktischer zu sein.
Ein zweiter Unterschied: Die Merge-Strategie behält eine klare und zeitlich konsistente Struktur bei. Nach Rebases ist es sehr wahrscheinlich, dass ältere Commits auf neuere Änderungen folgen und die gesamte Historie und ihren Ablauf schwerer zu verstehen sind.
quelle
Der Hauptgrund ist wahrscheinlich, dass das Standardverhalten in öffentlichen Repos "nur funktionieren" sollte. Die Wiederaufnahme der Geschichte, die andere Menschen bereits zusammengeführt haben, wird ihnen Ärger bereiten. Ich weiß, dass Sie über Ihr privates Repo sprechen, aber im Allgemeinen weiß git nicht, was privat oder öffentlich ist, und kümmert sich nicht darum. Daher wird der ausgewählte Standard für beide der Standard sein.
Ich verwende
git pull --rebase
ziemlich viel in meinem privaten Repo, aber selbst dort hat es einen möglichen Nachteil, nämlich, dass die Geschichte meinesHEAD
Baums nicht mehr den Baum widerspiegelt, an dem ich tatsächlich gearbeitet habe.Angenommen, ich führe immer Tests durch und stelle sicher, dass sie erfolgreich sind, bevor ich ein Commit durchführe. Dies ist weniger relevant, nachdem ich a ausgeführt habe
git pull --rebase
, da es nicht mehr stimmt, dass der Baum bei jedem meiner Commits die Tests bestanden hat. Solange die Änderungen in irgendeiner Weise nicht stören, und der Code , den ich ziehe getestet wurde, dann vermutlich es würde die Tests bestehen, aber wir wissen nicht , weil ich es nie versucht. Wenn die fortlaufende Integration ein wichtiger Bestandteil Ihres Workflows ist, ist jede Art von Rebase in einem Repo, das CIed wird, problematisch.Ich habe nichts dagegen, aber es stört einige Leute: Sie würden es vorziehen, wenn ihre Geschichte in git den Code widerspiegelt, an dem sie tatsächlich gearbeitet haben (oder vielleicht, wenn sie es pushen, eine vereinfachte Version der Wahrheit nach einigem Gebrauch von "fixup").
Ich weiß nicht, ob gerade dieses Problem der Grund ist, warum Linus sich für eine Zusammenführung entschieden hat, anstatt sich standardmäßig neu zu orientieren. Es könnte andere Nachteile geben, die ich nicht angetroffen habe. Aber da er nicht schüchtern ist, seine Meinung im Code auszudrücken, bin ich mir ziemlich sicher, dass es darauf ankommt, was er für einen geeigneten Workflow für Leute hält, die nicht zu viel darüber nachdenken möchten (und insbesondere für diejenigen, die eher in der Öffentlichkeit arbeiten) als ein privates Repo). Das Vermeiden von parallelen Linien in der hübschen Grafik zugunsten einer sauberen geraden Linie, die nicht die parallele Entwicklung darstellt, wie es passiert ist, ist wahrscheinlich nicht seine oberste Priorität, auch wenn es Ihre ist :-)
quelle