Gibt es in Git eine Möglichkeit, alle Änderungen von einem Zweig in einen anderen zusammenzuführen, aber gleichzeitig zu einem einzigen Commit zu quetschen?
Ich arbeite oft an einer neuen Funktion in einem separaten Zweig und werde regelmäßig festschreiben / pushen - hauptsächlich zur Sicherung oder um das, woran ich arbeite, auf einen anderen Computer zu übertragen. Meistens sagen diese Commits "Feature xxx WIP" oder etwas Redundantes.
Sobald diese Arbeit abgeschlossen ist und ich den WIP-Zweig wieder in den Master zusammenführen möchte, möchte ich alle diese Zwischen-Commits verwerfen und nur ein einziges sauberes Commit durchführen.
Gibt es eine einfache Möglichkeit, dies zu tun?
Wie wäre es alternativ mit einem Befehl, der alle Commits für einen Zweig seit dem Punkt, an dem er verzweigt wurde, unterdrückt?
rebase --squash
Fand es! Der Befehl Zusammenführen hat eine
--squash
OptionAn diesem Punkt wird alles zusammengeführt, möglicherweise in Konflikt geraten, aber nicht begangen. So kann ich jetzt:
quelle
git add .
tun?git add .
Wenn alle nicht ignorierten Dateien im aktuellen Verzeichnis hinzugefügt werden, wäre ich vorsichtig, wenn ich auf diese Weise unbeabsichtigte Dateien abrufen würde.git add .
können Siegit add -u
nur Dateien hinzufügen, die bereits zum Baum hinzugefügt wurden.Probieren Sie
git rebase -i master
Ihren Feature-Zweig aus. Sie können dann alle bis auf eine Auswahl in "Squash" ändern, um die Commits zu kombinieren. Siehe Squashing Commits mit RebaseSchließlich können Sie die Zusammenführung vom Hauptzweig aus durchführen.
quelle
Die Verwendung
git merge --squash <feature branch>
als akzeptierte Antwort schlägt den Trick vor, zeigt jedoch nicht an, dass der zusammengeführte Zweig tatsächlich zusammengeführt wurde.Eine noch bessere Lösung ist daher:
<feature branch>
mitgit merge --squash
Dieses Wiki erklärt die Vorgehensweise im Detail.
quelle
Ich habe meinen eigenen Git-Alias erstellt, um genau dies zu tun. Ich nenne es
git freebase
! Ihr vorhandener unordentlicher, nicht wiederherstellbarer Feature-Zweig wird neu erstellt, sodass er zu einem neuen Zweig mit demselben Namen wird, dessen Commits zu einem Commit zusammengefasst und auf den von Ihnen angegebenen Zweig (standardmäßig Master) neu basiert werden. Ganz am Ende können Sie eine beliebige Commit-Nachricht für Ihren neuen "freebased" -Zweig verwenden.Installieren Sie es, indem Sie den folgenden Alias in Ihre .gitconfig einfügen:
Verwenden Sie es aus Ihrem Feature-Zweig, indem Sie Folgendes ausführen:
git freebase <new-base>
Ich habe dies nur ein paar Mal getestet. Lesen Sie es also zuerst und stellen Sie sicher, dass Sie es ausführen möchten. Als kleine Sicherheitsmaßnahme wird der Start-sha1 gedruckt, sodass Sie Ihren alten Zweig wiederherstellen können sollten, wenn etwas schief geht.
Ich werde es in meinem Dotfiles-Repo auf Github pflegen: https://github.com/stevecrozz/dotfiles/blob/master/.gitconfig
quelle
git merge --squash <feature branch>
ist eine gute Option. Das "Git Commit" zeigt Ihnen alle Feature Branch Branch Commit-Nachrichten mit Ihrer Wahl, um es zu behalten.Für weniger Commit Merge.
git merge do x times --git reset HEAD ^ --soft dann git commit.
Vom Risiko gelöschte Dateien werden möglicherweise zurückgegeben.
quelle
Sie können dies mit dem Befehl "rebase" tun. Nennen wir die Zweige "main" und "feature":
Der Befehl rebase gibt alle Commits für "feature" als ein Commit mit einem übergeordneten Element ab, das gleich "main" ist.
Möglicherweise möchten Sie
git merge main
vorher ausführen,git rebase main
wenn sich "main" seit der Erstellung von "feature" (oder seit der letzten Zusammenführung) geändert hat. Auf diese Weise haben Sie immer noch Ihre vollständige Historie, falls Sie einen Zusammenführungskonflikt hatten.Nach der Rebase können Sie Ihren Zweig mit main zusammenführen, was zu einer schnellen Zusammenführung führen sollte:
Eine gute Übersicht finden Sie auf der Rebase- Seite von Git Conceptually
quelle