Ich kenne einige Leute, die git pull --rebase
standardmäßig verwenden, und andere, die darauf bestehen, es niemals zu verwenden. Ich glaube, ich verstehe den Unterschied zwischen Zusammenführen und Umbasieren, aber ich versuche dies in den Kontext von zu stellen git pull
. Geht es nur darum, nicht viele Merge-Commit-Nachrichten zu sehen, oder gibt es andere Probleme?
806
Antworten:
Sie sollten verwenden,
git pull --rebase
wennIn der Tat - warum dann nicht? Es ist klarer und legt Ihren Commits keine logische Gruppierung auf.
Ok, ich nehme an, es bedarf einer Klarstellung. Wie Sie wahrscheinlich wissen, werden Sie in Git dazu ermutigt, zu verzweigen und zusammenzuführen. Ihr lokaler Zweig, in den Sie Änderungen ziehen, und Ihr Remote-Zweig sind eigentlich verschiedene Zweige und es
git pull
geht darum, sie zusammenzuführen. Es ist vernünftig, da Sie nicht sehr oft pushen und normalerweise eine Reihe von Änderungen sammeln, bevor sie eine abgeschlossene Funktion darstellen.Manchmal - aus welchem Grund auch immer - denken Sie jedoch, dass es tatsächlich besser wäre, wenn diese beiden - entfernte und lokale - eine Niederlassung wären . Wie in SVN. Hier
git pull --rebase
kommt das Spiel ins Spiel. Sie werden nicht mehr zusammengeführt - Sie werden tatsächlich über dem Remote-Zweig festgeschrieben . Darum geht es eigentlich.Ob es gefährlich ist oder nicht, ist die Frage, ob Sie lokale und entfernte Niederlassungen als eine untrennbare Sache behandeln. Manchmal ist es vernünftig (wenn Ihre Änderungen klein sind oder wenn Sie sich am Anfang einer robusten Entwicklung befinden, wenn wichtige Änderungen durch kleine Commits vorgenommen werden). Manchmal ist es nicht so (wenn Sie normalerweise einen anderen Zweig erstellen würden, aber dafür zu faul waren). Aber das ist eine andere Frage.
quelle
git config --global pull.rebase preserve
so einzurichten, dass beim Ziehen mit automatisch eine Neubasis erstellt wird .Ich möchte eine andere Perspektive geben, was "git pull --rebase" eigentlich bedeutet, weil es manchmal verloren zu gehen scheint.
Wenn Sie jemals Subversion (oder CVS) verwendet haben, sind Sie möglicherweise an das Verhalten von "svn update" gewöhnt. Wenn Sie Änderungen festschreiben müssen und die Festschreibung fehlschlägt, weil Änderungen vorgelagert wurden, "svn update". Bei der Subversion werden vorgelagerte Änderungen mit Ihren Änderungen zusammengeführt, was möglicherweise zu Konflikten führt.
Was Subversion gerade getan hat, war im Wesentlichen "pull - rebase". Das Umformulieren Ihrer lokalen Änderungen in Bezug auf die neuere Version ist der "Neuausrichtung" -Teil davon. Wenn Sie vor dem fehlgeschlagenen Festschreibungsversuch "svn diff" ausgeführt und anschließend das resultierende Diff mit der Ausgabe von "svn diff" verglichen haben, ist der Unterschied zwischen den beiden Diffs der Vorgang, den die Neubasierungsoperation ausgeführt hat.
Der Hauptunterschied zwischen Git und Subversion besteht in diesem Fall darin, dass in Subversion "Ihre" Änderungen nur als nicht festgeschriebene Änderungen in Ihrer Arbeitskopie vorhanden sind, während Sie in Git tatsächlich lokale Commits haben. Mit anderen Worten, in Git haben Sie die Geschichte gegabelt; Ihre Geschichte und die vorgelagerte Geschichte sind auseinander gegangen, aber Sie haben einen gemeinsamen Vorfahren.
Meiner Meinung nach ist im Normalfall einfach Ihre lokale Niederlassung mit reflektierenden das Upstream - Zweig und es kontinuierliche Entwicklung zu tun, das Richtige zu tun ist immer „--rebase“, denn das ist , was Sie eigentlich semantisch tun . Sie und andere hacken die beabsichtigte lineare Geschichte eines Zweigs ab. Die Tatsache, dass jemand anderes vor Ihrem versuchten Push etwas Druck gemacht hat, ist irrelevant, und es scheint kontraproduktiv zu sein, wenn jeder solche Unfall des Timings zu Zusammenführungen in der Geschichte führt.
Wenn Sie tatsächlich das Bedürfnis haben, aus irgendeinem Grund eine Branche zu sein, ist dies meiner Meinung nach ein anderes Anliegen. Aber wenn Sie nicht den spezifischen und aktiven Wunsch haben, Ihre Änderungen in Form einer Zusammenführung darzustellen, sollte das Standardverhalten meiner Meinung nach "git pull --rebase" sein.
Bitte berücksichtigen Sie andere Personen, die die Geschichte Ihres Projekts beobachten und verstehen müssen. Möchten Sie, dass die Geschichte überall mit Hunderten von Zusammenführungen übersät ist, oder möchten Sie nur die wenigen ausgewählten Zusammenführungen, die echte Zusammenführungen von absichtlich unterschiedlichen Entwicklungsbemühungen darstellen?
quelle
git config --global branch.autosetupmerge always
?Vielleicht lässt sich das am besten anhand eines Beispiels erklären:
git checkout master && git pull
. Der Master ist bereits auf dem neuesten Stand.git checkout master && git pull
. Der Master ist bereits auf dem neuesten Stand.git merge topic-branch-A
git merge topic-branch-B
git push origin master
vor Alicegit push origin master
, was abgelehnt wird, weil es sich nicht um eine Schnellvorlaufzusammenführung handelt.git pull --rebase origin master
git push origin master
und alle sind froh, dass sie kein nutzloses Zusammenführungs-Commit lesen müssen, wenn sie sich in Zukunft die Protokolle ansehen.Beachten Sie, dass der spezifische Zweig, in den zusammengeführt wird, für das Beispiel irrelevant ist. Der Master in diesem Beispiel kann genauso gut ein Release-Zweig oder ein Dev-Zweig sein. Der entscheidende Punkt ist, dass Alice & Bob gleichzeitig ihre lokalen Zweige zu einem gemeinsam genutzten Remote-Zweig zusammenführen.
quelle
git co master && git pull; git checkout topic-branch-A; git rebase master; git checkout master; git merge topic-branch-A; git push origin master
und zu wiederholen, wenn der Vorstoß eines anderen zum Meister vor meinem stattgefunden hat. Obwohl ich die prägnanten Vorteile in Ihrem Rezept sehen kann.Ich denke, Sie sollten verwenden,
git pull --rebase
wenn Sie mit anderen in derselben Branche zusammenarbeiten. Sie befinden sich in Ihrem Arbeitszyklus → Festschreiben → Arbeiten → Festschreiben, und wenn Sie sich entscheiden, Ihre Arbeit zu pushen, wird Ihr Push abgelehnt, da in demselben Zweig parallel gearbeitet wurde. An dieser Stelle mache ich immer einepull --rebase
. Ich verwende keinen Squash (um Commits zu reduzieren), aber ich base neu, um die zusätzlichen Merge-Commits zu vermeiden.Mit zunehmendem Git-Wissen beschäftigen Sie sich viel mehr mit der Geschichte als mit anderen Versionskontrollsystemen, die ich verwendet habe. Wenn Sie eine Menge kleiner Zusammenführungs-Commits haben, verlieren Sie leicht den Fokus auf das Gesamtbild, das in Ihrer Geschichte passiert.
Dies ist tatsächlich das einzige Mal, dass ich eine Neubasierung durchführe (*), und der Rest meines Workflows basiert auf Zusammenführung. Aber solange Ihre häufigsten Committer dies tun, sieht die Geschichte am Ende viel besser aus.
(*) Während ich einen Git-Kurs unterrichtete, wurde ich von einem Studenten verhaftet, da ich unter bestimmten Umständen auch befürwortete, Feature-Zweige neu zu gründen. Und er hatte diese Antwort gelesen;) Eine solche Umbasierung ist ebenfalls möglich, muss aber immer nach einem vorher festgelegten / vereinbarten System erfolgen und sollte daher nicht "immer" angewendet werden. Und zu dieser Zeit mache ich normalerweise auch nicht
pull --rebase
, worum es bei der Frage geht;)quelle
Ich glaube nicht, dass es jemals einen Grund gibt, dies nicht zu verwenden.
pull --rebase
Ich habe Git speziell Code hinzugefügt, damit meingit pull
Befehl immer gegen Upstream-Commits zurückgesetzt werden kann.Wenn Sie durch die Geschichte schauen, ist es einfach nie interessant zu wissen, wann der Typ, der an der Funktion arbeitet, aufgehört hat, sich zu synchronisieren. Es könnte für den Kerl / die Frau nützlich sein, während er / sie es tut, aber dafür
reflog
ist es da. Es fügt nur Lärm für alle anderen hinzu.quelle
pull --rebase
immer verwendet werden sollte, warum nichtpull
standardmäßig?.gitconfig
, damit einige der Optionen das Richtige tun. Ich denke, Git Rebase macht standardmäßig das Falsche, ebenso wie Git Tag usw. Wenn Sie nicht einverstanden sind, müssen Sie Ihre Meinung nicht begründen.master
, und wenn der Zweig, in den Sie ziehen, (noch) nicht an die Börse gegangen ist. Wenn Sie andererseits von einem Feature-Zweig inmaster
den umgekehrten ziehen, ist es eher umgekehrt: Es gibt nie einen Grund, ihn zu verwenden--rebase
, oder? Dies könnte der Grund sein, warum dies nicht die Standardeinstellung ist. Ich fand, dass bei Rebases Änderungen von der Spitze der Hierarchie nach unten und bei Zusammenführungen nach oben zurückfließen sollten. derekgourlay.com/blog/git-when-to-merge-vs-when-to-rebaseDenk dran:
Wählen Sie also die Art und Weise, wie Sie mit Ihrer Branche umgehen möchten.
Du solltest besser den Unterschied zwischen Merge und Rebase kennen :)
quelle
Ich denke, es läuft auf eine persönliche Präferenz hinaus.
Möchten Sie Ihre dummen Fehler verbergen, bevor Sie Ihre Änderungen vornehmen? Wenn ja,
git pull --rebase
ist perfekt. Sie können Ihre Commits später auf einige (oder einen) Commits reduzieren. Wenn Sie in Ihrer (nicht gepushen) Historie Zusammenführungen haben, ist es nicht so einfach, einegit rebase
spätere durchzuführen .Es macht mir persönlich nichts aus, all meine dummen Fehler zu veröffentlichen, daher neige ich dazu, zusammenzuführen, anstatt sie neu zu gründen.
quelle
git pull --rebase
Möglicherweise wird das Umschreiben eines Verlaufs vor einem Mitarbeiter ausgeblendetgit push --force
. Ich empfehle die Verwendunggit pull --rebase
nur, wenn Sie wissen, dass Sie vergessen haben, Ihre Commits zu pushen, bevor jemand anderes dasselbe tut.Wenn Sie nichts festgelegt haben, aber Ihr Arbeitsbereich nicht sauber ist, kurz
git stash
vorgit pull
. Auf diese Weise schreiben Sie Ihren Verlauf nicht stillschweigend neu (wodurch ein Teil Ihrer Arbeit stillschweigend fallen gelassen werden könnte).quelle