Warum kann ich git merge –squash nicht mit –no-ff verwenden?

Lesezeit: 4 Minuten

Ich versuche, den git merge –squash mit dem Parameter –no-ff zu verwenden, aber git lässt dies nicht zu. Hat jemand einen Vorschlag, mir zu helfen?

Ich kann Fast Forward Merge nicht verwenden und muss den Parameter –squash verwenden, um viele Commits zu gruppieren, die in einem anderen Zweig vorgenommen wurden.

Vielen Dank!

Benutzer-Avatar
römisch

Es lässt Sie wahrscheinlich nicht, weil ein solcher Befehl keinen Sinn machen würde.

Die Dokumentation für --squash sagt (Hervorhebung von mir):

–quetschen
Erstellen Sie den Arbeitsbaum und den Indexstatus als ob eine echte Verschmelzung stattgefunden hätte (mit Ausnahme der Zusammenführungsinformationen), aber nehmen Sie nicht wirklich einen Commit vor oder bewegen Sie den HEAD, noch nehmen Sie GIT_DIR/MERGE_HEAD auf, um zu bewirken, dass der nächste Git-Commit-Befehl einen Merge-Commit erstellt. Auf diese Weise können Sie einen einzelnen Commit über dem aktuellen Zweig erstellen, dessen Effekt der gleiche ist wie das Zusammenführen eines anderen Zweigs (oder mehr im Falle eines Oktopus).

Das --no-ff Flagge tut:

Erstellen Sie ein Merge-Commit selbst wenn die Zusammenführung als schneller Vorlauf aufgelöst wird.

Sie bitten Git im Wesentlichen, einen Commit zu machen und NICHT gleichzeitig einen Commit zu machen.

Wenn Sie den gesamten Verlauf Ihres Zweigs bewahren möchten, sollten Sie die verwenden --no-ff Flagge. Commit d ist ein Merge-Commit, das zwei Eltern hat, a und c.

a ------ d -- ....
 \      /
  b -- c  

Wenn Sie möchten, dass alle Commits in diesem Zweig als eine einzige Arbeitseinheit behandelt werden, verwenden Sie --squash. Commit d ist ein reguläres Commit, das alle Änderungen aus den Commits b und c enthält, aber nur einen Elternteil hat, a.

a ---- d -- ....
 \      
  b -- c  

  • Vielen Dank! Mir ist aufgefallen, dass der Squash die Änderungen nie festschreibt, sondern nur zusammenführt und dann die Dateien, die zusammengeführt wurden, “git addiert”. Ist das wirklich so oder bin ich verrückt? Entschuldigung für das schlechte Deutsch 🙁

    – Guilherme Chiara

    14. Januar 2013 um 16:37 Uhr


  • @GuilhermeChiara Nein, laut Dokumentation soll es so funktionieren. Nur aus Neugier, warum haben Sie die akzeptierte Antwort geändert?

    – Römisch

    14. Januar 2013 um 18:49 Uhr


  • Vielen Dank für die visuellen Zweigdiagrammmuster.

    – ilovet

    2. Mai 2013 um 16:40 Uhr

Benutzer-Avatar
manojlds

Was macht --squash tun? – Es quetscht alle Commits zusammen und erstellt Ihren Indexstatus so, dass Sie alle Änderungen aus dem Zweig als ein einziges Commit festschreiben können. Die Änderung in Ihrem Code wird so sein, als ob Sie den Zweig zusammengeführt hätten, aber Ihr Verlauf wird so aussehen, als hätten Sie einen riesigen Commit gemacht.

Was macht --no-ff tun? – Es heißt, auch wenn der Zweig schnell vorgespult werden kann, behandeln Sie ihn als Merge und erstellen Sie einen Merge-Commit.

Als solche, --squash geht es darum, eine Geschichte ohne eine Spur von Merge zu erhalten. --no-ff geht es darum, einen Verlauf mit Merge zu erzwingen, selbst wenn er weitergeleitet wird. Als solche schließen sie sich gegenseitig aus und können nicht zusammen verwendet werden.

Ich denke, die Frage ergibt sich aus einem Missverständnis von fast-forward. Es ist keine Zusammenführung; Es geht nur darum, einen Branch direkt zu einem anderen Commit aus dem zusammengeführten Branch weiterzuleiten, da die Commits direkt auf den Commits im vorherigen Branch durchgeführt wurden. Kein schneller Vorlauf stoppt dieses Verhalten und erzwingt zusätzlich einen Merge-Commit. Wenn Sie quetschen, spielt es keine Rolle, ob Sie es bitten, nicht vorzuspulen. Es wäre so oder so ähnlich.

  • “Ich denke, die Frage ergibt sich aus einem Missverständnis des schnellen Vorlaufs.” Wahrscheinlicher ist, dass es vom Erhalten des Fehlers kommt fatal: Not possible to fast-forward, aborting. wegen Einstellung merge.ff zu only in .gitconfig, dann immer fatal: You cannot combine --squash with --no-ff. beim Ausprobieren der --no-ff Flagge.

    – jpmc26

    12. Januar 2016 um 12:04 Uhr


  • @ jpmc26 Ich stimme zu 🙂 Diese Frage wird hier behandelt. Kurze Antwort: tun git -c merge.ff merge --squash <args>

    – Greg Sadetsky

    26. April 2017 um 18:26 Uhr

  • @GregSadetsky Du hast meine eigene Frage darauf verlinkt. lol! Beachten Sie, dass mein vorheriger Kommentar der Frage mehrere Monate vorausgeht.

    – jpmc26

    26. April 2017 um 20:08 Uhr

  • Ha! Ich habe es nicht bemerkt. Prost 🙂

    – Greg Sadetsky

    27. April 2017 um 23:40 Uhr

Diese Antwort hat nichts mit Ihrer eigentlichen Frage zu tun:

Warum kann ich git merge –squash nicht mit –no-ff verwenden?

da das schon richtig beantwortet wurde.

Sondern um deutlich zu machen, dass das, was Sie wollten, tatsächlich mit einem etwas anderen Ansatz möglich ist: Sie würden rebase interaktiv Ihren Feature-Zweig zuerst (z. B. um alle Ihre Commits zu quetschen) und danach könnten Sie git merge --no-ff die Verzweigung auf Master.

Überprüfen Sie Ihre GIT-Konfiguration mit den Befehlen:

git config --global -l
git config --local -l

Wenn es enthält merge.ff=falsewird die Option –no-ff in Ihrer angenommen git squash Befehle, die das obige Problem verursachen. Sie können diese Option aus Ihrer Konfiguration entfernen mit:

git config --global -unset merge.ff
git config --local -unset merge.ff

oder bearbeiten Sie direkt Ihre .gitconfig-Datei.

1262690cookie-checkWarum kann ich git merge –squash nicht mit –no-ff verwenden?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy