Sie sehen ein Sicherheitsmerkmal von Git. Git weigert sich, den entfernten Zweig mit Ihrem Zweig zu aktualisieren, weil der Head-Commit Ihres Zweigs kein direkter Nachkomme des aktuellen Head-Commits des Zweigs ist, in den Sie pushen.
Wäre dies nicht der Fall, dann wüssten zwei Personen, die etwa zur gleichen Zeit in dasselbe Repository pushen, nicht, dass zur gleichen Zeit ein neuer Commit eintrifft, und derjenige, der zuletzt gepusht hat, würde die Arbeit des vorherigen Pushers verlieren, ohne dass einer von ihnen dies bemerkt.
Wenn Sie wissen, dass Sie die einzige Person sind, die einen Push durchführt, und Sie einen geänderten Commit oder einen Commit, der den Zweig zurückspult, pushen wollen, können Sie Git "zwingen", den entfernten Zweig zu aktualisieren, indem Sie die -f
Schalter.
git push -f origin master
Selbst dies könnte nicht funktionieren, da Git es entfernten Repositories erlaubt, nicht-fastforward-Pushes auf der Gegenseite zu verweigern, indem sie die Konfigurationsvariable receive.denynonfastforwards
. Ist dies der Fall, sieht der Ablehnungsgrund wie folgt aus (beachten Sie den Teil "remote rejected"):
! [remote rejected] master -> master (non-fast forward)
Um dies zu umgehen, müssen Sie entweder die Konfiguration des entfernten Repositorys ändern oder Sie können den Zweig löschen und neu erstellen:
git push origin :master
git push origin master
Im Allgemeinen ist der letzte Parameter von git push
verwendet das Format <local_ref>:<remote_ref>
, wobei local_ref
ist der Name des Zweigs im lokalen Repository und remote_ref
ist der Name des Zweigs im entfernten Repository. Dieses Befehlspaar verwendet zwei Abkürzungen. :master
hat eine Null local_ref, was bedeutet, dass ein Null-Zweig auf die entfernte Seite geschoben wird master
, d.h. den entfernten Zweig löschen. Ein Zweigname ohne :
bedeutet, dass der lokale Zweig mit dem angegebenen Namen in den entfernten Zweig mit demselben Namen verschoben wird. master
ist in dieser Situation die Abkürzung für master:master
.
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 .3 Stimmen
Hier ist der Cowboy-Stil. Lernen Sie nicht weiter und suchen Sie nicht nach Möglichkeiten, die vorherige Git-Änderung rückgängig zu machen. Fügen Sie einfach ein paar Platzhalter hinzu, ich meine, fügen Sie einen Kommentar hinzu, bereinigen Sie ein bisschen Code oder fügen Sie einfach ein paar Bindestriche hinzu.... Jetzt machen Sie einen echten Commit und pushen Sie ihn an Remote. Geschafft!
0 Stimmen
@user58777 Wenn Ihr -amend nur dazu diente, die Commit-Nachricht zu ändern und Sie seitdem keine weiteren lokalen Commits gemacht haben, können Sie Ihren lokalen Zweig auf den entfernten Commit zurücksetzen, den Sie vor dem Ändern der Commit-Nachricht gepusht haben.
1 Stimmen
Wenn niemand sonst die
remote
und Sie möchten einfach zwingenpush
die geänderte Übertragung, die die vorherige ersetzt, können Siedelete
die Fernbedienung und schieben Sie die geänderte Übergabe direkt danach, um die Fernbedienung neu zu erstellen.