7648 Stimmen

Wie können bestehende, aber noch nicht gepushte Commit-Nachrichten geändert werden?

Ich habe im Commit-Nachricht das falsche geschrieben.

Wie kann ich die Nachricht ändern? Der Commit wurde noch nicht gepusht.

868 Stimmen

Für diejenigen, die noch neu in Git sind: Lauries Hinweis darauf, dass noch nicht gepusht wurde, ist wichtig. Wie beim Rebasieren ändert sich dadurch die Historie. Wenn jemand zwischen der originalen und der umgeschriebenen Historie von deinem Repository geklont/gezogen hat, wird er nach der Änderung nicht mehr in der Lage sein, zu ziehen (für diesen Branch).

106voto

przbadu Punkte 5401

Aktualisieren Sie Ihre letzte falsche Commit-Nachricht mit der neuen Commit-Nachricht in einer Zeile:

git commit --amend -m "Ihre neue Commit-Nachricht"

Oder versuchen Sie es mit Git-Reset wie unten:

# Sie können Ihren Kopf auf n Anzahl von Commits zurücksetzen
# Keine gute Idee, um die letzte Commit-Nachricht zu ändern,
# aber Sie können eine Idee bekommen, den Commit in mehrere Commits aufzuteilen
git reset --soft HEAD^

# Es wird Ihren letzten Commit zurücksetzen. Jetzt können Sie ihn
# mit neuer Commit-Nachricht erneut bestätigen.

Verwendung des Resets, um Commits in kleinere Commits aufzuteilen

git reset kann Ihnen auch helfen, einen Commit in mehrere Commits aufzuteilen:

# Setzen Sie Ihren Kopf zurück. Ich setze auf die letzten Commits zurück:
git reset --soft HEAD^
# (Sie können mehrere Commits zurücksetzen, indem Sie HEAD~2 eingeben (Anzahl der Commits))

# Setzen Sie jetzt Ihren Kopf zurück, um ihn in mehrere Commits aufzuteilen
git reset HEAD

# Fügen Sie Ihre Dateien separat hinzu und bestätigen Sie sie, um mehrere Commits zu erstellen: z.B.
git add app/
git commit -m "alle Dateien im App-Verzeichnis hinzufügen"

git add config/
git commit -m "alle Dateien im Config-Verzeichnis hinzufügen"

Hier haben Sie erfolgreich Ihren letzten Commit in zwei Commits aufgeteilt.

3 Stimmen

Wenn alles, was Sie tun möchten, ist die Nachricht Ihres letzten Commits zu bearbeiten, ist es übertrieben, dafür einen Soft-Reset zu verwenden. Verwenden Sie einfach git commit --amend, genau wie es in der am besten bewerteten Antwort steht. Zusätzlich funktioniert git reset --soft HEAD^ identisch zum Soft-Reset in dieser früheren Antwort, da sie beide zum ersten Eltern-Commit zurücksetzen.

3 Stimmen

Ich habe mir nur die Mühe gemacht, git reset in die Lösung aufzunehmen, um eine Idee zu geben, wie man eine Commit-Nachricht in mehrere Commit-Nachrichten aufteilen kann. Denn ich hatte dieses Problem, als ich anfing, git zu nutzen. Manchmal kann das wirklich hilfreich sein. :)

94voto

Marijn Punkte 1389

Bei dieser Frage gibt es viele Antworten, aber keine davon erklärt im Detail, wie man ältere Commit-Nachrichten mit Vim ändert. Ich war selbst in der Situation stecken geblieben, also werde ich hier detailliert beschreiben, wie ich das gemacht habe, besonders für Leute, die keine Erfahrung mit Vim haben!

Ich wollte meine fünf letzten Commits ändern, die ich bereits auf den Server gepusht hatte. Das ist ziemlich 'gefährlich', denn wenn jemand anderes bereits davon gezogen hat, kannst du Dinge durcheinander bringen, indem du die Commit-Nachrichten änderst. Wenn du jedoch an deinem eigenen kleinen Branch arbeitest und sicher bist, dass niemand ihn gezogen hat, kannst du es wie folgt ändern:

Angenommen, du möchtest deine letzten fünf Commits ändern, dann tippst du dies in das Terminal ein:

git rebase -i HEAD~5

*Wo 5 die Anzahl der Commit-Nachrichten ist, die du ändern möchtest (also wenn du den 10. Commit von unten ändern möchtest, tippst du 10 ein).

Mit diesem Befehl kommst du in Vim, wo du deine Commit-Historie "bearbeiten" kannst. Du siehst deine letzten fünf Commits oben so:

pick  Commit-Nachricht

Statt pick musst du reword schreiben. Das kannst du in Vim machen, indem du i tippst. Damit gehst du in den Einfüge-Modus. (Du siehst, dass du im Einfügemodus bist, am Wort EINFÜGEN unten.) Für die Commits, die du ändern möchtest, tippst du anstelle von pick reword.

Dann musst du diesen Bildschirm speichern und beenden. Das machst du, indem du zuerst in den 'Befehlsmodus' gehst, indem du die Esc-Taste drückst (du kannst überprüfen, dass du im Befehlsmodus bist, wenn das Wort EINFÜGEN unten verschwunden ist). Dann kannst du einen Befehl eingeben, indem du : tippst. Der Befehl zum Speichern und Beenden ist wq. Also, wenn du :wq eingibst, bist du auf dem richtigen Weg.

Dann wird Vim jede Commit-Nachricht, die du neu schreiben möchtest, durchgehen, und hier kannst du tatsächlich die Commit-Nachrichten ändern. Du machst dies, indem du in den Einfügemodus gehst, die Commit-Nachricht änderst, in den Befehlsmodus gehst und speicherst und beendest. Mache dies fünfmal und du bist aus Vim heraus!

Dann, wenn du deine falschen Commits bereits gepusht hast, musst du git push --force eingeben, um sie zu überschreiben. Denke daran, dass git push --force ziemlich gefährlich ist, also stelle sicher, dass niemand vom Server gezogen hat, seit du deine falschen Commits gepusht hast!

Jetzt hast du deine Commit-Nachrichten geändert!

(Wie du siehst, bin ich nicht so erfahren in Vim, also falls ich den falschen 'Slang' verwendet habe, um zu erklären, was passiert, korrigiere mich gerne!)

4 Stimmen

Es gibt keine "Threads" auf Stack Overflow, weil es kein Diskussionsforum ist, es gibt nur "Fragen", "Antworten" und "Beiträge".. Außerdem sind nicht alle Versionen von Vim gleich, nicht alle davon werden es Ihnen ermöglichen, Zeichen im Einfügemodus zu löschen (ergibt irgendwie Sinn, oder?). Wenn Sie immer Zeichen in Vim löschen möchten, wird X und x das tun (das kleine x löscht Zeichen vor dem Cursor, X wird dahinter löschen). Wenn Sie Fehler machen, können Sie u wiederholt verwenden, um rückgängig zu machen. Schließlich steht r als Abkürzung für reword im interaktiven Umtexteditor.

1 Stimmen

Um ein Wort in vim zu ändern, wird cw am Anfang des Wortes eingegeben (obwohl die Frage nicht über vim geht, stimme ich zu).

0 Stimmen

Sie müssen nicht diese Abscheulichkeit verwenden. Sie können Ihren Git-Editor auf etwas Vernünftiges und Benutzerfreundliches wie nano oder Midnight Commander's mcedit einstellen.

81voto

Chu-Siang Lai Punkte 2470

Ich habe die Aliase reci und recm für recommit (amend) hinzugefügt. Jetzt kann ich es mit git recm oder git recm -m machen:

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

81voto

albfan Punkte 11604

Sie können git-rebase-reword verwenden

Es ist dazu gedacht, beliebige Commits zu bearbeiten (nicht nur den letzten) genauso wie commit --amend

$ git rebase-reword 

Es ist benannt nach der Aktion beim interaktiven Rebase, um einen Commit zu ändern: "reword". Siehe diesen Beitrag und man -Abschnitt interaktiver Modus-

Beispiele:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

7 Stimmen

Dies erfordert die Installation eines externen Programms. Meiner Meinung nach wäre es besser, zu lernen, die integrierten Tools und Aliase effektiver zu nutzen. Ich würde eingeben: g c; g rb -i @~9 (Commit und Rebasing), den neuen Commit an die gewünschte Stelle verschieben, commit in f (fixup) ändern und speichern. Wenn Sie etwas schnelleres wollen, könnten Sie alias git commit --fixup=; git rebase -i --autosquash ^ nutzen.

58voto

neoneye Punkte 47046

Ich habe bemerkt, dass ich einen Commit mit einem Tippfehler gepusht habe. Um das rückgängig zu machen, habe ich Folgendes gemacht:

git commit --amend -m "T-1000, Fortgeschrittenes Prototyp"
git push --force

Warnung: Durch das erzwungene Pushen Ihrer Änderungen wird der remote Branch mit Ihrem lokalen überschrieben. Stellen Sie sicher, dass Sie nichts überschreiben, was Sie behalten möchten. Seien Sie auch vorsichtig beim erzwungenen Pushen eines geänderten (überarbeiteten) Commits, wenn jemand anderes den Branch mit Ihnen teilt, da sie ihre eigene Geschichte neu schreiben müssen, wenn sie die alte Version des Commits haben, den Sie gerade neu geschrieben haben.

7 Stimmen

Nichts wird jemals in GIT "überschrieben". In diesem Fall wird der Branch-Pointer auf Ihren neuen Commit gesetzt und der alte Commit wird veraltet, wenn keine Referenzen darauf verbleiben und nach einigen Wochen bereinigt werden könnten. (Bis dahin können andere ihn immer noch finden und darauf verweisen, z. B. indem sie in das Reflog schauen.)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X