865 Stimmen

Wie schiebe ich eine geänderte Übergabe an das entfernte Git-Repository?

Als ich ein wenig mit meinem Quellcode gearbeitet habe, habe ich mein übliches Ding Commit gemacht und dann in ein entferntes Repository gepusht. Aber dann habe ich bemerkt, dass ich vergessen habe, meine Importe im Quellcode zu organisieren. Also habe ich den Befehl amend ausgeführt, um den vorherigen Commit zu ersetzen:

> git commit --amend

Leider kann der Commit nicht in das Repository zurückgeschoben werden. Sie wird auf diese Weise abgelehnt:

> git push origin
To //my.remote.repo.com/stuff.git/
 ! [rejected]        master -> master (non-fast forward)
error: failed to push some refs to '//my.remote.repo.com/stuff.git/'

Was sollte ich tun? (Ich kann auf das entfernte Repository zugreifen.)

2 Stimmen

Was wäre, wenn ich mit --amend nur die Commit-Nachricht ändern würde? Gibt es eine Möglichkeit, die letzte Commit-Nachricht allein zu bearbeiten, wenn sie bereits an die Gegenstelle übertragen wurde? Ich habe das auf Github gemacht und erhielt die gleiche Meldung über die nicht schnelle Weiterleitung. Dann habe ich die folgende Lösung angewandt, aber der Merge hat nur weitere Commit-Nachrichten hinzugefügt.

9 Stimmen

@faB: Ich denke, das ist eine FAQ. Eine Commit-Nachricht wird zusammen mit dem Commit gehasht, so dass das Ändern es ändert den Revid (Hash). Falls es nicht klar ist: Nein, das geht nicht. IIRC kann Out-of-Band-Informationen in Notizen speichern (so dass Sie bestehende Commits mit Anmerkungen versehen können, ohne sie zu verändern). Um bestimmte Commits zu kennzeichnen, verwenden Sie Tags

1 Stimmen

In Kürze (git1.8.5, Q4 2013) werden Sie in der Lage sein eine git push -force sorgfältiger .

1voto

MadPhysicist Punkte 4706

Das Folgende hat bei mir funktioniert, als ich Autor und Committer einer Übertragung geändert habe.

git push -f origin master

Git war klug genug, um herauszufinden, dass es sich um Commits mit identischen Deltas handelte, die sich nur in den Metainformationen unterschieden.

Sowohl der lokale als auch der entfernte Kopf zeigten auf die fraglichen Übertragungen.

1voto

Spoike Punkte 115938

Ich musste dieses Problem mit dem Ziehen aus dem entfernten Repo beheben und mich mit den entstandenen Merge-Konflikten befassen, die Übergabe durchführen und dann pushen. Aber ich glaube, es gibt einen besseren Weg.

0voto

Harshal Wani Punkte 2129

Hier, wie ich eine Änderung in einer früheren Übertragung korrigiert habe:

  1. Speichern Sie Ihre bisherige Arbeit.

  2. Heben Sie Ihre Änderungen vorerst auf, wenn Sie sie vorgenommen haben: git stash Jetzt ist Ihre Arbeitskopie auf dem Stand der letzten Übertragung.

  3. Nehmen Sie die Bearbeitungen und Korrekturen vor.

  4. Übernehmen Sie die Änderungen in "ändern" Modus: git commit --all --amend

  5. Ihr Editor fordert Sie auf, eine Logmeldung einzugeben (standardmäßig die alte Logmeldung). Speichern Sie und beenden Sie den Editor, wenn Sie damit zufrieden sind.

    Die neuen Änderungen werden an die alte Übergabe angehängt. Überzeugen Sie sich selbst mit git log y git diff HEAD^

  6. Wenden Sie Ihre gespeicherten Änderungen wieder an, falls sie vorgenommen wurden: git stash apply

0voto

FNia Punkte 121

Um einen erzwungenen Push zu vermeiden, entfernen Sie im entfernten Bare Repository den letzten Commit (den, der geändert werden soll) mit:

git update-ref HEAD HEAD^

und pushen Sie dann die geänderte Übergabe ohne Konflikt.

Hinweis: Dies setzt voraus, dass niemand in der Zwischenzeit eine falsche Übertragung durchgeführt hat. Sollte dies der Fall sein, müssen sie ebenfalls zurückspulen und erneut ziehen, wobei sie möglicherweise ihre eigenen Änderungen zusammenführen.

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