2009-04-30 15 views
5

Ich habe ein lokales Git Repo, das ich vor kurzem zu einem Commit gemacht, dann zu einem freigegebenen Repo geschoben. Erst nachdem ich es zum Shared Repo gedrängt hatte, wurde mir klar, dass ich einen hässlichen Fehler gemacht hatte. Ich kann es geändert vor Ort kein Problem, nachdem ich mit meiner Quelle behoben:Änderung eines Git Commits zu einem geteilten Repo

git commit -C HEAD -a --amend 

Danach versuchte ich einen anderen git push origin und ich erhalte den folgenden Fehler:

! [rejected]  mybranch -> mybranch (non-fast forward) 

Was ist der beste Weg, dies zu korrigieren Lage?

Antwort

7

git erlaubt es (standardmäßig) nicht, zu einem Zweig zu drücken, der die Zweigspitze "zurückspult". Mit anderen Worten, wenn der aktuelle Zweigkopf kein direkter Elternteil oder Vorfahre der Zweigspitze ist, wird der Push abgelehnt.

Sie können versuchen, trotzdem zu drücken, indem Sie die Option -f zu git push verwenden, oder indem Sie eine refspec mit einem führenden '+', z. git push origin +mybranch:mybranch.

In der Regel werden Remote-Repositories dies nicht zulassen, da Sie riskieren, Commits zu verlieren, wenn verschiedene Personen wahllos Zweig-Tipps pushen können, die keine Commits enthalten, die sie nicht lokal haben.

Sie können dieses Verhalten überschreiben, indem Sie den Konfigurationsparameter receive.denyNonFastForwards im Remote-Repository ändern (vorausgesetzt, Sie verfügen über den entsprechenden Zugriff auf das Remote-Repository).

Wenn Sie keinen solchen Zugriff haben, können Sie können dies erreichen, indem Sie den Remote-Zweig löschen und neu erstellen.

z.B.

git push origin :mybranch 
git push origin mybranch 

Beachten Sie, dass neuere Versionen von git einen Konfigurationsparameter receive.denyDeletes enthalten, wird, wenn gesetzt, verhindern diese potenziell gefährliche Abhilfe von der Arbeit.

+0

Schön, ich wusste nicht über denyNonFastForwards: Ich hatte angenommen, dass Sie einen Haken benötigt, um das durchzusetzen. – araqnid

5

Wenn Sie den Druck erzwingen wollen, können Sie ... äh ... --force an push übergeben.

Es wird jedoch allgemein als schlechte Form angesehen, den Verlauf in einem öffentlichen Repository neu zu schreiben.

0

Ihre freigegebene Repo Unter der Annahme erlaubt, nur mit einem Pluszeichen der Zweignamen als Präfix das nicht vorspulen Push zu zwingen:

git push origin +mybranch 
2

In diesem Fall ist es wahrscheinlich am besten nur mit dem ein zweiten verpflichten zu machen Fix. Da Sie das ursprüngliche erste Commit in Ihrem lokalen Repository bereits geändert haben, möchten Sie es wahrscheinlich aus dem gemeinsam genutzten Repository extrahieren und HEAD verschieben, damit das geänderte Commit durch Garbage-Collection ersetzt werden kann.

Verwandte Themen