Ist die "Goldene Regel des Wiederaufbaus" so wichtig?


22

Ich hatte kürzlich eine Diskussion mit Leuten, die absolut gegen eine Rebase-Strategie von Feature-Branches auf GIT waren. Es scheint ein akzeptiertes Muster zu sein, Rebase nur für lokale, private Zweige zu verwenden, aber verwenden Sie es niemals, wenn mehrere Personen an derselben Funktion und demselben Zweig arbeiten, wie in dieser so genannten "Goldenen Regel des Rebasings" (wie hier erklärt: https : //www.atlassian.com/git/tutorials/merging-vs-rebasing/conceptual-overview )

Ich bin nur überrascht, dass diesbezüglich ein Konsens besteht. Ich habe 3 Jahre mit einer vollständigen Umbasierungsstrategie gearbeitet, wobei ungefähr 20 Entwickler zusammengearbeitet haben und raten Sie mal, was funktioniert hat.

Der Prozess ist im Grunde:

  • Sie erstellen Ihren Feature-Zweig, nennen ihn "myfeature" und verschieben ihn auf origin / myfeature
  • Andere Leute können es ausprobieren und daran arbeiten
  • Manchmal kann es vorkommen, dass Sie es vom Master zurücksetzen: von "myfeature", git rebase origin / master ; und dann, ja, müssen Sie es drücken.
  • Was passiert, wenn andere Leute ihr Commit forcieren wollen? Sie lehnen es einfach ab: git rebase origin / myfeature . So sind sie jetzt im Schnellvorlauf und können ihn ohne Kraftaufwand schieben.

Das einzige Prinzip, das beachtet werden muss, ist, dass der Feature-Zweig jemandem gehört . Der Eigentümer ist der einzige, der Push-Force kann.

Also, ich gebe zu: Sobald Druck ausgeübt wird, besteht die Gefahr, dass Fehler gemacht werden. Das ist richtig. Aber es gibt auch viele Möglichkeiten, Fehler zu beheben, und in den letzten drei Jahren meiner Entwicklung habe ich nicht viele Fehler gesehen, die mich dazu veranlasst haben, und als es dazu kam, haben wir immer einen Weg gefunden, wie wir uns richtig erholen können.

Warum wird diese "Goldene Regel der Wiedergutmachung" so allgemein akzeptiert? Gibt es noch etwas, das ich vermisst habe? Ich verstehe, es erfordert ein Minimum an Organisation (jede Strategie erfordert eine Organisation), aber es funktioniert.


Etwas, das ich vergessen habe, aber es hat seine Bedeutung: In meiner vorherigen Erfahrung verwendeten wir Gerrit als Tool zur Codeüberprüfung. Dies bedeutet, dass es kein Risiko gibt, dass ein Commit verloren geht, wenn jemand ein Commit überträgt, während der Zweigstellenbesitzer einen Rebase ausführt, da er nicht direkt an das Ursprungsrepository, sondern an gerrit übertragen wird. Und da der Brancheninhaber der einzige ist, der das Recht hat, von gerrit Commits einzureichen, war das Risiko, Fehler zu machen, sehr gering.
Joel

Was ist, wenn ich den Feature-Zweig eines anderen in meinem eigenen Zweig zusammenführe?
Winston Ewert

Wenn Ihre Funktion von einer anderen abhängt, können Sie Ihre wahrscheinlich von der anderen abhängen: git rebase origin / otherFeature (ich sage rebase statt merge, da das Ziel darin besteht, den Verlauf linear zu halten). Ich gebe zu, dass die Komplexität all dessen sehr zunimmt, wenn man immer mehr Abhängigkeiten zwischen Zweigen einführt.
Joel

Antworten:


10

Das Problem beim erzwungenen Pushen betrifft nicht Ihren Feature-Zweig und den Master, sondern das Pushen Ihres Masters an den Master eines anderen Benutzers. Bei dieser Synchronisierung wird der Master mit Ihren Änderungen überschrieben, und es wird ignoriert, was auf dem Tipp steht.

In Anbetracht dieser Gefahr gibt es einen Grund, warum Sie es nicht verwenden sollten, es sei denn, die Dinge haben versagt und Sie müssen es unbedingt verwenden, um Reparaturen durchzuführen. Ein SCM-System sollte niemals so gezwungen werden müssen, wenn dies der Fall ist, weil etwas schrecklich schief gelaufen ist (und mein erster Ansatz in solchen Fällen wäre, Sicherungen wiederherzustellen und die Vorgänge zu wiederholen, um den Verlauf intakt zu halten).

Vielleicht ist die Frage, warum Sie überhaupt neu basieren? Für eine "saubere" Geschichte, wenn Features wieder zum Master zurückgebracht werden? Wenn ja, werfen Sie die ganze gute Geschichte der Verzweigung aus rein stilistischen Gründen raus. IMHO Fast-Forward-Zusammenführung ist auch keine bewährte Methode. Sie sollten den gesamten Verlauf beibehalten, damit Sie sehen können, was Sie wirklich getan haben, und anschließend keine bereinigte Version.


Sie können natürlich auf Master ziehen, Rebase setzen und dann Push erzwingen, aber das ist nicht atomar.
Kevin

@gbjbaanb du hast vollkommen recht, bei der Neugründungsstrategie dreht sich alles um Stilgründe / eine besser lesbare Geschichte. Ich versuche nicht zu argumentieren, dass es besser ist oder nicht. Aber es ist möglich, und das ist der Punkt, den ich ansprechen möchte. Natürlich habe ich nicht über Force-Pushing auf Master gesprochen, sondern nur auf Feature-Zweigen.
Joel

4
Meiner Meinung nach war das Design-Feature von sowohl Rebase- als auch Fast-Forward-Merges ein Fehler. Bei SCM geht es darum, den Verlauf zu speichern, damit Sie sehen können, was bei Bedarf passiert ist, und Schnappschüsse für relevante Zeitpunkte erstellen können. Zumindest ist es das, was die meisten Leute wollen, ich denke, Linus wollte, dass die Geschichte für ihn so einfach wie möglich zu lesen ist, und setzte sie daher zu seinem Vorteil ein. IMHO hätte er sich mehr Mühe geben sollen, um Unterschiede zwischen zwei Revisionen besser handhaben zu können (dh die Ansicht sollte einfacher sein, nicht die zugrunde liegende Geschichte)
gbjbaanb

2
Wenn Sie eine Arbeit veröffentlichen, veröffentlichen Sie den ersten Entwurf? Gibt es ein Gesetz, das besagt, dass die Tools, die Sie zum Schreiben des ersten Entwurfs verwenden, nicht zum Bearbeiten zur Veröffentlichung verwendet werden können? Es ist ein Entwicklungswerkzeug. Wenn Sie eine Serie zuverlässig und nachweislich aufbewahren möchten, bewahren Sie sie auf. Wenn Sie es stattdessen zur Veröffentlichung bearbeiten möchten, bearbeiten Sie es. Git ist bei beiden Aufgaben hervorragend.
15.

5

Rebase ist nicht wesentlich, wie Sie sagen, es ist meistens kosmetisch. Manchmal ist es viel einfacher als ein Zusammenführen. Es kann also einen "tatsächlichen" Wert haben, aber nur "manchmal".

Die unsachgemäße Verwendung von Rebase kann kostspielig sein. Es ist unwahrscheinlich, dass Sie Daten verlieren, wenn Sie genug wissen, um nicht in Panik zu geraten und nach Wiederherstellungsverfahren zu suchen, aber "Hey, ich muss eine Weile warten ..." ist nicht großartig. Es ist auch nicht unumgänglich, jemanden Zeit für die Wiederherstellung und das Testen von Forschungsergebnissen zu lassen, wenn er Funktionen hätte hinzufügen oder Fehler beseitigen können (oder mit der Familie zusammenleben).

Mit diesem Kompromiss ist es nicht sehr überraschend, dass "nur sehr wenige Menschen einen Rebase und Forced Push durchführen".

Einige Workflows können das Risiko verringern, z. B. auf "Null, solange Sie sich erinnern, welche Zweige Sie erzwingen dürfen und welche nicht". In Wirklichkeit mögen sie sicher genug sein, um das Risiko zu rechtfertigen, aber die Leute treffen häufig Entscheidungen auf der Grundlage größerer Folklore. Andererseits sind die Vorteile in der Realität ziemlich gering. Wie gering muss das Risiko wirklich sein?


3
"Hey, für eine Weile muss ich niemanden drängen ..." .. klingt nach den alten Zeiten der Verwendung von Visual Source Safe. Ich dachte, git wäre besser als das.
Gbjbaanb

Yep, also machen die Leute Regeln wie "Spiel nicht mit den scharfen Werkzeugen! (Force Push)", damit sie vermeiden können, vermeidbare Wunden zu behandeln!
Stripes

2
@gbjbaanb Ja, Git ist besser als das - wenn du es richtig benutzt. Sich darüber zu beschweren, dass Git nicht in der Lage ist, mit der gleichzeitigen Entwicklung elegant umzugehen, wenn Sie ständig die Commit-Hashes ändern, ist wie sich darüber zu beschweren, dass Autos den Wagen unterlegen sind, weil sie für das Pferd viel schwerer zu ziehen sind. Es ist nicht die Schuld des Tools, dass die Leute darauf bestehen, es falsch zu verwenden ...
Idan Arye

4
Nun, es ist irgendwie die Schuld des Werkzeugs. Git macht VIELE scharfe Kanten sichtbar, und obwohl Git manchmal feststellt, dass sie scharf sind, ist dies häufig nicht der Fall. Wenn Sie es vergleichen, um CVS zu sagen, wo alle scharfen Bits in einem EINZELNEN Unterbefehl sind ("cvs admin"? Es hat eine Weile gedauert ...), der aus dem Weg geht, um zu sagen "das kann Sie schlecht schneiden, nicht wahr Verwenden Sie es, es sei denn, Sie haben ein dringendes Bedürfnis ". Oder andere Versionskontrollsysteme, die Funktionen auslassen, die Schaden anrichten können.
Stripes

4
Das heißt nicht, dass git keine gültigen Designentscheidungen getroffen hat (gruppenbezogene Funktion nach Unterbefehl) ... aber es handelt sich um WAHLEN, und man kann kritisch sein gegenüber Die Wahl, so viele scharfe Kanten zu haben, wie man sie hat, kann kritisch für die Wahl anderer VCS sein, um so viele nützliche Funktionen wegzulassen, "nur weil jemand verletzt werden kann".
Stripes

2

So fügen Sie eine andere Stimme hinzu:

Ja, wenn Sie so arbeiten, wie Sie es beschreiben, gibt es keine Probleme bei der Verwendung rebaseund beim Drücken mit Gewalt. Der kritische Punkt ist: Sie haben eine Vereinbarung in Ihrem Team.

Die Warnungen über rebaseund Freunde gelten für den Fall, dass keine besondere Vereinbarung getroffen wurde. Normalerweise schützt git Sie automatisch, indem es zum Beispiel einen nicht schnellen Vorlauf nicht zulässt. Das Verwenden rebaseund Drücken von Gewalt übersteuert diese Sicherheit. Das ist in Ordnung, wenn Sie noch etwas an Ort und Stelle haben.

In meinem Team werden manchmal auch Feature-Zweige neu sortiert, wenn die Geschichte unübersichtlich geworden ist. Entweder löschen wir den alten Zweig und erstellen einen neuen Zweig mit einem neuen Namen oder wir koordinieren ihn nur informell (was möglich ist, weil wir ein kleines Team sind und sonst niemand in unserem Repository arbeitet).


Beachten Sie, dass das Git-Projekt selbst auch etwas Ähnliches tut: Sie haben einen Integrationszweig, der regelmäßig neu erstellt wird, "pu" ("vorgeschlagene Updates"). Es ist dokumentiert, dass dieser Zweig regelmäßig neu erstellt wird und dass Sie keine neuen Arbeiten darauf aufbauen sollten.


1

Also, ich gebe zu: Sobald Druck ausgeübt wird, besteht die Gefahr, dass Fehler gemacht werden. Das ist richtig. Aber es gibt auch viele Möglichkeiten, Fehler zu beheben, und in den letzten drei Jahren meiner Entwicklung habe ich nicht viele Fehler gesehen, die mich dazu veranlasst haben, und als es dazu kam, haben wir immer einen Weg gefunden, wie wir uns richtig erholen können.

Der Grund, warum Git-Benutzer dazu neigen, geteilte veränderbare Historien zu vermeiden, ist, dass es keine automatische Vermeidung oder Reparatur dieser Probleme gibt. Sie müssen wissen, was Sie tun, und Sie müssen alles manuell reparieren, wenn Sie es vermasseln. Es ist nicht intuitiv und widerspricht dem verteilten Design von Git, genau einer Person Force-Push zu erlauben. Was passiert, wenn diese Person in den Urlaub fährt? Besitzt vorübergehend jemand anderes die Niederlassung? Woher weißt du, dass sie nicht überall herumlaufen, was auch immer der ursprüngliche Besitzer tat? Und was passiert in der Open Source-Welt, wenn sich der Filialinhaber allmählich von der Community entfernt, ohne offiziell abzureisen? Sie könnten viel Zeit verlieren, wenn Sie darauf warten, das Eigentum an einer Zweigstelle an eine andere Person abzugeben.

Das eigentliche Problem ist jedoch Folgendes: Wenn Sie es vermasseln und es nicht sofort bemerken, verschwinden die alten Commits schließlich , wenn genügend Zeit verstrichen ist. An diesem Punkt kann das Problem möglicherweise nicht behoben werden (oder zumindest möglicherweise sehr schwer zu beheben, je nachdem, wie Ihre Backup-Story aussieht - sichern Sie alte Kopien Ihres Git-Repositorys, dh nicht nur Klone?).

Vergleichen Sie dies mit Mercurials Changeset-Entwicklungsarbeit (die, wie ich beachten sollte, noch nicht fertig oder stabil ist). Jeder kann beliebige Änderungen am Verlauf vornehmen, sofern die Änderungssätze nicht als öffentlich markiert sind. Diese Änderungen und Neuerungen können ungestraft durchgeführt werden, ohne dass ein Zweigstellenbesitzer erforderlich ist. Es werden niemals Daten gelöscht. Das gesamte lokale Repository kann nur angehängt werden. Nicht mehr benötigte Änderungssätze werden als veraltet markiert, aber auf unbestimmte Zeit aufbewahrt. Wenn Sie Ihren Verlauf durcheinander bringen (was als normaler Teil Ihres täglichen Workflows behandelt wird), gibt es schließlich einen raffinierten Befehl, um ihn automatisch für Sie zu bereinigen. Dies ist die Art von UX, die die Benutzer erwarten, bevor sie den gemeinsamen Verlauf ändern.


Ich stimme dieser "Git-Philosophie" zu und ich denke auch, dass Philosophien manchmal gehackt werden können :). Im Ernst, wie ich in den Kommentaren festgestellt habe, war das nun vor 3 Jahren der Fall, dass ich Gerrit als Tool zur Codeüberprüfung hatte, das als De-facto-Backup-Tool fungierte und einen solchen potenziellen dramatischen Verlust verhinderte. Jetzt denke ich immer noch, dass Rebase in Ordnung ist, wenn Sie sicher sind, einen Zweig zu "kontrollieren". Selbst in einem Open Source-Projekt, wenn ich ein Feature entwickle und eine Pull-Anfrage öffne, "besitze" ich diese PR. Ich bin der Meinung, dass ich das Recht habe, die Filiale neu zu gründen. Es liegt an mir, meine eigene Arbeit während des Rebasings nicht zu vermasseln ... (1/2)
Joel

... und wenn einige Leute Änderungen an dieser PR vornehmen wollen, sollten sie es mir zuerst sagen, und es ist eine Angelegenheit der Kommunikation. (2/2)
Joel

PS: Danke für den Link zu Changeset Evolution, das ist interessant
Joel

Tatsächlich ist rebase wie zu sagen: "Lassen Sie uns alle meine Arbeiten von Grund auf neu schreiben (vom neuesten Master) und alle meine vorherigen Arbeiten löschen." Wenn Sie dazu in der Lage sind, können Sie die Basis wieder herstellen.
Joel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.