Git Fast Forward VS kein Fast Forward Merge

247

Mit Git Merge können wir einen schnellen Vorlauf und kein schnelles Zusammenführen von Zweigen durchführen. Irgendwelche Ideen, wann die Schnellvorlaufzusammenführung verwendet werden soll und wann keine Schnellvorlaufzusammenführung verwendet werden soll?

Chau Chee Yang
quelle
2
Ich denke, eine andere wirklich gute Perspektive kann hier gefunden werden endoflineblog.com/gitflow-considered-harmful
Dmitry
Selbe Frage? stackoverflow.com/questions/9069061
Yousha Aleayoub

Antworten:

290

Die --no-ffOption ist nützlich , wenn Sie eine klare Vorstellung von Feature - Zweig haben wollen. Selbst wenn in der Zwischenzeit keine Festschreibungen vorgenommen wurden, ist FF möglich. Manchmal möchten Sie dennoch, dass jede Festschreibung in der Hauptzeile einer Funktion entspricht. Sie behandeln also einen Feature-Zweig mit einer Reihe von Commits als eine Einheit und führen sie als eine Einheit zusammen. Aus Ihrem Verlauf geht hervor, wann Sie einen Feature-Zweig zusammenführen--no-ff .

Wenn Sie sich nicht für so etwas interessieren, könnten Sie wahrscheinlich mit FF davonkommen, wann immer es möglich ist. Auf diese Weise haben Sie ein besseres Gefühl für den Workflow.

Zum Beispiel ist der Autor dieses Artikels der Ansicht, dass die --no-ffOption Standard sein sollte, und seine Argumentation entspricht in etwa der oben beschriebenen:

Stellen Sie sich die Situation vor, in der eine Reihe kleinerer Commits im Zweig "Feature" zusammen ein neues Feature bilden: Wenn Sie nur "git merge feature_branch" ohne --no-ff" ausführen , ist aus dem Git-Verlauf nicht ersichtlich , welche Commit-Objekte zusammen vorhanden sind Implementierung einer Funktion - Sie müssten alle Protokollnachrichten manuell lesen. Das Zurücksetzen einer gesamten Funktion (dh einer Gruppe von Commits) ist ein echtes Problem [wenn --no-ffes nicht verwendet wird], wohingegen dies leicht möglich ist, wenn das --no-ffFlag verwendet wurde [weil es ist nur ein Commit]. "

Grafik, die zeigt, wie --no-ff alle Commits vom Feature-Zweig zu einem Commit im Master-Zweig zusammenfasst

Ivan Danilov
quelle
3
Und der schnelle Vorlauf ist ideal, wenn Sie eine Sammlung eng verwandter Branchen haben, die Sie ab und zu einfach zusammen bewegen möchten. Nicht alle Zusammenführungen sind reale Ereignisse.
Cascabel
3
Warum dann mehrere Filialen unterhalten? Wenn sie eng miteinander verbunden sind - warum nicht alles in einem Zweig erledigen?
Ivan Danilov
11
Eng verwandt heißt nicht identisch. Außerdem ist der Workflow nicht immer ordentlich. Sie machen nicht immer die Commits, von denen Sie denken, dass Sie sie machen werden, Sie verzweigen sich nicht immer vom besten Ort. Vielleicht starten Sie ein paar Features von einem Ort aus, arbeiten an einem davon, stellen fest, dass es generisch ist, und spulen den anderen schnell vor, bevor Sie auseinander gehen.
Cascabel
2
Nach meinem Verständnis möchte OP wissen, welche Best Practices zu befolgen sind. Dinge passieren und nicht alles ist ideal, aber dies scheint eher ein erzwungener Kompromiss zu sein.
Ivan Danilov
1
Es ist erwähnenswert, dass die Vorteile --no-ffIhres Commit-Verlaufs möglicherweise nicht sofort ersichtlich sind, wenn Sie grundlegende Tools wie verwenden git log, mit denen weiterhin alle Commits aus allen Zweigen angezeigt werden , die in Ihrem aktuellen Zweig zusammengeführt wurden. Die Vorteile werden jedoch deutlicher, wenn z. B. git log --first-parentin einem Integrationszweig wie developoder verwendet wird master. Wenn Sie religiös verwenden --no-ff, werden ausschließlich Zusammenführungsanforderungen angezeigt, während git logdennoch ein (umfassenderer) Verlauf angezeigt wird. Deshalb empfiehlt Vincent es für die Verwendung mit GitFlow .
Jeremy Caney
12

Ich kann ein Beispiel geben, das häufig im Projekt zu sehen ist.

Hier erstellt die Option --no-ff(dh echte Zusammenführung ) ein neues Commit mit mehreren übergeordneten Elementen und bietet eine bessere Verlaufsverfolgung. Andernfalls ist --ff(dh Schnellvorlaufzusammenführung ) standardmäßig aktiviert.

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) Beachten Sie, dass newFeaturegit hier eine --no-ffZusammenführung durchführen muss , wenn der Zweig wiederverwendet wird, anstatt einen neuen Zweig zu erstellen . Dies bedeutet, dass eine schnelle Vorwärtszusammenführung nicht immer zulässig ist.

Themenfeld
quelle
6

Wenn wir an einer Entwicklungsumgebung arbeiten und unseren Code mit dem Staging- / Produktionszweig zusammenführen, kann Git kein schneller Vorlauf eine bessere Option sein. Wenn wir in der Entwicklungsabteilung für ein einzelnes Feature arbeiten, haben wir normalerweise mehrere Commits. Das Verfolgen von Änderungen mit mehreren Commits kann später unpraktisch sein. Wenn wir mit dem Staging- / Produktionszweig über Git keinen schnellen Vorlauf zusammenführen, hat er nur 1 Commit. Wenn Sie die Funktion jetzt zurücksetzen möchten, setzen Sie das Commit einfach zurück. Das Leben ist einfach.

Pritom Nandy
quelle
0

Es ist auch möglich, dass Sie personalisierte Feature-Zweige haben möchten, in denen der Code erst am Ende des Tages platziert wird. Dies ermöglicht es, die Entwicklung detaillierter zu verfolgen.

Ich möchte die Master-Entwicklung nicht mit nicht funktionierendem Code verschmutzen, daher ist --no-ff möglicherweise genau das, wonach man sucht.

Nebenbei bemerkt, es ist möglicherweise nicht erforderlich, Arbeitscode für einen personalisierten Zweig festzuschreiben, da der Verlauf neu geschrieben git rebase -iund auf dem Server erzwungen werden kann, solange niemand anderes an demselben Zweig arbeitet.

g24l
quelle