Wenn ich ein bisschen mit meinem Quellcode gearbeitet habe, habe ich mein übliches Commit ausgeführt und dann in ein Remote-Repository verschoben. Aber dann bemerkte ich, dass ich vergessen hatte, meine Importe im Quellcode zu organisieren. Also mache ich den Änderungsbefehl, um das vorherige Commit zu ersetzen:
> git commit --amend
Leider kann das Commit nicht zurück in das Repository verschoben werden. Es wird folgendermaßen 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 Remote-Repository zugreifen.)
git
git-commit
amend
Spoike
quelle
quelle
git push -force
sorgfältiger zu tun .Antworten:
Ich habe tatsächlich einmal mit
--force
und.git
Repository gepusht und wurde von Linus BIG TIME beschimpft . Im Allgemeinen wird dies viele Probleme für andere Menschen verursachen. Eine einfache Antwort lautet "Tu es nicht".Ich sehe, dass andere sowieso das Rezept dafür gegeben haben, deshalb werde ich sie hier nicht wiederholen. Aber hier ist ein Tipp, um sich von der Situation zu erholen, nachdem Sie das geänderte Commit mit --force (oder + master) veröffentlicht haben.
git reflog
Sie diese Option, um das alte Commit zu finden, das Sie geändert haben (rufen Sie es aufold
, und wir rufen das neue Commit auf, das Sie durch Ändern erstellt habennew
).old
undnew
, indem Sie den Baum vonnew
, like aufzeichnengit checkout new && git merge -s ours old
.git merge master
git push . HEAD:master
Dann werden die Menschen , die unglücklich genug waren, haben sich für ihre Arbeit auf dem Festschreiben Sie ausgelöscht durch eine Änderung und zwingt einen Push wird das resultierende merge sehen werden sehen , dass Sie bevorzugen
new
überold
. Bei ihren späteren Zusammenschlüssen werden die Konflikte zwischenold
undnew
die aus Ihrer Änderung resultierenden Konflikte nicht sichtbar, sodass sie nicht leiden müssen.quelle
git reflog
, um es zu findenSie sehen eine Git-Sicherheitsfunktion. Git weigert sich, den Remote-Zweig mit Ihrem Zweig zu aktualisieren, da das Head-Commit Ihres Zweigs nicht direkt vom aktuellen Head-Commit des Zweigs abhängt, auf den Sie pushen.
Wenn dies nicht der Fall wäre, würden zwei Personen, die ungefähr zur gleichen Zeit in dasselbe Repository pushen, nicht wissen, dass zur gleichen Zeit ein neues Commit eingeht, und wer zuletzt pusht, würde die Arbeit des vorherigen Drückers ohne eines von beiden verlieren sie erkennen dies.
Wenn Sie wissen, dass Sie die einzige Person sind, die Druck ausübt, und Sie ein geändertes Commit oder ein Commit, das den Zweig zurückspult, senden möchten, können Sie Git zwingen, den Remote-Zweig mithilfe des
-f
Schalters zu aktualisieren .Auch dies funktioniert möglicherweise nicht, da Git es Remote-Repositorys ermöglicht, nicht schnell vorwärts gerichtete Pushs am anderen Ende mithilfe der Konfigurationsvariablen abzulehnen
receive.denynonfastforwards
. In diesem Fall sieht der Ablehnungsgrund folgendermaßen aus (beachten Sie den Teil "Remote abgelehnt"):Um dies zu umgehen, müssen Sie entweder die Konfiguration des Remote-Repositorys ändern oder als Dirty-Hack den Zweig folgendermaßen löschen und neu erstellen:
Im Allgemeinen verwendet der letzte Parameter
git push
das Format<local_ref>:<remote_ref>
, wobeilocal_ref
der Name des Zweigs im lokalen Repository undremote_ref
der Name des Zweigs im Remote-Repository ist. Dieses Befehlspaar verwendet zwei Abkürzungen.:master
hat eine null local_ref, was bedeutet, dass eine Nullverzweigung auf die entfernte Seite verschoben wirdmaster
, dh die entfernte Verzweigung gelöscht wird. Ein Zweigstellenname ohne:
Mittel schiebt den lokalen Zweig mit dem angegebenen Namen an den Remote-Zweig mit demselben Namen.master
in dieser Situation ist kurz fürmaster:master
.quelle
git gc
Ablauf der Reflogs werden alte Objekte beschnitten. Niemand, der das Repository klont, erhält Objekte, die nicht mehr erreichbar sind, sobald der Zweig aktualisiert wurde.Schneller Scherz: Die Tatsache, dass hier niemand die einfache Antwort gepostet hat, zeigt die verzweifelte Benutzerfeindlichkeit der Git-CLI.
Wie auch immer, der "offensichtliche" Weg, dies zu tun, vorausgesetzt, Sie haben nicht versucht, den Druck zu erzwingen, besteht darin, zuerst zu ziehen. Dadurch wird die Änderung, die Sie geändert haben (und daher nicht mehr haben), abgerufen, sodass Sie sie wieder haben.
Sobald Sie Konflikte gelöst haben, können Sie erneut pushen.
Damit:
Wenn beim Ziehen Fehler auftreten, stimmt möglicherweise etwas in Ihrer lokalen Repository-Konfiguration nicht (ich hatte eine falsche Referenz im Zweigabschnitt .git / config).
Und danach
Vielleicht bekommen Sie ein zusätzliches Commit mit dem Thema, das von einer "Trivial Merge" erzählt.
quelle
git push -f
odergit reset
ist der einzige Weg hierher.Kurze Antwort: Schieben Sie geänderte Commits nicht auf ein öffentliches Repo.
Lange Antwort: Einige Git-Befehle wie
git commit --amend
undgit rebase
schreiben das Verlaufsdiagramm tatsächlich neu. Dies ist in Ordnung, solange Sie Ihre Änderungen nicht veröffentlicht haben, aber wenn Sie dies einmal getan haben, sollten Sie sich wirklich nicht mit dem Verlauf beschäftigen, denn wenn jemand Ihre Änderungen bereits erhalten hat, kann dies fehlschlagen, wenn er erneut versucht, sie zu ziehen . Anstatt ein Commit zu ändern, sollten Sie nur ein neues Commit mit den Änderungen vornehmen.Wenn Sie jedoch wirklich, wirklich ein geändertes Commit vorantreiben möchten, können Sie dies folgendermaßen tun:
Das führende
+
Zeichen erzwingt das Drücken des Pushs, auch wenn dies nicht zu einem "Fast-Forward" -Commit führt. (Ein Fast-Forward-Commit tritt auf, wenn die Änderungen, die Sie vornehmen, direkt von den Änderungen abhängen, die bereits im öffentlichen Repo enthalten sind.)quelle
git push -f
.Hier ist eine sehr einfache und saubere Möglichkeit, Ihre Änderungen zu verschieben, nachdem Sie bereits Folgendes vorgenommen haben
commit --amend
:Welches macht das Folgende:
Denken Sie daran, "Ursprung" und "Master" zu ändern, wenn Sie dies auf einen anderen Zweig oder eine andere Fernbedienung anwenden.
quelle
git add
vor meinem Commit verwenden, um die Änderungen aufzunehmen.git reset --soft "HEAD^"
. Der Rest funktioniert gut.Ich habe es gelöst, indem ich mein lokales geändertes Commit verworfen und die neuen Änderungen oben hinzugefügt habe:
quelle
Ich hatte das gleiche Problem.
Als Git-Neuling dachte ich, es sei komplett FUBAR .
Lösung: Etwas wie von @bara vorgeschlagen + einen lokalen Sicherungszweig erstellt
Vielleicht ist es keine schnelle und saubere Lösung, und ich habe meine Historie verloren (1 Commit statt 5), aber es hat einen Tag Arbeit gespart.
quelle
Wenn Sie den Code nicht in Ihren Remote-Zweig (GitHub / Bitbucket) übertragen haben, können Sie die Commit-Nachricht in der Befehlszeile wie folgt ändern.
Wenn Sie an einem bestimmten Zweig arbeiten, gehen Sie folgendermaßen vor:
Wenn Sie den Code bereits mit einer falschen Nachricht gepusht haben, müssen Sie beim Ändern der Nachricht vorsichtig sein. Wenn Sie also die Festschreibungsnachricht ändern und erneut versuchen, sie zu übertragen, treten Probleme auf. Befolgen Sie die folgenden Schritte, um den Vorgang zu vereinfachen.
Bitte lesen Sie die gesamte Antwort, bevor Sie dies tun
Wichtiger Hinweis: Wenn Sie den Force Push direkt verwenden, können Codeprobleme auftreten, an denen andere Entwickler in demselben Zweig arbeiten. Um diese Konflikte zu vermeiden, müssen Sie den Code aus Ihrem Zweig ziehen, bevor Sie den Force-Push ausführen :
Dies ist die beste Vorgehensweise beim Ändern der Festschreibungsnachricht, wenn diese bereits übertragen wurde.
quelle
--force
. Siehe die akzeptierte AntwortWenn Sie wissen, dass niemand Ihr nicht geändertes Commit gezogen hat, verwenden Sie die
--force-with-lease
Optiongit push
.In TortoiseGit können Sie dasselbe unter den Optionen "Push ...", "Force: May verwirft" und "Bekannte Änderungen" überprüfen.
quelle
Sie erhalten diesen Fehler, weil die Git-Fernbedienung bereits über diese Festschreibungsdateien verfügt. Sie müssen den Zweig zwingen, damit dies funktioniert:
Stellen Sie außerdem sicher, dass Sie den Code von der Fernbedienung abrufen, da möglicherweise eine andere Person in Ihrem Team in denselben Zweig verschoben hat.
Dies ist einer der Fälle, in denen wir das Commit auf Remote erzwingen müssen.
quelle
Hier ist eine sehr einfache und saubere Möglichkeit, Ihre Änderungen zu verschieben, nachdem Sie bereits ein
git add "your files"
und vorgenommen habengit commit --amend
:oder:
quelle
Ich musste dieses Problem beheben, indem ich aus dem Remote-Repo zog und mich mit den entstandenen Zusammenführungskonflikten befasste, festschrieb und dann pushe. Aber ich habe das Gefühl, dass es einen besseren Weg gibt.
quelle
Ich habe einfach weiter gemacht, was Git mir gesagt hat. Damit:
Hinweis: Das geänderte Commit war das neueste.
quelle
Folgendes hat für mich funktioniert, als ich den Autor und Committer eines Commits geändert habe.
git push -f origin master
Git war klug genug, um herauszufinden, dass es sich um Commits identischer Deltas handelte, die sich nur im Abschnitt mit den Metainformationen unterschieden.
Sowohl die lokalen als auch die entfernten Köpfe wiesen auf die fraglichen Commits hin.
quelle
Wenn Sie Visual Studio Code verwenden, können Sie diese Erweiterung ausprobieren, um dies zu vereinfachen.
https://marketplace.visualstudio.com/items?itemName=cimdalli.git-commit-amend-push-force
Wie Sie dem Namen entnehmen können, werden Befehle nacheinander ausgeführt
git commit --amend
git push --force
quelle
Hier ist, wie ich eine Bearbeitung in einem vorherigen Commit behoben habe:
git stash
Jetzt ist Ihre Arbeitskopie im Status Ihres letzten Commits sauber.git commit --all --amend
Ihr Editor fragt nach einer Protokollnachricht (standardmäßig die alte Protokollnachricht). Speichern Sie den Editor und beenden Sie ihn, wenn Sie damit zufrieden sind.
Die neuen Änderungen werden dem alten Commit hinzugefügt. Überzeugen Sie sich selbst mit
git log
undgit diff HEAD^
Wenden Sie Ihre versteckten Änderungen erneut an, falls sie vorgenommen wurden:
git stash apply
quelle