Diese Frage bezieht sich nicht nur darauf, wie diese Aufgabe zu erfüllen ist, sondern auch darauf, ob dies mit Git eine gute oder eine schlechte Praxis ist.
Bedenken Sie, dass ich lokal am meisten am Hauptzweig arbeite, aber einen aktuellen Zweig erstellt habe, den ich "topical_xFeature" nennen werde. Während ich an "topical_xFeature" arbeite und hin und her wechsle, um andere Arbeiten am Hauptzweig auszuführen, habe ich mehr als ein Commit für den Zweig "topical_xFeature" ausgeführt, aber zwischen jedem Commit habe ich nein getan drücken.
Erstens , würden Sie diese schlechte Praxis in Betracht ziehen? Wäre es nicht klüger, sich an ein Commit pro Zweig und Push zu halten? In welchen Fällen wäre es gut, mehrere Commits in einem Zweig zu haben, bevor ein Push ausgeführt wird?
Zweitens , wie kann ich am besten erreichen, dass die mehreren Commits im Zweig topical_xFeature für einen Push in den Hauptzweig gebracht werden? Ist es ein Ärgernis, sich keine Sorgen zu machen und nur den Push auszuführen, bei dem mehrere Commits gepusht werden, oder ist es weniger ärgerlich, die Commits irgendwie zu einem zusammenzuführen und dann zu pushen? Wie geht das nochmal?
quelle
git branch -d topic
. Warum kann git nicht erkennen, dass alle Änderungen zusammengeführt wurden?git branch -D topic
zu löschen, um ihn zwangsweise zu löschen.Auf diese Weise befolge ich im Allgemeinen mehrere Commits zu einem einzigen Commit, bevor ich den Code weitergebe.
Um dies zu erreichen, schlage ich vor, dass Sie das von GIT bereitgestellte Squash -Konzept verwenden.
Befolgen Sie die folgenden Schritte.
1) git rebase -i master (anstelle von master können Sie auch ein bestimmtes Commit verwenden)
Öffnen Sie den interaktiven Rebase-Editor, in dem alle Ihre Commits angezeigt werden. Grundsätzlich müssen Sie die Commits identifizieren, die Sie zu einem einzigen Commit zusammenführen möchten.
Stellen Sie sich vor, dies sind Ihre Commits und zeigen Sie so etwas im Editor.
Es ist wichtig zu beachten, dass diese Commits in der umgekehrten Reihenfolge aufgelistet werden, als Sie sie normalerweise mit dem Befehl log sehen. Das heißt, das ältere Commit wird zuerst angezeigt.
2) Ändern Sie 'pick' in 'squash' für die letzten festgeschriebenen Änderungen. so etwas wie unten gezeigt. Wenn Sie dies tun, werden Ihre letzten 2 Commits mit dem ersten zusammengeführt.
Sie können auch eine Kurzform verwenden, wenn Sie viele Commits kombinieren müssen:
Zum Bearbeiten mit 'i' wird der Editor zum Einfügen aktiviert. Beachten Sie, dass die meisten (ältesten) Commits nicht gequetscht werden können, da es kein vorheriges Commit gibt, mit dem sie kombiniert werden können. Also muss es ausgewählt werden oder 'p'. Verwenden Sie 'Esc', um den Einfügemodus zu verlassen.
3) Speichern Sie nun den Editor mit dem folgenden Befehl. : wq
Wenn Sie das speichern, haben Sie ein einziges Commit, das die Änderungen aller drei vorherigen Commits übernimmt.
Hoffe das wird dir helfen.
quelle
git rebase -i HEAD~2
ein hilfreicher Ort für mich, um anzufangen. Dann war diese Antwort hilfreich. Danngit status
zeigte ich "Ihr Zweig und 'origin / feature / xyz' sind auseinander gegangen und haben jeweils 1 und 1 verschiedene Commits." So musste ichgit push origin feature/xyz --force-with-lease
sehen stackoverflow.com/a/59309553/470749 und freecodecamp.org/forum/t/...Erstens : Nichts sagt Ihnen, dass Sie nur einen Commit pro Zweig pro Push haben sollen: Ein Push ist ein Veröffentlichungsmechanismus, mit dem Sie einen lokalen Verlauf (dh eine Sammlung von Commits) auf einem Remote-Repo veröffentlichen können.
Zweitens : a
git merge --no-ff topical_xFeature
würde auf Master als einzelnes Commit Ihre Themenarbeit aufzeichnen, bevor Sie pushenmaster
.(Auf diese Weise bleiben Sie
topical_xFeature
für weitere Entwicklungen, die Siemaster
bei der nächsten Zusammenführung als einzelnes neues Commit aufzeichnen können - no-ff.Wenn
topical_xFeature
das Ziel das Entfernen ist,git merge --squash
ist dies die richtige Option, wie in Brian Campbell beschrieben ‚s Antwort .)quelle
--squash
ist nicht--no-ff
was du willst.--no-ff
würde ein Merge-Commit erstellen, aber auch alle Commits von belassentopical_xFeature
.topical_feature
Verzweigung beibehalten und nur ein einzelnes Commit für diemaster
Verzweigung aufzeichnen wollte .Wechseln Sie zur Hauptniederlassung und stellen Sie sicher, dass Sie auf dem neuesten Stand sind.
git fetch
Dies kann erforderlich sein (abhängig von Ihrer Git-Konfiguration), um Updates zu Origin / Master zu erhaltenFühren Sie den Feature-Zweig in den Hauptzweig ein.
Setzen Sie den Hauptzweig auf den Ursprungsstatus zurück.
Git betrachtet nun alle Änderungen als nicht bereitgestellte Änderungen. Wir können diese Änderungen als ein Commit hinzufügen. Hinzufügen. fügt auch nicht verfolgte Dateien hinzu.
Ref: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit
quelle
Wählen Sie zuerst aus, nach welchem Commit alles kommen soll.
Auf den ausgewählten Kopf zurücksetzen (ich habe ausgewählt
HEAD@{2}
)git status
(Nur um sicher zu gehen)Fügen Sie Ihr neues Commit hinzu
Hinweis:
HEAD@{0}
&HEAD@{1}
Sind jetzt zu einem Commit zusammengeführt, kann dies auch für mehrere Commits durchgeführt werden.git reflog
sollte wieder anzeigen:quelle
Ein Tool zum Automatisieren mehrerer Commits in einem
wie Kondal Kolipaka sagt . Verwenden von "git rebase -i"
Die Logik von "Git Rebase"
Bei Verwendung von "git rebase -i" generiert git die git-rebase-todo-Datei im aktuellen .git / rebase-merge-Verzeichnis und ruft dann den git-Editor auf, damit Benutzer die git-rebase-todo-Datei zur Verarbeitung bearbeiten können. Das Tool muss also Folgendes erfüllen:
Ändern Sie den Standard-Git-Editor
Daher muss das Tool den Git-Editor ändern und die Git-Rebase-ToDo-Datei verarbeiten. Das Tool mit Python unten:
Ref: https://liwugang.github.io/2019/12/30/git_commits_en.html
quelle