Gibt es eine Möglichkeit, eine Commit-Nachricht auf GitHub zu bearbeiten?

129

Gibt es eine Möglichkeit, eine Festschreibungsnachricht nach dem Festschreiben und dem Senden an GitHub zu bearbeiten? Ich sehe, dass es eine "Notiz hinzufügen" sowie Inline-Kommentare gibt, aber keine tatsächliche Bearbeitung einer Festschreibungsnachricht. In Git-Erweiterungen gibt es auch die Option "Commit ändern", mit der die vorhandene Nachricht jedoch nicht bearbeitet wird.

Matthew Peters
quelle
Sie können versuchen, das Commit zurückzusetzen (siehe einige Optionen in dieser SO-Frage: stackoverflow.com/questions/4114095/… ). Stellen Sie nur sicher, dass Sie zuerst alle Codeänderungen sichern, damit Sie diese nicht für einen Kommentar verlieren!
Travelling Tech Guy
Siehe auch Wie bearbeite ich eine falsche Commit-Nachricht in Git? auf Stapelüberlauf.
Arjan

Antworten:

183
  1. git rebase -i <commit hash you want to change>^

    Dies öffnet Ihren Standardeditor (normalerweise ) mit einer Liste von Commits und Aktionen für jeden einzelnen. Standardmäßig ist die Aktion pick.

  2. Wechseln Sie für alle Festschreibungen, die Sie ändern möchten, pickzu reword.

  3. Speichern und beenden (in vi:) :wq.

  4. Bei jedem solchen Commit erhalten Sie einen Editor, der die Commit-Nachricht bearbeitet. Ändern Sie es nach Belieben, speichern und beenden Sie es.

    Nachdem Sie alle Festschreibungsnachrichten bearbeitet haben, kehren Sie zur Eingabeaufforderung zurück und erstellen einen neuen Baum mit den aktualisierten Nachrichten.

  5. Sie können sie jetzt mit auf github hochladen git push origin --force.

Wenn Sie nur Ihr letztes Commit korrigieren müssen, können Sie die Schritte 1 bis 4 durch ersetzen git commit --amend.

Mureinik
quelle
3
@MatthewPeters Ich nehme an, es sollte einen Weg geben, aber ich weiß nicht - ich benutze die Kommandozeile direkt.
Mureinik
4
Es scheint nicht so, als ob Sie <Commit-Hash, den Sie ändern möchten> angeben können, sondern Sie müssen den Hash des Commits vor dem Hash angeben, den Sie ändern möchten, oder HEAD ~ x verwenden, wobei x die Anzahl der Commits von HEAD ist Das Element, das Sie ändern möchten, befindet sich.
ssc327
3
@ ssc327 Beachten Sie, dass ich ^dort bin - ich habe in der Tat vorgeschlagen, auf dem übergeordneten Element des Commits zu basieren, das Sie ändern möchten.
Mureinik
2
@Murenik du hast recht, ich habe es irgendwie verpasst, den ^
ssc327
1
@deadfish Über die Windows-Befehlszeile müssen Sie Folgendes eingeben ^^, um den Befehl mit einem Literal zu beenden ^ : git rebase -i 2c747b32^^
Wyck,
35

In Intellij Idea ist das ganz einfach.

  1. Versionskontrolle öffnen (Verlauf)
  2. Wählen Sie die Registerkarte Protokoll
  3. Wählen Sie "Festschreiben", um den Kommentar zu ändern
  4. Drücken Sie F2 (Mac Fn + F2) und aktualisieren Sie Ihre Festschreibungsmeldung
fedrbodr
quelle
1
Funktioniert nicht, wenn Sie bereits auf Remote umgestellt haben.
Paynd
8
Du musst git push origin --forcedanach ausführen, wie in @ Mureiniks Antwort vorgeschlagen.
Dan Macák
1
Die Option "reword" ist deaktiviert, wenn das Commit bereits gedrückt wurde.
Huyz
1
Um dies mit Intellij IDEA für ein Commit zu tun, das übertragen wurde, müssen Sie zuerst mit einer interaktiven Rebase beginnen (wie Sie es von der Befehlszeile von Git aus tun würden). Klicken Sie dazu mit der rechten Maustaste auf Ihr Projekt -> Menüpunkt "Git" -> "Repository" -> "Rebase ..." (letzter Menüpunkt). Fügen Sie den SHA des Commits vor dem zu ändernden in das Feld "Onto" ein und klicken Sie auf "Rebase". Sie erhalten dann die Eingabeaufforderung für die interaktive Rebase. Wählen Sie "reword" in der Aktions-Dropbox neben den Commits, die Sie ändern möchten, und klicken Sie auf die Schaltfläche "Start rebasing" (Fortsetzung im nächsten Kommentar)
jplandrain
1
(Fortsetzung) Sie erhalten dann eine Eingabeaufforderung für jedes Commit, das Sie ändern möchten. Nachdem die Protokollnachrichten geändert wurden, können Sie weitere Änderungen vornehmen (beachten Sie, dass die Option "Neu formulieren" jetzt nicht mehr abgeblendet ist). Wenn Sie fertig sind, können Sie Ihre Änderungen erzwingen, um die interaktive Rebase abzuschließen. Der gesamte Vorgang ist genau der gleiche wie in der Antwort von @Mureinik, der ihn stattdessen über die Befehlszeile ausführt.
Jplandrain
3

Prämisse:

wenn dein git-graph so aussieht ...

O   target-commit that you want to change its message [df9c192]
|
O   parent-commit [b7ec061]
|
O

( df9c192und b7ec061sind die Commit-Hashes von Target-Commit und Parent-Commit, getrennt)

Lösung:

Sie können einfach die folgenden Anweisungen eingeben ...

git reset --soft b7ec061
git commit -m "your_new_description"
git push -f

Erläuterung:

  1. git reset --soft b7ec061 behält Ihre Änderungen an Dateien bei und setzt sie auf Parent-Commit zurück (dh b7ec061)
  2. git commit -m "..." wird lokal ein neues Commit erstellen
  3. git push -f Überträgt Ihr neues Commit auf den Server und ersetzt das alte (dh df9c192)
Alumi Lu
quelle
2

Eine andere Möglichkeit besteht darin, ein zusätzliches "Errata-Commit" (und Push) zu erstellen, das auf das Commit-Objekt verweist, das den Fehler enthält. Das neue Errata-Commit stellt auch die Korrektur bereit. Ein Errata-Commit ist ein Commit ohne wesentliche Codeänderungen, jedoch mit einer wichtigen Commit-Nachricht. Fügen Sie Ihrer Readme-Datei beispielsweise ein Leerzeichen hinzu und bestätigen Sie diese Änderung mit der wichtigen Commit-Nachricht, oder verwenden Sie die Option git --allow-empty. Es ist auf jeden Fall einfacher und sicherer als das erneute Basieren, es ändert nicht den wahren Verlauf und es hält den Zweigbaum sauber (unter Verwendung vonamendist auch eine gute Wahl, wenn Sie das letzte Commit korrigieren, aber ein Errata-Commit ist möglicherweise eine gute Wahl für ältere Commits. So etwas passiert so selten, dass es gut genug ist, den Fehler einfach zu dokumentieren. Wenn Sie in Zukunft in einem Git-Protokoll nach einem Feature-Schlüsselwort suchen müssen, wird das ursprüngliche (fehlerhafte) Commit möglicherweise nicht angezeigt, da in diesem ursprünglichen Commit das falsche Schlüsselwort verwendet wurde (der ursprüngliche Tippfehler). Das Schlüsselwort wird jedoch angezeigt in der Errata-Festschreibung, die Sie dann auf die ursprüngliche Festschreibung verweist, die den Tippfehler hatte. Hier ist ein Beispiel:

$ git log
commit 0c28141c68adae276840f17ccd4766542c33cf1d
Autor: Erste Letzte 
Datum: Mi Aug 8 15:55:52 2018 -0600

    Errata Commit:
    Diese Festschreibung hat keine wesentliche Codeänderung.
    Dieses Commit wird nur bereitgestellt, um eine Korrektur einer vorherigen Commit-Nachricht zu dokumentieren.
    Dies betrifft das Commit-Objekt e083a7abd8deb5776cb304fa13731a4182a24be1
    Ursprüngliche falsche Festschreibungsmeldung:
        Hintergrundfarbe in rot geändert
    Korrektur (* Änderung markiert *):
        Hintergrundfarbe auf * blau * geändert

commit 032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
Autor: Erste Letzte 
Datum: Mi Aug 8 15:43:16 2018 -0600

    Eine Zwischenmeldung zum Festschreiben

Festschreiben von e083a7abd8deb5776cb304fa13731a4182a24be1
Autor: Erste Letzte 
Datum: Mi Aug 8 13:31:32 2018 -0600

    Hintergrundfarbe in rot geändert
rob_7cc
quelle
Sicher ist es sicher, aber viel Text zu lesen. Ich würde es vorziehen, die Geschichte
umzuschreiben
0

Antwort von @Mureinik ist gut aber für Neulinge nicht nachvollziehbar.

Erste Methode:

  1. Wenn Sie nur die letzte Commit-Nachricht bearbeiten möchten, benötigen Sie nur Folgendes git commit --amend:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# On branch is up to date with 'origin/master'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Wie Sie sehen können, schreiben Sie die Nachricht oben ohne das Präfix eines Befehls fest, zum Beispiel pick, dies ist bereits die Bearbeitungsseite, und Sie können die oberste Nachricht direkt bearbeiten und speichern und beenden , zB:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Dann mach git push -u origin master --forceoder <how you push normally> --force. Der Schlüssel ist hier --force.

Zweite Methode:

  1. Sie können den Commit-Hash sehen git logoder aus der Repository-URL extrahieren, in meinem Fall zum Beispiel881129d771219cfa29e6f6c2205851a2994a8835

  2. Dann können Sie tun git rebase --interactive 881129d771219cfa29e6f6c2205851a2994a8835oder git rebase -i HEAD^(wenn die neueste)

  3. Du würdest sehen:

pick <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# 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
#  d, drop = remove commit
#
# 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
  1. Aber wenn Sie noopdann sehen, dass Sie wahrscheinlich falsch tippen, z. B. wenn Sie git rebase -i 881129d771219cfa29e6f6c2205851a2994a88das Fehlen ^am Ende tun , sollten Sie den Editor ohne Speichern verlassen und den Grund herausfinden:
noop

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
...
  1. Wenn es kein noopProblem gibt, ändern Sie einfach das Wort pickin reword. Anderes bleibt erhalten (Sie bearbeiten die Commit-Nachricht an dieser Stelle nicht). Beispiel:
reword <commit hash> <your current commit message>

# Rebase 8db7e8b..fa20af3 onto 8db7e8b
#
# Commands:
#  p, pick = use commit
...
  1. Beim Speichern und Beenden wird die Bearbeitungsseite angezeigt , die Methode 1 ähnelt:
<your existing commit mesage foo bar> 

# Please enter the commit message fir your changes. Lines starting
# with # will be ignored, and an empty message aborts the commit.
#
# Date: Sat Aug 24 17:56:16 2019 +0800
#
# interactive rebase in progress; onto b057371
# Last command done (1 command done):
#    reword d996ffb <existing commit message foo bar>
# No commands remaining.
# You are currently editing a commit while rebasing branch 'master' on 'b057371'.
#
# changes to be committed:
#       modified:   foo.py
#
  1. Bearbeiten Sie die Nachricht wie bei Methode 1 oben und speichern und beenden Sie sie, z. B .:
<your new correction commit message> 

# Please enter the commit message for your changes. Lines starting
....
  1. Wieder das gleiche wie Methode # 1, git push -u origin master --forceoder <how you push normally> --force. Der Schlüssel ist hier --force.

Weitere Informationen finden Sie in der Dokumentation .

林果 林果
quelle