Wie kann ein Push-Reset in das Remote-Repository erzwungen werden?

94

Unsere entfernte Hauptniederlassung wurde irgendwie durcheinander gebracht. Der aktuelle Entwicklungscode befindet sich zusammen mit den neuesten Commits in der Hauptniederlassung. Offensichtlich ist der Entwicklungscode nicht für den Hauptzweig bereit.

Also habe ich in meinem lokalen Repository einen Reset auf das neueste Tag durchgeführt git reset --hard (Tag). Der Hauptzweig ist jetzt in meinem lokalen Repository korrekt. Wenn ich jetzt versuche, die Änderungen in das Remote-Repository zu übertragen, git push origin masterwird folgende Fehlermeldung angezeigt:

To (REMOTE GIT REPOSITORY LOCATION)
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'
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.

Nachdem ich mich umgesehen hatte, fand ich die --forceOption heraus. Also habe ich einen Force-Push auf das Remote-Repository durchgeführt git push --force origin masterund immer noch eine Fehlermeldung erhalten:

Total 0 (delta 0), reused 0 (delta 0)
remote: error: denying non-fast-forward refs/heads/master (you should pull first)
To (REMOTE GIT REPOSITORY LOCATION)
 ! [remote rejected] master -> master (non-fast-forward)
error: failed to push some refs to '(REMOTE GIT REPOSITORY LOCATION)'

Ich kann keinen Pull-on-Master ausführen, da er Entwicklungscode enthält, der nicht auf dem Master sein kann.

Samwell
quelle
3
Ich denke, die Nachricht bedeutet, dass Sie nicht die Rechte haben, einen nicht schnellen Vorlauf durchzuführen.
Svick
3
Sie hatten Recht, danke. In der Konfigurationsdatei für das Repository auf Remote , denyNonFastforwards = true. Ich habe es in false geändert, meine Änderungen verschoben und dann wieder in true geändert. Nochmals vielen Dank an alle für die Hilfe.
Samwell
2
@samwell bitte markieren Sie die Antwort von svick als akzeptiert
hultqvist
@samwell hat die Antwort von svick für dich funktioniert oder nicht?
Songo
Für diejenigen, die Details zum Deaktivieren von verweigernNonFastForwards wie Samwell benötigen, finden Sie weitere Anweisungen hier: stackoverflow.com/a/43721579/2073804
ron190

Antworten:

152

Die Meldung bedeutet, dass Sie keinen nicht schnellen Vorlauf ausführen dürfen.

Ihr Remote-Repository hat höchstwahrscheinlich denyNonFastforwards = truein seiner Konfiguration. Wenn Sie das ändern, git push --forcesollte es funktionieren.

Um die Einstellung zu ändern, benötigen Sie Zugriff auf den Computer mit dem Remote-Repository. Von dort aus tun git config receive.denynonfastforwards false.

svick
quelle
1
Kannst du ein git configfür einen Server machen? Oder vielleicht haben Sie das metaphorisch verwendet. Um mit diesen Ideen zu spielen, habe ich ein Test-Repo in /opt/git(meinem Git-Server-Bereich) erstellt und dann diese Einstellung in geändert /opt/git/the_repo/the_repo.git/config. Aber sobald das erledigt ist, git push --force origin SHA:branchhat es nach Bedarf funktioniert.
HankCa
4
Die Fehlermeldung enthält eine Zeile, die mit "Fehler: Einige Refs konnten nicht an <Ihr Repository> gesendet werden" beginnt, wobei <Ihr Repository> der Pfad ist, der auf .git endet. Dies ist ein Verzeichnis, das eine Datei mit dem Namen "config" enthält. Diese „config“ Datei ist , wo Sie denyNonFastforwards = false einstellen
Schmirgel
1
Der Kommentar von @ emery ist wertvoll. Manchmal wird der Ursprung des Ordners auf dem Server auf /srv/git/repo.git festgelegt. Dies ist die Konfiguration, für die leugnenNonFastForwards festgelegt wurde, nicht der Anwendungsordner.
Elijah Lynn
1
@hsalimi Wenn Sie keinen Zugriff auf den Server haben, müssen Sie sich an den Serveradministrator wenden und ihn vorübergehend ausschalten lassen, damit Sie Push erzwingen und dann wieder einschalten können. Es ist jedoch unwahrscheinlich, dass die meisten dazu in der Lage sind. In einer internen Umgebung mit Ihrem eigenen Hosting-Team kann dies häufiger vorkommen.
Elijah Lynn
1
Dies ist anfangs frustrierend, aber das Schöne daran ist: Die Fernbedienung ist standardmäßig vollständig geschützt. Wenn Sie als Entwickler absichtlich und korrekt Rebases ausführen, können Sie diese Konfiguration überschreiben, um das gefährliche Verhalten zuzulassen. Rebasing ist etwas, das jeder Git-Benutzer wissen sollte - und wann er es nicht tun sollte. doc1 doc2
Moodboom
15

Die Fernbedienung erlaubt keinen nicht schnellen Vorlauf.

Ihre beste Option ist es, git revertalle Commits zu übernehmen, die nicht vorhanden sein sollten, und in Zukunft vorsichtiger zu sein.

git revert [commit]wird ein neues Commit erstellen, das alles rückgängig macht, was [commit]getan wurde.

Richo
quelle
Es waren einige Einstellungen im Remote-Repository, die alle Änderungen beim nicht schnellen Vorlauf blockierten.
Samwell
Wenn Sie dies tun und Commits erneut anwenden müssen, wird der Verlauf nicht in einem Revert entfernt, sondern nur der Code ändert sich, und Sie können die Commits nicht auswählen oder zusammenführen
mtpultz
12

Schritte zum dauerhaften Aktivieren des Kraftdrucks im folgenden Stil

git push -f myrepo my-branch

Bearbeiten Sie die Datei mit dem Namen "config" in dem Ordner, der auf Ihrem Remote-Repository mit ".git" endet

Suchen Sie in der Befehlszeilenausgabe von git nach dem fehlgeschlagenen Push nach der Zeile, in der Folgendes steht:

error: failed to push some refs to 'ssh://[email protected]/srv/git/myrepo.git

dann

ssh [email protected]
cd /srv/git/myrepo.git
vi config

Setzen Sie "leugnenNonFastforwards" auf false

In "config" setzen

[receive]
        denyNonFastforwards = false

Jetzt können Sie mit -f von Ihrem lokalen Computer aus pushen

git push -f myrepo my-branch
Schmirgel
quelle
Wie geht das ohne Zugang zu SSH, um Git Repo zu entblößen?
Vladimir Vukanac
Vielleicht den Befehl git revert verwenden, wie es Richo vorschlägt? Wenn Sie zuerst den aktuellen Status des Repos sichern, können Sie Ihren Code weiterhin zusammenführen, um fortzufahren.
Schmirgel
git revertist etwas kompliziert, wenn Sie Zusammenführungen haben. Um komplizierter zu sein, hat mein Fall 3 Zusammenführungen, von denen eine mit sehr altem ~ 20 Commit von der Entwicklung abweicht, die zweite ist eine Art Zusammenführung von Master - hässlich wie die Hölle.
Vladimir Vukanac
1
Möglicherweise besteht die Lösung darin, den gewünschten Status zurückzusetzen, zu sichern (Stash), erneut zu ziehen und ein Backup (Stash) anzuwenden.
Vladimir Vukanac
1
mrW Sie können immer noch die gewünschte Codebasis auf einer zurückgesetzten / gezogenen Codebasis zusammenführen
emery
11

Versuchen Sie, das -fFlag zu verwenden und es nach dem Namen des Remote-Zweigs zu setzen.

git push origin master -f

Chris Ledet
quelle
1
Nein, das hat auch nicht funktioniert. Ich habe auch versucht git push -f origin masterund das gleiche Ergebnis. Beide Male, als ich es versuchte, bekam ich die zweite Version der Fehlermeldung.
Samwell
2

Du darfst keinen Git-Push machen, der nicht schnell vorspult.

  1. Wenn es sich bei der Fernbedienung um GitHub handelt, https://github.com/$USER/$REPO/settings/branchesrufen Sie den betreffenden Zweig auf und heben Sie den Schutz auf.

    Geben Sie hier die Bildbeschreibung ein

    Sie müssen Administrator des Repos sein, um das zu tun.

  2. Wenn die Fernbedienung Ihr eigener Git-Server ist, führen Sie sie git config receive.denynonfastforwards falsedort aus.

Filiph
quelle
Beachten Sie, dass für Git Hub Enterprise-Instanzen Pushs in den Standardzweig (normalerweise "Master") auf Instanzebene deaktiviert werden können. Dies bedeutet, dass Sie selbst dann, wenn "master" nicht geschützt ist und wenn Sie ein Site-Administrator sind, keine Force-Pushs in den Standardzweig ausführen können. Angenommen, Sie haben Berechtigungen, können Sie dies vorübergehend umgehen, indem Sie den Standardzweig auf etwas anderes umstellen, Ihren Force-Push ausführen und dann zurückschalten.
Christopher Hunter
2

Der beste Weg, dies zu umgehen, besteht darin, den Remote-Zweig zu löschen und erneut zu senden:

git push origin master --delete
git push origin master
Danilo Souza Morães
quelle
0

Das Problem tritt auf, weil der aktuelle Zweig nicht richtig für den PULL konfiguriert ist . Überprüfen Sie zunächst mit -, ob der Upstream-Zweig für den Pull richtig konfiguriert ist git remote show origin. Sie finden es im Abschnitt - Lokale Zweige, die für 'git pull' konfiguriert sind : . Wenn nicht, konfigurieren Sie es mit:

git config branch.MYBRANCH.merge refs/heads/MYBRANCH

Geben Sie dem Platzhalter den entsprechenden Filialnamen an - MYBRANCH

Sudheesh.MS
quelle
0

Ich verwende diese Befehlsgruppe, um mein Remote-Repo zurückzusetzen. Dadurch wird Ihr lokales Repo neu initialisiert und erneut mit Ihrem Remote-Repo verknüpft. Anschließend werden die Aktualisierungen erzwungen.

Ich denke, dass dieser Weg in Ihrem Fall nicht funktioniert, aber für jemand anderen nützlich sein kann

Gehen Sie zum Quellordner und führen Sie die folgenden Befehle aus: Beachten Sie, dass dies https://github.com/*.gitIhr Remote-Repo-Link ist

git init
git remote add origin https://github.com/*.git
git add .
git commit -m "initial commit"
git push origin master -f
git push --set-upstream origin master

**Note: this will clear all your git history on your master branch**

Khaled AbuShqear
quelle
0

Für mich zeigte @svicks Hinweis in die richtige Richtung. Da der Git-Server, den ich ändern wollte, eigentlich meine Box ist, habe ich mich angemeldet und git config --global receive.denynonfastforwards falsealle Repos geändert, um einen erzwungenen Nicht-ff-Push zu akzeptieren. Hat nicht sofort funktioniert. Was ich fand war, dass in der Konfiguration bereits receive.denynonfastforwards=truefestgelegt war und es nicht mit gelöscht werden konnte git config --global --unset receive.denynonfastforwards. Das manuelle Bearbeiten im Repo ( vi config) hat jedoch funktioniert.

jglathe
quelle
0

Ich habe das Problem gelöst, indem ich den Hauptzweig aus dem geschützten und auch standardmäßigen Zweig entfernt habe, der beim Festlegen eines Repositorys etwas über den geschützten Zweigregeln liegt.

dasra khadka
quelle