Git: Wie kann man Commit-Nachrichten nach 'git reset' wiederverwenden / behalten?

103

Als Git-Benutzer stoße ich regelmäßig auf die Situation, dass ich einen oder mehrere Commits auf eine Weise überarbeiten muss, die nicht in --amendoder rebase -imit Fixup-Commits passt. Normalerweise würde ich so etwas machen

git reset HEAD~1
# hack, fix, hack
git commit -a
# argh .. do I need to retype my message?

Ich nehme vernünftig komponierte Commit-Nachrichten sehr ernst. Sie enthalten normalerweise größeren Text mit Verweisen und Begründungen für die Änderung. Bis jetzt bin ich verärgert ganz auf dem langwierigen Prozess meine alten Commit - Nachricht über einen unsortierten zu erholen git reflog, git logund kopiert und Prozess einfügen.

Gibt es eine bessere Möglichkeit, dies in Angriff zu nehmen? Und wie wäre es, wenn mein Commit mehr als ein Commit umfasst?

Bearbeiten: Nachdem ich ein wenig darüber nachgedacht habe, denke ich, dass ich nach einer Git-Stash- ähnlichen Funktionalität für Commit-Nachrichten suche, bei denen das Fixieren / Ändern von Commits nicht angemessen ist.

Bentolor
quelle
2
Wenn alles, was Sie getan haben git reset head~1, wäre Ihre alte Commit-Nachricht nicht nur der zweite Eintrag in der reflog?
Ja - aber wie könnte ich die Nachricht ohne Kopieren und Einfügen wiederverwenden (was normalerweise ein manuelles Einrücken erfordert)
bentolor
Heutzutage nur gitkoffen haben. Auf diese Weise müssen Sie nicht einmal das Reflog verwenden. Alternativ können rev-parse <branch>Sie Ihren Hash vor dem Zurücksetzen abrufen und die Antwort von ibizaman verwenden.
cst1992

Antworten:

141

Nach a git resetkann dieser Einzeiler es tun:

git commit --reuse-message=HEAD@{1}

oder noch kürzer:

git commit -C HEAD@{1}

Sie können die anderen von @ user2718704 angegebenen Optionen verwenden .

Ibizaman
quelle
6
Kürzere:git commit -C@@{1}
Phu Ngo
2
Dies ist eine fantastische Verwendung des Reflogs
David Mann
22
Nach einem Reset wird ORIG_HEAD gesetzt. Ich finde git commit --reuse-message=ORIG_HEADes am klarsten.
Scott Jacobsen
45

Wenn Sie den Befehl "git commit" ausführen, müssen Sie die folgenden Optionen überprüfen:

Wiederverwenden,

--reuse-message=<commit>

Bei Wiederverwendung bearbeiten,

--reedit-message=<commit>

Um den Autor zu ändern,

--reset-author
user2718704
quelle
1
Markierte dies als die neue Lösung, da dies die umfassendste Antwort lieferte. Obwohl diese Lösung meine "Abruf" -Probleme immer noch nicht vollständig löst.
Bentolor
9

Warum zurückgesetzt , wenn Sie hacken, fix, hacken und dann einfach laufen git commit --amend --no-edit; So bleibt Ihre ursprüngliche Festschreibungsnachricht erhalten.

Damit es für mehrere Commits funktioniert, erstellen Sie einfach ein temporäres Commit mit Ihren neuesten Änderungen und verwenden Sie dann eine interaktive Rebase, um das vorherige Commit (das die gute Commit-Nachricht enthält) mit dem neuen temporären Commit zu quetschen, wobei die Commit-Nachricht des alten Commits beibehalten wird.

mart1n
quelle
2
Wenn Sie eine interaktive Rebase durchführen, können Sie sogar mithilfe der fixupAnweisung deklarieren, dass das spätere Commit das vorherige Commit reparieren soll, und es wird automatisch die Commit-Nachricht aus dem Original verwendet, wobei die Nachricht aus dem Fixup-Commit verworfen wird.
qqx
Zum Beispiel, wenn ich erzwungene aktualisierte Pull-Anforderungen erneut zusammenführen möchte. Oder wenn das Commit nicht das letzte ist und nicht einfach basierend auf HEAD behoben werden kann und es einfacher ist, sie zu wiederholen.
Bentolor
@BenTebulin Mit der interaktiven Rebase können Sie jedes Commit in einem Bereich bestimmter Commits ändern. Es ist nicht ausschließlich das HEAD-Commit, das geändert werden muss.
Mart1n
@ mart1n Dank für das Vereinzeln bearbeiten in rebase -i. Ich habe es in diesem Zusammenhang nie benutzt. Für die verbleibenden Fälle wie das erneute Zusammenführen ist die andere Antwort besser für meine Frage geeignet, daher habe ich diese als Antwort markiert.
Bentolor
Intellij verfügt über Bereiche, die nur für Dateien gelten, die noch nicht festgeschrieben wurden. Es ist nützlich, die Dateien auf nicht festgeschrieben zurückzusetzen, damit Intellij beispielsweise angewiesen werden kann, die Dateien zu fusseln und diese Dateien dann mit derselben Nachricht erneut festzuschreiben. Änderungen funktionieren aufgrund von Einschränkungen des Umfangs von Intellij nicht.
David Mann
5

Sie können in Betracht ziehen git commit --reset-author -c <commit>, die Festschreibungsnachricht mit der Bearbeitung und der aktuellen Uhrzeit wiederzuverwenden.

Joe
quelle
Danke - das kommt dem sehr nahe, wonach ich gesucht habe.
Bentolor