Wie kann ich ein festes Commit in ein Remote-Git-Repository verschieben?

Als ich am Quellcode etwas gearbeitet habe, habe ich meine übliche Sache gemacht und dann auf das Remote-Repository geklickt. Aber dann fiel mir auf, dass ich vergessen hatte, den Import im Quellcode zu organisieren. Daher mache ich einen Änderungsbefehl, um den vorherigen Commit zu ersetzen:

 > git commit --amend 

Leider kann das Commit nicht an das Repository zurückgegeben werden. Es wird wie folgt 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 kann ich tun? (Ich kann auf das Remote-Repository zugreifen.)

475
31 окт. Spoike gesetzt 31. Oktober 2008-10-31 13:23 08 um 13:23 Uhr 2008-10-31 13:23
@ 13 Antworten

Ich habe tatsächlich einmal auf das Repository von --force und --force geklickt und einen Fluch von Linus BIG TIME erhalten . Im Allgemeinen werden andere Menschen mit vielen Problemen konfrontiert. Die einfache Antwort lautet: "Tu das nicht."

Ich sehe, dass andere ein Rezept dafür geben, deshalb werde ich sie hier nicht wiederholen. Aber hier ist ein Hinweis, um sich von der Situation zu erholen, nachdem Sie die korrigierte Fixierung mit --force (oder + master) verschoben haben.

  • Suchen Sie nach dem alten Commit, den Sie dazu beigetragen haben (nennen Sie es old und wir wählen den neuen Befehl aus, den Sie durch Ändern von new ).
  • Erstellen Sie eine Verschmelzung zwischen old und new indem Sie einen new Baum schreiben. Zum Beispiel git checkout new git merge -s ours old git checkout new git merge -s ours old .
  • Kombinieren Sie dies mit Ihrem Master mit git merge master
  • Aktualisieren Sie Ihren Assistenten mit dem git push . HEAD:master Ergebnis git push . HEAD:master git push . HEAD:master
  • Ergebnis ausdrucken

Leute, die nicht erfolgreich genug waren, um ihre Arbeit auf die Fixierung zu stützen, die Sie zerstört haben, um den Push zu korrigieren und zu erzwingen (was Sie sehr bösartig sind ), werden das Ergebnis der Fusion sehen und sehen, dass Sie new als old . Bei ihren späteren Zusammenführungen werden die Konflikte zwischen old und new , die sich aus den Änderungen ergeben haben, nicht sichtbar, sodass sie nicht leiden müssen.

371
11 янв. die antwort wird von gitster 11 jan gegeben. 2009-01-11 10:36 09 um 10:36 am 2009-01-11 10:36

Sie sehen die Git-Sicherheitsfunktion. Git weigert sich, einen entfernten Zweig eines Zweigs zu aktualisieren, da Ihr Kopfzweig nicht direkt von der aktuellen Fixierung des Zweigkopfs abhängt, auf den Sie klicken.

Wenn dies nicht der Fall wäre, würden zwei Personen, die ungefähr zur gleichen Zeit an demselben Repository vorschieben, nicht wissen, dass ein neues Commit zur gleichen Zeit stattfand, und derjenige, der das letzte verschoben hat, hätte seinen Job verloren. vorheriger Schieber, ohne dass sich einer davon bewusst ist.

Wenn Sie wissen, dass Sie die einzige Person sind, die geklickt hat, und Sie den fixen Fix oder den Fix mit dem Veto des Zweigs drücken möchten, können Sie Git zwingen, den entfernten Zweig mit der -f zu aktualisieren.

 git push -f origin master 

Dies funktioniert möglicherweise nicht, da Git Remote-Repositorys mit der Konfigurationsvariable receive.denynonfastforwards schnelle Klicks am entfernten Ende receive.denynonfastforwards . Wenn dies der Fall ist, sieht der Grund für die Ablehnung folgendermaßen aus (beachten Sie den Teil "Fernausfall"):

border=0
  ! [remote rejected] master -> master (non-fast forward) 

Um dies zu umgehen, müssen Sie entweder die Konfiguration des Remote-Repositorys ändern oder Sie können den Zweig als Dirty-Hack auf folgende Weise löschen und neu erstellen:

 git push origin :master git push origin master 

Im Allgemeinen verwendet der letzte Parameter von git push das Format <local_ref>:<remote_ref> , wobei local_ref der Name des Zweigs im lokalen Repository und remote_ref der Name des Zweigs im Remote-Repository ist. Dieses Befehlspaar verwendet zwei Abkürzungen. :master ist null local_ref, dh das Auferlegen eines Null-Zweigs auf der Remote-Seite des master , dh das Löschen eines Remote-Zweigs. Zweigname ohne : bedeutet, dass der lokale Zweig mit dem angegebenen Namen an den Remote-Zweig mit demselben Namen umgeleitet wird. master in dieser Situation ist kurz für master:master .

218
01 нояб. Antwort von Charles Bailey 01. November. 2008-11-01 00:58 08 um 01:58 Uhr 2008-11-01 00:58

Schneller Wurf: Die Tatsache, dass niemand eine einfache Antwort gepostet hat, zeigt die verzweifelte Feindseligkeit des Benutzers, die sich in Git CLI manifestiert.

In jedem Fall ist der "naheliegende" Weg, dies zu tun, vorausgesetzt, dass Sie nicht versucht haben, einen Push zu erzwingen, diesen zuerst herauszuziehen. Dies wird zu der Änderung führen, die Sie daran vorgenommen haben (und daher nicht mehr da sind), so dass sie wieder angezeigt wird.

Sobald Sie Konflikte lösen, können Sie erneut klicken.

Also:

 git pull 

Wenn Sie Fehler beim Ziehen erhalten, stimmt möglicherweise etwas mit Ihrer lokalen Repository-Konfiguration (ich hatte einen ungültigen Verweis im Abschnitt .git / config).

Und danach

 git push 

Möglicherweise erhalten Sie eine zusätzliche Fixierung mit dem Thema "Trivial Merge".

184
22 сент. Antwort von Tim Band 22. September 2009-09-22 13:46 09 um 13:46 2009-09-22 13:46

Die kurze Antwort lautet: Drücken Sie nicht die korrigierten Fixierungen im öffentlichen Repo.

>git commit --amend und git rebase , schreiben den git rebase tatsächlich neu. Das ist in Ordnung, bis Sie Ihre Änderungen veröffentlichen, aber wenn Sie dies getan haben, sollten Sie sich wirklich nicht von der Geschichte täuschen lassen, denn wenn jemand Ihre Änderungen bereits erhalten hat, versuchen sie, sie wieder herauszuholen, anstatt Änderungen vorzunehmen In einem Commit sollten Sie nur ein neues Commit mit Änderungen vornehmen.

Wenn Sie jedoch eine korrigierte Nachricht wirklich drücken möchten, können Sie dies folgendermaßen tun:

 $ git push origin +master:master 

Das führende Pluszeichen zwingt Sie zum Drücken, auch wenn dies nicht zu einer Fixierung von "Schnellvorlauf" führt. (Schneller Vorlauf tritt auf, wenn die Änderungen, auf die Sie klicken, direkt von den Änderungen abhängen, die bereits im öffentlichen Repo vorhanden sind.)

86
31 окт. Die Antwort wird am 31. Oktober von Mipadi gegeben 2008-10-31 17:35 08 um 17:35 2008-10-31 17:35

Hier ist eine einfache und saubere Methode, um Ihre Änderungen vorzunehmen, nachdem Sie - commit --amend :

 git reset --soft HEAD^ git stash git push -f origin master git stash pop git commit -a git push origin master 

Was bedeutet folgendes:

  • Stellen Sie die Zweigzweige auf das übergeordnete Element zurück.
  • Klicken Sie auf letzter Commit.
  • Zwangstaste auf der Fernbedienung. Jetzt hat der Remotecomputer nicht das letzte Commit.
  • Steig in deine Brieftasche.
  • Lies sauber.
  • Klicken Sie auf die Fernbedienung.

Vergessen Sie nicht, "Ursprung" und "Master" zu ändern, wenn Sie dies auf einen anderen Zweig oder ein anderes Gerät anwenden.

20
21 июня '15 в 17:41 2015-06-21 17:41 Die Antwort wird Faiza am 21. Juni '15 um 17:41 2015-06-21 17:41 gegeben

Ich habe dieses Problem gelöst, indem ich den lokalen Fix verworfen und neue Änderungen von oben 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 
16
24 сент. Die Antwort wird am 24. September gegeben 2012-09-24 18:46 '12 um 18:46 2012-09-24 18:46

Ich hatte das gleiche Problem.

  • Der letzte Fix, der bereits gedrückt wurde, wurde zufällig angepasst.
  • Viele Änderungen vor Ort, fünfmal gemacht
  • Es wurde versucht zu klicken, einen Fehler zu erhalten, in Panik zu geraten, den Remotezugriff zusammenzuführen, viele nicht-meine-Dateien abzurufen, angeklickt, fehlgeschlagen usw.

Als Idiot dachte ich, es sei von FUBAR fertiggestellt worden.

Die Entscheidung Etwas anders, als @bara vorschlug, + einen lokalen Sicherungszweig zu erstellen

 # 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 dies keine schnelle und saubere Entscheidung, und ich habe meine Geschichte verloren (1 Commit statt 5), aber er hat seinen Job behalten.

7
20 февр. Die Antwort wird gegeben Davisca 20 Feb. 2014-02-20 13:24 '14 um 13:24 2014-02-20 13:24

Wenn Sie wissen, dass niemand Ihren Fix ohne Änderung gezogen hat, verwenden Sie die git push Option --force-with-lease git push .

In TortoiseGit können Sie dasselbe in den "Push ..." - "Force: May Discard" -Einstellungen tun und nach "bekannten Änderungen" suchen.

Durch Erzwingen (kann bekannte Änderungen ablehnen) kann das entfernte Repository einen sichereren, nicht schnellen Übergang durchführen. Dies kann dazu führen, dass das entfernte Repository seinen Commit verliert. Verwenden Sie es mit Vorsicht. Dies kann verhindern, dass Sie unbekannte Änderungen von anderen Personen auf der Fernbedienung verlieren. Es wird geprüft, ob der Server-Zweig auf dieselbe Fixierung verweist wie der Remote-Tracking-Zweig (bekannte Änderungen). Wenn ja, wird der Strom gedrückt. Andernfalls wird es abgelehnt. Da git keine Tags mit Remote-Tracking besitzt, können Tags mit dieser Option nicht überschrieben werden.

3
07 июня '16 в 3:03 2016-06-07 03:03 Die Antwort wird von ShawnFeatherly am Juni 07 '16 um 3:03 2016-06-07 03:03 gegeben

Hier ist eine einfache und saubere Methode, um Änderungen vorzunehmen, nachdem Sie git add "your files" und git commit --amend :

 git push origin master -f 

oder

 git push origin master --force 
2
18 янв. Die Antwort wird von Marwen Bkh am 18. Januar gegeben . 2016-01-18 11:29 '16 um 11:29 2016-01-18 11:29

Wenn Sie den Code auf dem Remote-Zweig (GitHub / Bitbucket) nicht gedrückt haben, können Sie die Festschreibungsnachricht in der Befehlszeile ändern (siehe unten).

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

Wenn Sie in einem bestimmten Zweig arbeiten, gehen Sie wie folgt vor:

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

Wenn Sie bereits mit einer falschen Nachricht auf den Code geklickt haben, müssen Sie beim Ändern der Nachricht vorsichtig sein. Nachdem Sie die Festschreibungsnachricht geändert haben und erneut versuchen, sie zu drücken, haben Sie Probleme. Führen Sie die folgenden Schritte aus, um den Vorgang zu vereinfachen.

Bitte lesen Sie vorher die gesamte Antwort.

 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 auf Push drücken, können Codefehler auftreten, mit denen andere Entwickler in demselben Zweig arbeiten. Um diese Konflikte zu vermeiden, müssen Sie den Code aus Ihrer Zweigstelle ziehen, bevor Sie mit Gewalt Kraft setzen :

  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, wenn Sie eine Bestätigungsnachricht ändern, wenn diese bereits gedrückt wurde.

2
13 янв. Die Antwort wird vom Packer am 13. Januar gegeben 2015-01-13 10:20 '15 am 10:20 2015-01-13 10:20

Sie erhalten diesen Fehler, weil Git Remote diese Commit-Dateien bereits enthält. Sie müssen mit Gewalt einen Zweig anklicken, damit dies funktioniert:

 git push -f origin branch_name 

Stellen Sie außerdem sicher, dass Sie den Code aus der Fernbedienung ziehen, da jemand aus Ihrem Team zu einem Zweig wechseln könnte.

 git pull origin branch_name 

Dies ist einer der Fälle, in denen ein Remote-Fix erzwungen werden muss.

1
21 янв. Die Antwort gibt Praveen Dhawan vom 21. Januar 2016-01-21 09:35 '16 am 9:35 2016-01-21 09:35

Ich musste dieses Problem beheben, indem ich aus einem Remote-Repo entfernte und die entstandenen Zusammenführungskonflikte aussortierte, korrigierte und dann auf klicken konnte. Aber ich habe das Gefühl, dass es einen besseren Weg gibt.

1
31 окт. Die Antwort wird Spoike 31. Oktober gegeben. 2008-10-31 14:39 08 um 14:39 Uhr 2008-10-31 14:39

Ich habe einfach weiter gemacht, was Git mir gesagt hat. Also:

  • Kann aufgrund einer Korrektur nicht klicken.
  • Ich versuche es wie erwartet.
  • Fehler beim Zusammenführen also repariere ich es manuell.
  • Erstellen Sie ein neues Commit (mit "Merge" gekennzeichnet) und klicken Sie darauf.
  • Es scheint, dass es funktioniert!

Hinweis Die modifizierte Fixierung war die letzte.

1
02 дек. Die Antwort ist Rolf 02 Dez. gegeben. 2016-12-02 19:29 '16 um 19:29 2016-12-02 19:29