Kann ich den Schnellvorlauf in Git standardmäßig deaktivieren?

263

Ich kann mir nie wirklich eine Zeit vorstellen, in der ich git mergeeher ein Commit als ein Commit zeigen würde git rebaseund nicht möchte. Gibt es eine Möglichkeit, git so zu konfigurieren, dass der Schnellvorlauf standardmäßig deaktiviert ist? Die Tatsache, dass es eine --ffOption gibt, scheint zu implizieren, dass es einen Weg gibt, aber ich kann ihn in der Dokumentation nicht finden.

Jason Baker
quelle
3
Ich verwende die mergeganze Zeit für Filialen, wenn keine Festschreibungen von ihrer Fernbedienung vorgenommen wurden, um sie schnell vorzuspulen. Dies scheint der einfachste und sicherste Weg zu sein. Ich bin neugierig, Sie haben offensichtlich einen Anwendungsfall. Warum sollten Sie jemals ein Merge-Commit erstellen wollen, bei dem auf einer Seite des Zweigs keine Commits vorhanden sind?
CB Bailey
12
Ich verwende Zweige, um eine logische Gruppierung von Commits zu erstellen. Wenn ich also eine Zusammenführung mache, ist es im Grunde eine Möglichkeit zu sagen, dass "diese Commits zusammenpassen". Man kann es sich fast als interaktive Rebase und Squash eines armen Mannes vorstellen. :-)
Jason Baker
13
Das Deaktivieren des schnellen Vorlaufs ist äußerst nützlich, insbesondere wenn Sie einem Modell wie einem erfolgreichen Git-Verzweigungsmodell
folgen
2
Bitte ändern Sie die akzeptierte Antwort in Eric Platons Antwort stackoverflow.com/a/6810687/3408 - Ich habe die Schritte in der akzeptierten Antwort ausgeführt und dann festgestellt, dass es nur für den Hauptzweig im aktuellen Repository war, was albern ist.
rjmunro
3
@ jpmc26 Jeder für sich, denke ich. Ich bin mit diesem Artikel nicht einverstanden. Es ist nicht schwer, die beiden Eltern eines Merge-Commits zu finden, und es zeigt Ihnen genau, welche Änderungen vorgenommen wurden. Dann können Sie diese Änderungen übernehmen und einen anderen Zweig "neu aufbauen". Beim flachen Modell müssen Sie manuell suchen und Kirschen pflücken. Wir entscheiden uns für die Verzweigung. Sicher, es ist komplex, wenn man den gesamten Baum betrachtet, aber das ist die Realität, da mehrere Änderungen parallel auftreten. Wenn Sie alles abflachen, wird nur verborgen, was wirklich passiert ist.
Steinybot

Antworten:

282

Ja, das gibt es --no-ff. Sie können Zusammenführungsoptionen pro Zweig konfigurieren, z

git config branch.master.mergeoptions  "--no-ff"

Fügt Ihrer $(REPO)/.git/configDatei Folgendes hinzu :

[branch "master"]
    mergeoptions = --no-ff

Fußnote: Als ich von meiner Erfahrung sprach, fand ich schließlich, dass das Umschalten auf Schnellvorlauf vor allem für Git-Neulinge hilfreich war. Sobald jedoch das Gefühl für Workflows und Konzepte einsetzt, möchten Sie auf jeden Fall vermeiden, Ihr Protokolldiagramm mit Tonnen sinnloser Zusammenführung zu verwischen Remote ..blarf 'Typ Commits.

Fußnote 2, ein Jahrzehnt später: Die anderen Antworten unten bieten modernere Konfigurationsoptionen, aber tatsächlich möchten Sie heutzutage wahrscheinlich die Standardeinstellungen beibehalten (dh, wann immer möglich, schnell vorspulen), da leere Merge-Commits wirklich nur möglich sind machen es viel schwieriger, über die Geschichte nachzudenken.

conny
quelle
142
Git lernen ist ein bisschen wie Bergsteigen; Aber anstatt mit kleinen Klippen zu beginnen und zu härteren zu gelangen, lässt dich Git immer wieder auf denselben Berg klettern, nur um jedes Mal in unterschiedliche Höhen zu fallen, jedes Mal genauso überrascht, dass die Rettungsleine nicht befestigt war.
Conny
12
@ Thomas: Ja; git pullist git fetch+ git merge.
Michelle Tilley
9
Das sieht gut aus, aber gibt es eine Möglichkeit, dies global für alle Niederlassungen zu tun, anstatt es für jede Niederlassung einrichten zu müssen?
Bwinton
33
Hüte dich vor den Drachen. Diese Option ist gefährlich, genau wie @Thomas sagte ... Jeder Git-Pull erzeugt ein Merge-Commit. git pull --ff überschreibt nicht die mergeoptions = no-ff in der git config.
Dalibor Filus
15
Was ist, wenn ich es einfach satt habe zu tippen git merge --no-ff (branchname)? Und ich möchte git pullso funktionieren, wie es immer war?
Dogweather
341

Es scheint, dass im Thread noch eine Frage offen ist: Wie geht das global (dh für alle Zweige)? Für die Aufzeichnungen können wir Folgendes verwenden:

git config --add merge.ff false

... damit es für alle Zweige im aktuellen Repository gilt. Führen Sie Folgendes aus, damit es auf alle Zweige in allen Repositorys angewendet wird, in denen es nicht ohne die --globalOption (lokale Einstellungen überschreiben global) ausgeführt wurde:

git config --global --add merge.ff false

Aus der Dokumentation :

merge.ff
Standardmäßig erstellt git kein zusätzliches Zusammenführungs-Commit, wenn ein Commit zusammengeführt wird, das ein Nachkomme des aktuellen Commits ist. Stattdessen wird die Spitze des aktuellen Zweigs vorgespult. Wenn diese Variable auf false gesetzt ist, weist sie git an, in einem solchen Fall ein zusätzliches Merge-Commit zu erstellen (entspricht der Angabe der --no-ffOption über die Befehlszeile). Bei der Einstellung "Nur" sind nur solche Schnellvorlaufzusammenführungen zulässig (entspricht der --ff-onlyOption über die Befehlszeile).

Eric Platon
quelle
18
Hinweis: merge.ffwurde in Git 1.7.6 eingeführt. In älteren Versionen ist es nicht wirksam.
Chris Johnsen
2
Für Benutzer von Git 1.7.6 ist dies die beste und einfachste Lösung.
Ryan Lundy
22
Ich benutze dies zusammen mit einem Aliaspuff = "pull --ff --ff-only"
Stigi
11
Theres ist auch (jetzt sehen git-scm.com/docs/git-config ) die Option pull.ff , die eingestellt werden kann nur , was die gleiche wie die Alias tun wird.
Jotomo
1
Vielen Dank, @jotomo. Diese Funktion ist ab Git v2.0.0 verfügbar (ab Commit b814da891e8261b909fc5d9fb07b4e8b13989c2d).
Eric Platon
14

Beim Lesen des Antwortfadens habe ich die folgenden beiden Optionen verwendet

git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible

Nur lose verwandt Ich habe auch festgestellt, dass diese Einstellung Probleme beim Ziehen vermeidet

git config --global pull.rebase true # set up pull to rebase instead of merge
Bastian
quelle
1
git config --global pull.rebase true # beachte 'true' am Ende der Zeile
zowers
Danke @zowers Ich habe das behoben
Bastian