Git: Nur die Nachrichten früherer Commits bearbeiten

12

Aus faulen Gründen habe ich eine Reihe von Commits mit Standardnachrichten gepusht, und jetzt ist es umständlich geworden, da ich nicht wirklich weiß, was ich bei jedem Commit geändert habe.

Wie bearbeite ich nur die Nachrichten früherer Commits und behalte (wenn möglich) den Commit-Baum?

Tuyen Pham
quelle
10
Hüten Sie sich vor einer Veränderung der öffentlichen Geschichte!
D. Ben Knoble
2
Ich fürchte, die Antworten hier geben Ihnen nicht annähernd genug Warnungen. Dies wird ein großes Durcheinander verursachen, wenn jemand in der Zwischenzeit Ihre Geschichte gezogen hat - umso mehr, wenn er darüber hinaus neue Arbeit geleistet hat!
Eevee
Ich werde es mit Grund verwenden, ich habe hier einen einfacheren Fall, ich bin der einzige, der dieses Repo verwendet.
Tuyen Pham
3
Info: Dies wird bereits (möglicherweise mehrmals) beim Stapelüberlauf abgefragt .
user202729

Antworten:

20

Um die Festschreibungsnachrichten einer Reihe von Festschreibungen zu bearbeiten, führe ich aus

git rebase -i firstsha

Wo firstshaist eine Kennung für das übergeordnete Commit des ersten Commits, das ich bearbeiten möchte? (Sie können hier eine beliebige gültige Referenz verwenden, git rebase -i HEAD~4um die letzten vier Commits anzuzeigen.)

Ändern Sie im sich öffnenden Editor alle "Auswahl" -Einträge in "Umformulieren" für Commits, die Sie ändern möchten, und schließen Sie dann den Editor. Sie werden dann aufgefordert, Festschreibungsnachrichten für alle von Ihnen ausgewählten Festschreibungen einzugeben.

Beachten Sie, dass dadurch der Festschreibungsbaum geändert wird , da sich die Hashes der Festschreibungen ändern. Sie müssen Ihren neuen Baum erzwingen oder auf einen neuen Zweig verschieben. Außerdem werden Zusammenführungen durcheinander gebracht. Vermeiden Sie daher das Bearbeiten von Zusammenführungs-Commits.

Führen Sie aus, um nur das letzte Commit schnell zu bearbeiten

git commit --amend

(aber hüte dich vor allem, was für das Festschreiben inszeniert ist).

Stephen Kitt
quelle
Wie würde sich dies auf den Festschreibungsbaum auswirken? Wird eine vertikale Zwischenlinie im Festschreibungsbaum erstellt? Ich hatte jetzt nur einen Commit-Baum für vertikale Linien, und über 100 Nachrichten müssen geändert werden.
Tuyen Pham
3
Es wird keine neue "Zeile" in Ihrem Commit-Baum erstellt, sondern alle Commits werden geändert. Wenn Ihr Verlauf derzeit linear ist, bleibt er linear.
Stephen Kitt
Es hängt davon ab, ob. Verwenden Sie es selbst und pushen Sie nicht auf einen Server? Dann nein, nur eine "Zeile". Andernfalls könnten es zwei sein, und basierend auf Ihren Antworten auf die ersten beiden können wir Ihnen helfen, die alte "Linie" loszuwerden.
Captain Man
1
Rebase hat eine Flagge, um Zusammenführungen zu handhaben (ich denke es ist preserve-merges)
D. Ben Knoble
6

Was Sie suchen, ist git rebase.

Wenn Sie nur die vorherige git commitNachricht ändern möchten, müssen Sie nur Folgendes verwenden:

git commit --amend

Nehmen Sie die gewünschten Änderungen am vorherigen Commit vor und speichern Sie die Änderungen.

Wenn Sie jedoch ältere Commits ändern müssen, müssen Sie diese verwenden rebase.

git rebase -i HEAD~N 

Dabei entspricht N der Anzahl der Commits, zu denen Sie zurückkehren möchten, z. B. 2 oder 12 oder 6 usw. usw.

Hier sollten Sie einen Texteditor mit Ihren Commits erhalten. Ändern Sie die Option von pickbis reword, um die Nachricht zu ändern.

Wenn Sie alle Commits identifiziert haben, die Sie ändern möchten, und deren Optionen entsprechend geändert haben, speichern und schließen Sie den Editor. Nehmen Sie dann die Änderungen an jeder Festschreibungsnachricht vor. Sobald Sie zufrieden sind, können Sie laufen:

git push --force

Und Sie sollten Ihren Git-Verlauf beibehalten, wenn auch mit unterschiedlichen Hash-Werten, da Sie die erforderlichen Änderungen vorgenommen haben. Hier sind einige zusätzliche Links, die Sie überprüfen sollten:

7.6 Git Tools - Umschreiben des Verlaufs
GitHub-Hilfe - Ändern einer Commit-Nachricht
StackOverflow - Frage zum Ändern alter Commit-Nachrichten

kemotep
quelle
Wenn Sie "umformulieren", müssen Sie nicht " commit --amend", es sei denn , Sie bringen den Festschreibungsprozess irgendwie durcheinander.
Stephen Kitt
Danke, hier sind die Schritte , die ich als mein Verständnis aus Ihrem Post tun werde: 1. tun , git rebase -i firstshadass firstshaEltern Hash zu begehen ist von der Commit , dass ich die Nachricht, dann in Editor, ändern sich ändern wollen würde , pickum reword, enterneue Nachricht, dann Ausgabe git rebase --continueund tun git push --force?
Tuyen Pham
@ StephenKitt, ich habe gerade deine Antwort bemerkt, ich habe meine gemacht, als du deine eingereicht hast. Ich werde Ihrem Rat folgen und versuchen, diese Änderungen vorzunehmen. Wenn es angemessener ist, kann ich meine Antwort in Ihre einfügen, indem ich die Links zu Ihrer hinzufüge, wenn Sie der Meinung sind, dass dies besser zu dieser Frage passt, als mehrere ähnliche Antworten zu haben.
Kemotep
@ TuyenPham Sie müssen nur damit tun, dass git rebase -i HEAD~NN die Anzahl der Commits ist, die Sie zurück möchten. Ändern Sie jede Option verpflichten, den Sie bearbeiten möchten die Botschaft aus pickzu reword, speichern Sie diese Datei, die Änderungen an jedem dieser begehen Dateien und speichern diese. Sobald Sie sicher sind, dass Sie fertig sind, brauchen Sie nur noch git push --force [Name of git branch you are were working on]. Sie können jederzeit zurückgehen und dies erneut oder schrittweise tun.
Kemotep