Warum kann ich kein leeres Commit übertragen?

35
  git commit --amend --allow-empty

dann

  git push origin master

Der Idiot hat das gesagt

! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'remoteurl'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

Warum? Wie kann man das beheben?


quelle

Antworten:

56

Das Problem ist nicht, dass Sie ein leeres Commit durchführen.
Es geht darum, ein anderes Commit (eines mit einem anderen SHA1) als das bereits gepushte Commit zu pushen.
Das ist, was git commit --amendtut: Es hat das letzte Commit geändert, es erstellt kein neues.

Das bedeutet, dass Sie eine andere Historie verschieben, als die, die andere möglicherweise bereits geklont haben.
Wenn Sie sicher sind, dass dies kein Problem darstellt, müssen Sie den Push erzwingen:

git push -f origin master

Hättest du tun sollen:

git commit --allow-empty

Sie hätten ein neues (leeres) Commit erstellt, das Sie ohne Probleme hätten pushen können.

VonC
quelle
5

Wenn Sie eine Pull-Anfrage für Github erstellen möchten. Sie können:

git commit --allow-empty -m "make pull request"

Dann erstellen Sie eine Pull-Anfrage ohne Änderung.

1Rhino
quelle
3

Um die akzeptierte Antwort zu verdeutlichen, da ich nicht genug Reputation habe, um einen Kommentar abzugeben:

Wenn Sie verwenden

git commit --amend

Es wird ein neues Commit erstellt. Es wird jedoch nicht an das aktuelle Festschreiben angehängt, sondern an das übergeordnete Element des aktuellen Festschreibens. Optisch würde es wie eine Gabel aussehen.

  O (old commit)
 /
O-O (amended commit)

Git interpretiert dies als eine Abweichung von der Fernbedienung. Das ist der Grund, warum Sie es nicht schieben können, ohne es zu erzwingen.

Dustin
quelle
0

Stellen Sie sicher, dass der Remote-Zweig, zu dem Sie eine Push-Verbindung herstellen möchten, derzeit nicht ausgecheckt ist. Ich habe einmal ein Git-Repository auf einem meiner Server erstellt und konnte nicht herausfinden, warum ich nicht darauf zugreifen konnte. Nach ungefähr einem Tag der Fehlerbehebung stellte ich fest, dass ich beim Auschecken auf dem Server-Repository kein Push auf das Repository (oder den gewünschten Zweig) durchführen konnte. Daher habe ich einfach einen neuen Zweig erstellt, den ich auschecke, wenn ich Änderungen am Server vorgenommen habe, und kann dann einen Push an den Server senden. Dies ist möglicherweise nicht Ihr Problem, aber es trat ein ähnlicher Fehler auf, als ich ein Problem hatte, das auf einen leeren Git auf meinem Server drückte.

PRaven
quelle