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 .

35voto

bara Punkte 2765

Ich habe das Problem gelöst, indem ich meine lokale geänderte Übertragung verworfen und die neuen Änderungen hinzugefügt habe:

# Rewind to commit before conflicting
git reset --soft HEAD~1

# Pull the remote version
git pull

# Add the new commit on top
git add ...
git commit
git push

19voto

M-Razavi Punkte 2779

Wenn sich die zu ändernde Nachricht auf die letzte Übergabe an das Repository bezieht, sind die folgenden Befehle auszuführen:

git commit --amend -m "New message"

git push --force repository-name branch-name

Hinweis : Die Verwendung von --force wird nicht empfohlen, es sei denn, Sie sind absolut sicher, dass niemand Ihr Repository nach der letzten Übertragung geklont hat.

Eine sicherere Alternative ist die Verwendung:

git push --force-with-lease repository-name branch-name

Anders als --force , wodurch alle Änderungen, die jemand anderes in den Zweig eingebracht hat, zerstört werden, --force-with-lease bricht ab, wenn es eine Upstream-Änderung des Repositorys gab.

12voto

davisca Punkte 1044

Ich hatte das gleiche Problem.

  • Versehentlich den letzten Commit geändert, der bereits verschoben wurde
  • Viele lokale Änderungen vorgenommen, etwa fünfmal übertragen
  • Ich versuchte zu pushen, bekam eine Fehlermeldung, geriet in Panik, fügte remote zusammen, bekam eine Menge Nicht-meine-Dateien, pushte, scheiterte, usw.

Als Git-Neuling dachte ich, es sei vollständig FUBAR .

Lösung: Ähnlich wie von @bara vorgeschlagen + Erstellung eines lokalen Sicherungszweigs

# Rewind to commit just before the pushed-and-amended one.
# Replace <hash> with the needed hash.
# --soft means: leave all the changes there, so nothing is lost.
git reset --soft <hash>

# Create new branch, just for a backup, still having all changes in it.
# The branch was feature/1234, new one - feature/1234-gone-bad
git checkout -b feature/1234-gone-bad

# Commit all the changes (all the mess) not to lose it & not to carry around
git commit -a -m "feature/1234 backup"

# Switch back to the original branch
git checkout feature/1234

# Pull the from remote (named 'origin'), thus 'repairing' our main problem
git pull origin/feature/1234

# Now you have a clean-and-non-diverged branch and a backup of the local changes.
# Check the needed files from the backup branch
git checkout feature/1234-gone-bad -- the/path/to/file.php

Vielleicht ist es keine schnelle und saubere Lösung, und ich habe meinen Verlauf verloren (1 Commit statt 5), aber es hat mir einen Tag Arbeit erspart.

10voto

Prabhakar Undurthi Punkte 6202

Wenn Sie den Code nicht in Ihren entfernten Zweig (GitHub/Bitbucket) gepusht haben, können Sie die Commit-Nachricht in der Befehlszeile wie folgt ändern.

 git commit --amend -m "Your new message"

Wenn Sie an einem bestimmten Zweig arbeiten, tun Sie dies:

git commit --amend -m "BRANCH-NAME: new message"

Wenn Sie den Code bereits mit einer falschen Nachricht gepusht haben, müssen Sie vorsichtig sein, wenn Sie die Nachricht ändern, d.h. nachdem Sie die Commit-Nachricht geändert haben und erneut versuchen, den Code zu pushen, kommt es zu Problemen. Führen Sie die folgenden Schritte aus, damit es reibungslos funktioniert.

Bitte lesen Sie die gesamte Antwort, bevor Sie es tun

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

Wichtiger Hinweis: Wenn Sie Force Push direkt verwenden, kann es zu Code-Problemen kommen, wenn andere Entwickler an demselben Zweig arbeiten. Um diese Konflikte zu vermeiden, müssen Sie den Code aus Ihrem Zweig ziehen, bevor Sie die Kraftstoß :

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

Dies ist die beste Vorgehensweise beim Ändern der Commit-Nachricht, wenn diese bereits gepusht wurde.

9voto

Sie können dies auf einfache und sichere Weise tun:

  1. Ändern Sie Ihren letzten Commit mit git commit --amend und alle Optionen, die Sie hinzufügen müssen
  2. git pull um Ihr lokales Projektarchiv mit Ihrem entfernten Projektarchiv zu synchronisieren.
  3. Nach dem Ziehen, Sie werden Konflikte haben zwischen lokal und fern. Sie müssen sie nur lösen, indem Sie Annahme der aktuellen Änderungen und bestätigen Sie erneut.
  4. git push

Jetzt werden Ihr lokales und Ihr entferntes Repository aktualisiert, ohne dass Sie Ihre Repository-Historie ändern müssen.

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