Ändern Sie die alte Commit-Nachricht auf Git

136

Ich habe versucht, eine alte Festschreibungsnachricht wie hier erläutert zu bearbeiten .

Die Sache ist, dass jetzt, wenn ich versuche zu laufen, rebase -i HEAD~5es sagt interactive rebase already started.

Also dann versuche ich: habe git rebase --continueaber diesen Fehler bekommen:

error: Ref refs/heads/master is at 7c1645b447a8ea86ee143dd08400710c419b945b but expected c7577b53d05c91026b9906b6d29c1cf44117d6ba
fatal: Cannot lock the ref 'refs/heads/master'.

Irgendwelche Ideen?

Pablo Fernandez
quelle

Antworten:

125

Es sagt:

Wenn Sie den Editor speichern und beenden, werden Sie zum letzten Commit in dieser Liste zurückgespult und in der Befehlszeile mit der folgenden Meldung abgelegt:

$ git rebase -i HEAD~3
Stopped at 7482e0d... updated the gemspec to hopefully work better
You can amend the commit now, with

Es bedeutet nicht:

tippe nochmal git rebase -i HEAD~3

Versuchen Sie, beim Beenden des Editors nicht zu tippen git rebase -i HEAD~3, und es sollte gut funktionieren.
(Andernfalls ist in Ihrer speziellen Situation git rebase -i --abortmöglicherweise ein erforderlich, um alles zurückzusetzen und es Ihnen zu ermöglichen, es erneut zu versuchen.)


Wie Dave Vogt in den Kommentaren erwähnt, git rebase --continuegeht es darum, mit der nächsten Aufgabe im Rebasing-Prozess fortzufahren, nachdem Sie das erste Commit geändert haben .

Auch Gregg Lind erwähnt in seiner Antwort das rewordKommandogit rebase :

Durch Ersetzen des Befehls "pick" durch den Befehl "edit" können Sie festlegen git rebase, dass nach dem Anwenden dieses Commits angehalten werden soll, damit Sie die Dateien und / oder die Commit-Nachricht bearbeiten, das Commit ändern und die Neubasierung fortsetzen können.

Wenn Sie nur die pickrewordFestschreibungsnachricht für eine Festschreibung bearbeiten möchten, ersetzen Sie den Befehl " " durch den Befehl " " seit Git1.6.6 (Januar 2010) .

Es macht dasselbe wie ' edit' während einer interaktiven Rebase, außer dass Sie nur die Commit-Nachricht bearbeiten können, ohne die Kontrolle an die Shell zurückzugeben . Dies ist äußerst nützlich.
Derzeit müssen Sie Folgendes tun, wenn Sie Ihre Commit-Nachrichten bereinigen möchten:

$ git rebase -i next

Stellen Sie dann alle Commits auf "Bearbeiten". Dann auf jedem:

# Change the message in your editor.
$ git commit --amend
$ git rebase --continue

Wenn Sie ' reword' anstelle von ' edit' verwenden, können Sie die git-commitund git-rebaseAnrufe überspringen .

VonC
quelle
2
Außerdem git rebase --continuegeht in die nächste Aufgabe in der Rebasing Prozess, nachdem Sie geändert haben die erste begehen.
Dave Vogt
1
Hinzufügen des Links zum Github-Wiki-Artikel zum Ändern einer Commit-Nachricht
Joy
60

Wie Gregg Lind vorgeschlagen hat, können Sie das Umwort verwenden , um aufgefordert zu werden, nur die Festschreibungsnachricht zu ändern (und die Festschreibungsnachricht ansonsten intakt zu lassen):

git rebase -i HEAD~n

Hier nist die Liste der letzten n Commits.

Wenn Sie beispielsweise verwenden git rebase -i HEAD~4, wird möglicherweise Folgendes angezeigt:

pick e459d80 Do xyz
pick 0459045 Do something
pick 90fdeab Do something else
pick facecaf Do abc

Ersetzen Sie nun pick durch reword für die Commits, für die Sie die Nachrichten bearbeiten möchten:

pick e459d80 Do xyz
reword 0459045 Do something
reword 90fdeab Do something else
pick facecaf Do abc

Beenden Sie den Editor nach dem Speichern der Datei. Als Nächstes werden Sie aufgefordert, die Nachrichten für die Commits, die Sie als umformuliert markiert haben , in einer Datei pro Nachricht zu bearbeiten . Beachten Sie, dass es nur bearbeiten viel einfacher haben gewesen wäre , die Nachrichten zu begehen , wenn Sie ersetzt pickmit reword, aber das hat keine Wirkung zu tun.

Weitere Informationen finden Sie auf der GitHub-Seite zum Ändern einer Commit-Nachricht .

Punit Vara
quelle
Sehr gut erklärt. Danke: D
Shubham Jain
Danke @ShubhamJain Glücklich, dass meine Antwort nützlich war
Punit Vara
Ich habe das getan und dann tauchen Commits aus anderen Filialen in meiner Filiale auf
Reza
@Reza du hast vielleicht etwas durcheinander gebracht. Versuchen Sie dies in einem anderen Repo. Diese Lösung funktioniert perfekt
Punit Vara
54

FWIW, Git Rebase Interactive hat jetzt eine "Reword" -Option, die dies viel weniger schmerzhaft macht!

Gregg Lind
quelle
3
rewordWarum können Sie bei Verwendung von git nicht einfach die Festschreibungsnachrichten in dieser Datei mit der Liste der Festschreibungen bearbeiten? Stattdessen wird der Editor mit einer Commit-Nachrichtendatei pro rewordZeile gestartet . Dies ist nur unnötig. Selbst wenn andere Aktionen als pickoder reworddas Starten externer Befehle erforderlich rewordwären , wäre dies nicht erforderlich.
Dan Dascalescu
9

Ich wollte nur eine andere Option dafür bereitstellen. In meinem Fall arbeite ich normalerweise an meinen einzelnen Niederlassungen und verschmelze sie dann zum Master. Die einzelnen Commits, die ich für meine lokale Niederlassung mache, sind nicht so wichtig.

Aufgrund eines Git-Hooks, der auf Jira nach der entsprechenden Ticketnummer sucht, aber zwischen Groß- und Kleinschreibung unterscheidet, wurde ich daran gehindert, meinen Code zu pushen. Außerdem wurde das Commit vor langer Zeit durchgeführt und ich wollte nicht zählen, wie viele Commits auf die Rebase zurückgesetzt werden sollen.

Ich habe also einen neuen Zweig aus dem neuesten Master erstellt und alle Commits aus dem Problemzweig zu einem einzigen Commit für einen neuen Zweig zusammengefasst. Es war einfacher für mich und ich denke, es ist eine gute Idee, es hier als zukünftige Referenz zu haben.

Vom neuesten Meister:

git checkout -b new-branch

Dann

git merge --squash problem-branch
git commit -m "new message" 

Referenz: https://github.com/rotati/wiki/wiki/Git:-Combine-all-messy-commits-into-one-commit-before-merging-to-Master-branch

WebDever
quelle
1
Deine Antwort hat mir wirklich den Tag gerettet :). Ich hatte rebase -iungefähr 2 Stunden lang Probleme und keinen Erfolg. Mein Commit lag hinter 18 Commits, also können Sie sich vorstellen. Dies war der einfachere und praktischere Weg, den ich finden konnte, ohne Rebase verwenden zu müssen. Danke Freund!
Carlos Parra
6

Hier ist eine sehr schöne Übersicht, die alle möglichen Fälle abdeckt: https://gist.github.com/nepsilon/156387acf9e1e72d48fa35c4fabef0b4

Überblick:

git rebase -i HEAD~X
# X is the number of commits to go back
# Move to the line of your commit, change pick into edit,
# then change your commit message:
git commit --amend
# Finish the rebase with:
git rebase --continue
Mahmoud Zalt
quelle