Ist es falsch, Push-Force-Zweige zu geben?


10

Wenn ich an einem Feature-Zweig arbeite, möchte ich die Commits im Zweig mithilfe einer interaktiven Rebase bereinigen, bevor meine Arbeit überprüft und in den Hauptzweig integriert wird.

Während der Entwicklung der Funktion möchte ich meine Zwischenarbeit als Sicherungsmaßnahme in das Remote-Repository übertragen. Das heißt, wenn meine Festplatte abstürzt, möchte ich nicht, dass mein gesamter Feature-Zweig verloren geht.

Dies führt jedoch dazu, dass ich git push --forcenach einer Rebase häufig eine Verbindung zum Remote-Repository herstellen muss, eine Aktion, die im Allgemeinen verpönt ist. Oder wie die verlinkte Github-Seite sagt:

Da das Ändern Ihres Festschreibungsverlaufs für alle anderen Benutzer des Repositorys schwierig sein kann, wird es als schlechte Praxis angesehen, Festschreibungen neu zu begründen, wenn Sie bereits in ein Repository verschoben haben.

Gibt es eine (allgemein akzeptierte) Richtlinie, die diesen Konflikt löst?

Warum ist dies kein Duplikat von Ist der Git "Goldene Regel des Wiederherstellens" so wichtig?

Meine Frage hier fordert eine Richtlinie zur Lösung des Konflikts zwischen dem Wunsch, Ihre Arbeit im Remote-Repository zu sichern und der Neugründung Ihrer Arbeit , während die andere Frage versucht, den Konflikt zu leugnen, und fragt, warum manche Leute glauben, dass der Konflikt überhaupt besteht. und fragt daher, warum "es wichtig ist", keine Force Rebases voranzutreiben?



1
@gbjbaanb Wenn Sie WIP-Commits durchführen, ist eine Rebase sehr nützlich, um zu vermeiden, dass an einem Arbeitstag viele Commits ausgeführt werden. Ich mache oft Commits für kleine Änderungen, nur damit ich bei Bedarf die Option "Auf einen Zustand rückgängig machen, an den ich mich erinnere" habe - die meisten davon sind für den Hauptverlauf des Repos irrelevant / verrauscht (weshalb Rebase so nützlich ist).
Enderland

1
@gbjbaanb Das ist eine Ansichtssache, denke ich. Viele Teams verwenden eine Rebasing-Strategie, um ihre Geschichte sauber zu halten.
Chiel zehn Brinke

1
@enderland Jeder möchte eine schöne Geschichte, es ist immer noch die falsche (und gefährliche) Sache, wie der Link zeigt. Torvalds hätte es niemals einfügen sollen, er hätte stattdessen zulassen sollen, dass Commits "komprimiert" werden.
Gbjbaanb

1
@gbjbaanb aber ... er hat es nicht getan, und so müssen wir mit dem arbeiten, was wir haben. Für mich ist es weitaus nützlicher, ein einzelnes Commit für den Hauptzweig zu haben, als mehr als 30 einzelne und inkrementelle Commits für jeden Feature-Zweig. Aber jeder wird einen anderen Workflow haben, denke ich ...
Enderland

Antworten:


5

Die Schlüsselfrage, die Sie sich stellen sollten:

  • Behalten Sie Ihren Remote-Zweig nach dem Zusammenführen mit dem Master?

Wenn Sie Ihren Remote-Feature-Zweig nach dem Zusammenführen mit dem Master löschen, verlieren Sie bereits den Verlauf. Angenommen, Sie quetschen den Zweig, bevor Sie seine Zusammenführung / PR durchführen, verlieren Sie diesen Verlauf. In diesem Fall können Sie nur Github als Backup verwenden.

Die Situation , wo Sie wollen würde , die Geschichte und nicht die Kraft Push zu halten ist , wenn Ihr Fern Zweig persistierenden , nachdem sie zusammengefügt und nicht nur für einen vorübergehenden Zeitraum existieren.

Ich nehme an, Sie fragen, ob ich den nicht basierten Zweig behalten würde? Nein, AFAIC. Das Push-Forcen kann jedoch theoretisch zum Verlust von Commits anderer Benutzer führen, die auf denselben Zweig pushen

Es hört sich so an, als würden mehrere Personen gleichzeitig auf diesen Zweig drängen. Dies bedeutet, dass Sie sich um die Historie in der Filiale kümmern.

Was Sie stattdessen für Ihre Zwischenarbeit tun könnten, ist eine Gabelung dieses Zweigs zu erstellen. Sie können darauf pushen und dann alle Ihre Commits vor dem Zusammenführen zu einem einzigen Commit zusammenfassen. Wenn Sie sie also in Ihrem Feature-Zweig zusammenführen, haben Sie nur 1 Commit (mit dem neu basierten Verlauf Ihres gesamten Zweigs).


"Behalten Sie Ihren Remote-Zweig, nachdem Sie wieder zum Master verschmolzen sind?" Ich nehme an, Sie fragen, ob ich den nicht basierten Zweig behalten würde? Nein, AFAIC. Das Push-Forcen kann jedoch theoretisch zum Verlust von Commits anderer Benutzer führen, die auf denselben Zweig pushen.
Chiel ten Brinke

@ChaltenBrinke Ich habe ein bisschen darüber bearbeitet. Zu
Ihrer Information

Ich denke, dass das Gabeln als Maßnahme zur Verhinderung der Zerstörung von Commits beim Push-Forcen ein sehr guter Vorschlag ist. Aber AFAIK, es ist nicht wirklich ein Git-Konzept, und Sie benötigen einen Service-Wrapper, um dies einfach zu tun (wie Github). Habe ich recht damit? Oder verwechsle ich Ihre Verwendung des Begriffs "Gabeln" möglicherweise damit, nur einen separaten Zweig zu erstellen?
Chiel zehn Brinke

@ChaltenBrinke Nun, Sie können das Gleiche auf verschiedene Arten erreichen. Wenn sich Ihr Feature-Zweig im Remote-Repository befindet, können Sie das Repo aufteilen und Ihre Version dieses Zweigs haben. Führen Sie diesen Zweig dann nach dem Squashing von Commits in Ihrem Remote-Zweig zusammen. Oder Sie können einfach (möglicherweise featurebranch-local) einen anderen lokalen Zweig erstellen und dann einen aktiven Entwickler für diesen Zweig mit so vielen Commits ausführen, wie Sie möchten. Wenn Sie zusammenführen möchten, quetschen Sie diese Commits und führen Sie sie dann in das Feature ein. Im Grunde genommen mache ich nur Entwickler in einem tatsächlichen temporären Zweig und quetsche / verschmelze dann mit deiner Funktion.
Enderland

Angenommen, das Verzweigen eines Repos ist nicht möglich, da kein Github verwendet wird, würden wir mit einem "privaten" develop-featureZweig arbeiten. Natürlich ist die Privatsphäre rein konventionell und wird durch nichts erzwungen, kann aber Teil einer Richtlinie sein, insbesondere wenn hierfür bestimmte Namenskonventionen für Zweige eingeführt werden. (Vielleicht bin ich gerade zu ängstlich, vielleicht auch nicht :) Die Kombination mit --force-with-leasekann nicht schaden, sollte aber nicht als verlässlich angesehen werden, wie in meinem anderen Beitrag ausgeführt.
Chiel ten Brinke

3

Ich liste hier einige Möglichkeiten auf, die mir in den Sinn kommen.

Basieren Sie immer auf einem neuen Zweig

Wenn Sie einen unordentlichen Zweig haben some-feature, stützen Sie ihn auf einen neuen Zweig. Z.B

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

Dann some-feature-rebaseüberprüft und integriert haben.

Problem: Ein großer Nachteil hierbei ist, dass Sie genau genommen für jede Rebase einen neuen Zweig benötigen. (Sie können mehrere Rebases haben, wenn Sie beispielsweise nach einer Codeüberprüfung Änderungen vornehmen.)

Verwenden git push --force-with-lease

Ich habe gerade etwas über die git push --force-with-leaseAlternativegit push --force gelernt , zu der

weigert sich, einen Zweig zu aktualisieren, es sei denn, dies ist der erwartete Zustand; dh niemand hat den Zweig stromaufwärts aktualisiert.

Problem : Dies scheint sich direkt gegenüber der Situation zu verbessern, in der wir nur verwenden --force, hat aber immer noch einige Einschränkungen, insbesondere wenn ich a git fetchanstelle von a mache git pull, wodurch unsere lokalen Upstream-Zweige aktualisiert werden und der --force-with-leaseEindruck entsteht, dass auf der Fernbedienung keine nicht zusammengeführten Änderungen vorgenommen wurden Ast.

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.