Ich habe einen Remote-Git-Server. Hier ist das Szenario, das ich ausführen möchte:
Für jeden Fehler / jede Funktion erstelle ich einen anderen Git-Zweig
Ich schreibe meinen Code in diesem Git-Zweig weiterhin mit nicht offiziellen Git-Nachrichten fest
Im Top-Repository müssen wir ein Commit für einen Fehler mit der offiziellen Git-Nachricht durchführen
Wie kann ich meinen Zweig mit dem Remote-Zweig zusammenführen, sodass er nur ein Commit für alle meine Check-Ins erhält (ich möchte sogar eine Commit-Nachricht dafür bereitstellen)?
git
git-merge
git-squash
SunnyShah
quelle
quelle
git merge --squash
macht alles auf einmal in der Kommandozeile und Sie hoffen nur, dass es funktioniert.git rebase -i
Ruft einen Editor auf und lässt Sie die Rebase optimieren. Es ist langsamer, aber Sie können sehen, was Sie tun. Es gibt auch Unterschiede zwischen Rebase und Merge, die etwas zu aufwendig sind, um in einem Kommentar behandelt zu werden.merge --squash
vom alten zum neuen und führen Sie dann den neuen Zweig zum Master zusammen. Der alte Zweig ist veraltet.Antworten:
Angenommen, Ihr Bugfix-Zweig wird aufgerufen
bugfix
und Sie möchten ihn zusammenführen inmaster
:Dadurch werden alle Commits aus dem
bugfix
Zweig übernommen, zu einem Commit zusammengefasst und mit Ihremmaster
Zweig zusammengeführt.Erklärung :
Wechselt zu Ihrer
master
Niederlassung.Nimmt alle Commits aus der
bugfix
Filiale und führt sie mit Ihrer aktuellen Filiale zusammen.Erstellt ein einzelnes Commit aus den zusammengeführten Änderungen.
Durch Weglassen des
-m
Parameters können Sie einen Entwurf einer Festschreibungsnachricht ändern, der jede Nachricht aus Ihren gequetschten Festschreibungen enthält, bevor Sie die Festschreibung abschließen .quelle
git commit
(ohne-m
Parameter), können Sie eine entworfene Festschreibungsnachricht ändern, die alle Festschreibungsnachrichten enthält, die Sie gequetscht haben.git commit --amend -m '...'
später tun .git commit
wird die nützliche Festschreibungsnachricht mit allen von Ihnen gequetschten Festschreibungsnachrichten nicht mehr angezeigt. Versuchen Sie es in diesem Fallgit commit --file .git/SQUASH_MSG
(über stackoverflow.com/a/11230783/923560 ).git commit -a --author="Author" --message="Issue title #id"
git merge --squash
Mit dieser Option können Sie ein einzelnes Commit über dem aktuellen Zweig erstellen, dessen Wirkung dem Zusammenführen eines anderen Zweigs entspricht. Der Zusammenführungsdatensatz wird jedoch nicht erstellt, was bedeutet, dass Ihre Pull-Anfrage als Ergebnis keine Änderungen aufweist, jedoch nicht als zusammengeführt markiert wird! Sie müssen also nur diesen Zweig löschen, um dies zu tun.Was mir das schließlich klar machte, war ein Kommentar , der Folgendes zeigte:
ist das Äquivalent zu tun:
Wenn ich einen Feature-Zweig mit 105 (!!) Commits zusammenführen und sie alle zu einem zusammenfassen möchte, möchte ich dies nicht,
git rebase -i origin/master
da ich Zusammenführungskonflikte für jeden der Zwischen-Commits (oder zumindest für diejenigen, die dies tun) separat lösen muss git kann sich nicht selbst herausfinden). Durch die Verwendunggit merge --squash
erhält ich das gewünschte Ergebnis eines einzelnen Commits zum Zusammenführen eines gesamten Feature-Zweigs. Und ich muss höchstens eine manuelle Konfliktlösung durchführen.quelle
git merge master
und erst danngit merge --squash feature
im Master-Zweig durchzuführen .git merge --squash feature
vom Master-Zweig aus spiele ?Sie möchten mit der Squash-Option zusammenführen. Das ist, wenn Sie es einen Zweig nach dem anderen tun möchten.
Wenn Sie alle Zweige gleichzeitig mit einzelnen Commits zusammenführen möchten, müssen Sie zuerst interaktiv neu starten und jedes Feature quetschen, bevor Octopus zusammengeführt wird:
Squash in ein Commit und dann wiederholen für die anderen Funktionen.
Diese letzte Zusammenführung ist eine "Octopus-Zusammenführung", da viele Zweige gleichzeitig zusammengeführt werden.
Hoffe das hilft
quelle
Wenn Sie bereits
git merge bugfix
aktiviert sindmain
, können Sie Ihr Merge-Commit zu einem zusammenfassen mit:quelle
git reset --soft HEAD^1
scheint das letzte vor dem Zusammenführen durchgeführte Commit rückgängig zu machen , zumindest im Falle eines schnellen Vorlaufs.git reset --soft HEAD^<number-of-commits-to-squash>
.Merge
newFeature
Zweig inmaster
mit einem benutzerdefinierten begehen:Wenn Sie es stattdessen tun
git merge --squash newFeature && git commit
Sie erhalten eine Commit-Nachricht, die alle
newFeature
Branch-Commits enthält, die Sie anpassen können.Ich erkläre es hier ausführlich: https://youtu.be/FQNAIacelT4
quelle
Ich weiß, dass es bei dieser Frage nicht speziell um Github geht, aber da Github so weit verbreitet ist und dies die Antwort ist, nach der ich gesucht habe, werde ich sie hier teilen.
Github kann Squash-Zusammenführungen durchführen, abhängig von den für das Repository aktivierten Zusammenführungsoptionen.
Wenn Squash-Zusammenführungen aktiviert sind, sollte die Option "Squash and Merge" in der Dropdown-Liste unter der Schaltfläche "Merge" angezeigt werden.
quelle
Angenommen, Sie haben in feature / task1 mit mehreren Commits gearbeitet.
Gehen Sie zu Ihrem Projektzweig (project / my_project)
Erstellen Sie einen neuen Zweig (feature / task1_bugfix)
Marge mit der
--squash
OptionErstellen Sie ein einzelnes Commit
Schieben Sie Ihren Zweig
quelle
Für Git
Erstellen Sie eine neue Funktion
über Terminal / Shell:
Dadurch wird es nicht festgeschrieben, Sie können es zuerst überprüfen.
Dann schreiben Sie die Funktion aus diesem neuen Zweig fest und beenden sie. Löschen / ignorieren Sie die alte (die, die Sie entwickelt haben).
quelle
Wenn Sie eine Fehlermeldung erhalten: Das Festschreiben ist nicht möglich, da Sie nicht zusammengeführte Dateien haben.
Alle Konfliktdateien wurden behoben
Sie könnten auch verwenden
quelle
So zerquetschen Sie Ihren lokalen Zweig, bevor Sie ihn drücken:
Überprüfen Sie den betreffenden Zweig, um ihn zu bearbeiten, falls er noch nicht ausgecheckt ist.
Finden Sie den sha des ältesten Commits, das Sie behalten möchten.
Erstellen / Auschecken eines neuen Zweigs (tmp1) aus diesem Commit.
git checkout -b tmp1 <sha1-of-commit>
Füge den ursprünglichen Zweig in den neuen zusammen, der zerquetscht wird.
git merge --squash <original branch>
Übernehmen Sie die durch die Zusammenführung erstellten Änderungen mit einer zusammenfassenden Festschreibungsnachricht.
git commit -m <msg>
Kasse des ursprünglichen Zweigs, den Sie quetschen möchten.
git checkout <branch>
Setzen Sie das ursprüngliche Commit zurück, das Sie behalten möchten.
git reset --soft <sha1>
Starten Sie diesen Zweig basierend auf dem neuen Zweig tmp1 neu.
git rebase tmp1
Das war's - löschen Sie jetzt den temporären tmp1-Zweig, sobald Sie sicher sind, dass alles in Ordnung ist.
quelle
Sie können das von mir erstellte Tool verwenden, um diesen Prozess zu vereinfachen: Git-Squash . Um beispielsweise alle Commits für den Feature-Zweig zu quetschen, der vom Master-Zweig verzweigt wurde, schreiben Sie:
quelle