Git: Wie kann man alle Commits im „Master“-Zweig quetschen? [duplicate]

Lesezeit: 3 Minuten

Benutzer-Avatar
Milosmen

Ich suche nach einer Möglichkeit zu quetschen alle git-Commits zu einem einzigen großen Commit in master Zweig. Ich verstehe die Konsequenzen dessen, was ich zu tun versuche, völlig, keine Notwendigkeit zu erklären, dass dies gefährlich oder nicht der richtige Weg ist – ich möchte meine gesamte Historie verlieren und dieses Repository in ein einziges großes Commit verwandeln.

Das Hauptproblem ist: Ich habe keine anderen lebenden Zweige, keine lokalen Commits und alle vorherigen Commits haben schon geschoben zu fern master.

Hacky-Skripte sind ebenfalls willkommen.

  • Das erste, was mir in den Sinn kommt: git rebase -i <first-commit-hash>. Verwenden Sie dann die Abfrageersetzungsfunktion Ihres Editors, um alle zu ersetzen pick durch squashund speichern. Dann git push --force.

    – JB Nizet

    24. März 2019 um 16:33 Uhr

  • stackoverflow.com/search?q=%5Bgit%5D+squash+all+commits

    – promov

    24. März 2019 um 17:03 Uhr

  • Hm, es gibt viele Lösungen, also bin ich mir nicht sicher, welche richtig ist

    – Milosmen

    25. März 2019 um 10:48 Uhr


Benutzer-Avatar
eftshift0

Ich würde git reset –soft verwenden

git reset --soft id-of-first-revision-of-master
git commit --amend -m "single commit for master"

Dann können Sie –force überall dort pushen, wo Sie diesen neuen Zweig benötigen.

Aktualisieren

Ich kann mir einen anderen einfachen Weg vorstellen, mit mehr Git-Befehlen:

git checkout --orphan some-branch
git commit -m "First commit"
git branch -f master # move the local branch
git checkout master
git branch -d some-branch # delete the temp branch

Es könnte auch so gemacht werden, in einer hackigeren Art und Weise:

git commit-tree -m "First commit" HEAD^{tree}

Das wird eine Überarbeitung schreiben …. wenn Sie es auschecken, werden Sie eine einzige Überarbeitung haben, der Inhalt wird genau so sein, wie er vorher war …. fühlen Sie sich frei, den lokalen Zweig zu verschieben (wie in der erklärt vorheriges Rezept)

  • das hat mir den Tag versüßt

    – hafizhanindito

    26. Mai 2020 um 11:31 Uhr

  • @eftshift0 der Git-Befehl git checkout --orphan -b some-branch verursacht einen Fehler fatal: 'some-branch' is not a commit and a branch '-b' cannot be created from it. Meinten Sie eigentlich git checkout --orphan some-branch?

    – Boris

    25. März 2021 um 17:46 Uhr


  • könnte ohne das -b sinnvoll sein. Ich meine, wenn Sie auschecken --orphandann ist es ein Neu Zweig, oder? Dann muss -b nicht angegeben werden. Vielleicht ist das die Logik.

    – eftshift0

    25. März 2021 um 17:56 Uhr

Sie können den Verlauf im Upstream immer noch ändern, indem Sie verwenden git push --force-with-lease. Allerdings muss man sich der Konsequenzen bewusst sein.

Verwenden git push --force erstellt einen parallelen Baum auf Ihrem Upstream, sodass sich alle Entwickler in einem Legacy-Zweig verlieren können.

Um Ihren Verlauf zu komprimieren, tun Sie einfach:

git rebase -i HEAD~10

Wo 10 ist die Anzahl + 1 der Commits, die Sie zusammenquetschen möchten. Wenn Sie quetschen wollen alle die Commits, dann verweisen Sie einfach Ihre <first-commit-hash> Anstatt von HEAD~10. Dann auf den Editor, den Sie auswählen squash für alle Commits, die Sie gruppieren möchten. Sie können suchen/ersetzen: pick durch squash

Wenn Sie fertig sind, übertragen Sie einfach Ihre Änderungen:

git push --force-with-lease

Ich würde es niemals empfehlen --force denn wenn ein anderer Entwickler in der Zwischenzeit einen Commit gepusht hat, löschen Sie seine Verschiebung. Durch die Nutzung --force-with-lease Git wird Sie daran hindern, zu pushen, wenn jemand anderes oben auf Ihre letzte Änderung gepusht hat (siehe diese Frage für weitere Details).

  • Ich glaube, anstatt die zu verwenden <first-commit-hash>können Sie verwenden git rebase -i --root bis zum ursprünglichen Commit umzubasieren

    – Ru Chern Chong

    24. März 2019 um 17:06 Uhr

  • Das --root Parameter macht den Trick für mich. Die Lösung mit HEAD~number oder der erste Commit-Hash funktioniert bei mir nicht – sie enden mit zwei Commits – nicht dem einzigen.

    – eNca

    18. Oktober 2020 um 20:41 Uhr

1101180cookie-checkGit: Wie kann man alle Commits im „Master“-Zweig quetschen? [duplicate]

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

Privacy policy