Git: Wie kann man alle Commits im „Master“-Zweig quetschen? [duplicate]
Lesezeit: 3 Minuten
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.
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
11011800cookie-checkGit: Wie kann man alle Commits im „Master“-Zweig quetschen? [duplicate]yes
Das erste, was mir in den Sinn kommt:
git rebase -i <first-commit-hash>
. Verwenden Sie dann die Abfrageersetzungsfunktion Ihres Editors, um alle zu ersetzenpick
durchsquash
und speichern. Danngit 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