Ich habe das Gefühl, dass diese Frage schon oft gestellt wurde, aber die Lösung lautet normalerweise "Ich habe das Verzeichnis gelöscht und meine Arbeit mit einer neuen Kasse wiederholt." Ich habe ein Commit und Push durchgeführt, aber festgestellt, dass ich in der Commit-Nachricht auf die falsche Ticketnummer verwiesen habe. Also suchte ich bei SO nach einer schnellen Lösung und tippte am Ende Folgendes in das Terminal ein:
$ git reset --soft HEAD^
$ git commit -m "... correct message ..."
Das einzige Problem ist, dass ich die folgende Fehlermeldung erhalte:
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
Ich verwende das Git-Flow-Modell und arbeite am Entwicklungszweig. Wie kann ich Dinge wieder zusammenführen, um Git wieder glücklich zu machen?
git
version-control
rynmrtn
quelle
quelle
Antworten:
Kraft
git push
:quelle
receive.denyNonFastForwards
in Brian Campbells Antwort :+
oder--force
möglicherweise nicht ausreichend aussagekräftig, je nachdem, wie sie - wer auch immer sie sind - ihr Git-Repository konfiguriert haben .Wenn Sie ein Commit an den Server schieben, und dann neu zu schreiben , die lokal zu begehen (mit
git reset
,git rebase
,git filter-branch
oder jede andere Geschichte Manipulation), und dann schob die neu geschriebenen verpflichten zurück bis zu dem Server, wird schrauben Sie auf alle anderen , die gezogen hatte. Hier ist ein Beispiel; Angenommen, Sie haben A festgeschrieben und auf den Server übertragen.Jetzt beschließen Sie, A auf die von Ihnen erwähnte Weise neu zu schreiben, zurückzusetzen und erneut festzuschreiben. Beachten Sie, dass dies ein baumelndes Commit A hinterlässt, das schließlich als Müll gesammelt wird, da es nicht erreichbar ist.
Wenn jemand anderes, sagen wir Fred,
master
währenddessen vom Server herunterfährt , hat er einen Verweis auf A, von dem aus er möglicherweise mit der Arbeit beginnt:Wenn Sie nun in der Lage wären, Ihr A 'zum Ursprung / Master zu verschieben, was einen nicht schnellen Vorlauf erzeugen würde, hätte es kein A in seiner Geschichte. Wenn Fred also erneut versuchen würde zu ziehen, müsste er plötzlich zusammengeführt werden und würde das A-Commit wieder einführen:
Wenn Fred dies bemerkt, könnte er eine Rebase durchführen, die verhindern würde, dass Commit A wieder erscheint. Aber er würde das bemerken und daran denken müssen; und wenn Sie mehr als eine Person haben, die A nach unten gezogen hat, müssten sie alle neu gründen, um zu vermeiden, dass das zusätzliche A-Commit in den Baum aufgenommen wird.
Daher ist es im Allgemeinen keine gute Idee, die Geschichte eines Repos zu ändern, aus dem andere Leute ziehen. Wenn Sie jedoch zufällig wissen, dass niemand anderes aus diesem Repo zieht (zum Beispiel ist es Ihr eigenes privates Repo, oder Sie haben nur einen anderen Entwickler, der an dem Projekt arbeitet, mit dem Sie sich leicht koordinieren können), können Sie dies mit Gewalt tun Update durch Ausführen von:
oder
Diese ignorieren beide die Überprüfung auf einen nicht schnellen Vorlauf und aktualisieren die Daten auf dem Server auf Ihre neue A'-Revision, wobei die A-Revision abgebrochen wird, damit sie schließlich als Müll gesammelt wird.
Es ist möglich, dass Force Pushs mit der
receive.denyNonFastForwards
Konfigurationsoption vollständig deaktiviert werden . Diese Option ist standardmäßig für freigegebene Repositorys aktiviert. In diesem Fall ist es die beste Option, den Zweig zu löschen und ihn mit neu zu erstellen, wenn Sie einen Push wirklich erzwingen möchtengit push origin :master; git push origin master:master
. DiedenyNonFastForwards
Option ist jedoch aus einem oben beschriebenen Grund aktiviert. In einem gemeinsam genutzten Repository bedeutet dies, dass jetzt jeder, der es verwendet, sicherstellen muss, dass er auf den neuen Verlauf zurückgreift.In einem gemeinsam genutzten Repository ist es im Allgemeinen besser, nur neue Commits nach oben zu verschieben, um das Problem zu beheben. Sie können
git revert
Commits generieren, mit denen die Änderungen früherer Commits rückgängig gemacht werden.quelle
+develop
sein Kommando eingegeben - also geht der Scheck an ihn. Sie haben sowieso eine astronomische Anzahl von Punkten: Pgit push --force
receive.denyNonFastForwards
Konfigurationsoption können erzwungene Pushs vollständig deaktiviert werden . Diese Option ist standardmäßig für freigegebene Repositorys aktiviert. In diesem Fall ist es die beste Option, den Zweig zu löschen und ihn mit neu zu erstellen, wenn Sie einen Push wirklich erzwingen möchtengit push origin :remote_A; git push origin local_A:remote_A
. Aber lesen Sie, was ich oben darüber geschrieben habe, warum es eine schlechte Idee ist, diese Art von Workflow in einem gemeinsam genutzten Repository durchzuführen. Sie sollten versuchen, dies nur zu tun, wenn Sie etwas haben, das ernsthafte Probleme beim Festschreiben verursacht, das Sie entfernen oder neu schreiben möchten.Möglicherweise müssen Sie eine
git pull
Aktion ausführen, die möglicherweise automatisch für Sie zusammengeführt wird. Dann können Sie erneut festschreiben. Wenn Sie Konflikte haben, werden Sie aufgefordert, diese zu lösen.Denken Sie daran, dass Sie angeben müssen, aus welchem Zweig Sie ziehen möchten, wenn Sie Ihre gitconfig nicht aktualisiert haben, um anzugeben ...
Beispielsweise:
quelle
! [rejected] develop -> develop (non-fast-forward)
git push origin develop
)Ich habe EGit verwendet und war auch mit diesem Problem konfrontiert. Ich habe gerade versucht,
rebase
die aktuelle Filiale und es hat funktioniert.quelle