Wie formuliere ich die allererste Git-Commit-Nachricht neu?

116

Ich habe einen Arbeitsbaum mit 3 Commits:

My ~ myproject git: (master) git log

commit a99cce8240495de29254b5df8745e41815db5a75
Author: My Name <[email protected]>
Date:   Thu Aug 16 00:59:05 2012 +0200

    .gitignore edits

commit 5bccda674c7ca51e849741290530a0d48efd69e8
Author: My Name <[email protected]>
Date:   Mon Aug 13 01:36:39 2012 +0200

    Create .gitignore file

commit 6707a66191c84ec6fbf148f8f1c3e8ac83453ae3
Author: My Name <[email protected]>
Date:   Mon Aug 13 01:13:05 2012 +0200

    Initial commit (with a misleading message)

Jetzt möchte ich reworddie Commit-Nachricht meines ersten Commits (6707a66)

My ~ myproject git: (master) git rebase -i 6707

(… Vim betreten)

pick 5bccda6 Create .gitignore file
pick a99cce8 .gitignore edits

# Rebase 6707a66..a99cce8 onto 6707a66
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

In diesem Fall möchte ich die rewordbetreffende Commit-Nachricht ( im Git-Sprachgebrauch) korrigieren :

Erstes Festschreiben (mit einer irreführenden Meldung)

… Zu etwas Passendem.

Es ist nicht überraschend, dass mein obiger Versuch nicht erfolgreich war, da das erste Commit offensichtlich kein übergeordnetes Commit enthält. (Und wenn Sie rebase, müssen Sie das nächstälteste Commit vor dem gewünschten verweisen reword, oder?)

Der Kern meiner Frage: Können Sie dies also auf andere Weise erreichen?

Henrik
quelle
Oder Sie lassen es einfach für alle Zeiten als Repository Tawdry Quirk.
Christopher
4
mögliches Duplikat von Ändern der Nachricht des ersten Commits? (git)
Mark Longair
^ Sehr wahr ... Ich dachte, ich hätte richtig nach dieser speziellen Frage gesucht, aber das ist die gleiche wie meine. Es gibt eine Menge Möglichkeiten, das Copywriting meiner Frage zu perfektionieren. :-P
Henrik
1
@hced: :) Ihr Copywriting wird nicht verschwendet - es wird anderen Menschen helfen, in Zukunft eine Lösung zu finden, auch wenn es als Duplikat geschlossen wird
Mark Longair
2
Jeder, der auf diese Frage stößt, kann meine Antwort auf Ändern der Nachricht des ersten Commits finden? (git) hilfreich sein.

Antworten:

213

Machen git rebase -i --root

( rootZeigen Sie auf , anstatt auf ein bestimmtes Commit zu zeigen.)

Auf diese Weise ist auch das erste Commit enthalten und Sie können einfach reword es wie jedes andere Commit ausführen.

Die --rootOption wurde in Git v1.7.12(2012) eingeführt. Zuvor war die einzige Option die Verwendung von filter-branchoder --amend, was normalerweise schwieriger ist.

Hinweis: Siehe auch diese ähnliche Frage und Antwort .

florisla
quelle
12

Sie können immer verwenden git filter-branch --msg-filter:

git filter-branch --msg-filter \
  'test $GIT_COMMIT = '$(git rev-list --reverse master |head -n1)' &&
echo "Nice message" || cat' master
Gabel0
quelle
1
fork0: Das ist großartig, danke. Seltsamerweise ist dies als "legitime" Praxis anzusehen, da es kein besseres Wort gibt. Ich meine, ist es üblich / empfohlen, es so zu machen? Können Sie dies auch in Fällen mit fehlerhaften Festschreibungsnachrichten immer wieder tun? Der Grund für die Frage ist, dass ich es zuerst mit dem falschen Commit SHA-1 gemacht habe und Ihr Snippet kopiert habe (Ihr Commit war das letzte Commit, während ich das allererste ändern wollte). Nachdem ich den Befehl erneut verwendet hatte, diesmal mit korrektem SHA-1 (erstes Commit; 6707a66), wurde er auf mich übertragen.
Henrik
Nun, es ist üblich :) Und ja, du kannst es wiederholen. Wenn Sie nur hinzufügen -f, werden die Commits des angegebenen Zweigs immer neu geschrieben. Der Zweigreferenzwert vom ersten Mal wurde in gespeichert refs/original/master, bevor Sie den Befehl ausgeführt haben.
Gabel0
Natürlich können Sie die gespeicherte Referenz einfach entfernen (oder umbenennen).
Gabel0
2
Ich habe den Code aktualisiert, um sicherzustellen, dass der Fehler mit der kopierten Festschreibungs-ID nicht auftritt. Jetzt kann der Code sogar kopiert werden. Ein Wort der Warnung : Es funktioniert nicht richtig, wenn es mehr als ein anfängliches Commit gibt (dh wenn Sie zwei oder mehr nicht verwandte Zweige zusammengeführt haben)
fork0
3
@hced: Sie sollten sich bewusst sein, dass das Umschreiben eines Commits, das als "veröffentlichter Verlauf" betrachtet wird, normalerweise eine schlechte Idee ist. In Ihrem Fall würde dies bedeuten, dass Sie dies im Allgemeinen nicht tun sollten, wenn jemand anderes jemals an einem Commit gearbeitet hätte, bei dem Ihr Root-Commit als Vorfahr vorliegt.
Mark Longair
12

Das Wesentliche von pcreux bietet eine gute Möglichkeit, das erste Commit neu zu formulieren:

# You can't use rebase -i here since it takes the parent commit as argument.
# You can do the following though:
git checkout FIRST_COMMIT_SHA && git commit --amend && git rebase HEAD master
Douglas
quelle
3
Ab git 1.7.12 , git rebase -i --rootist die Art und Weise, zu gehen , wie durch florisla vorgeschlagen.
Douglas