Ich hatte ein Repository mit einigen schlechten Commits (D, E und F für dieses Beispiel).
ABCDEF-Master und Herkunft / Master
Ich habe das lokale Repository speziell mit a geändert git reset --hard
. Ich habe vor dem Zurücksetzen einen Zweig genommen, also habe ich jetzt ein Repo, das aussieht wie:
A-B-C master
\ D-E-F old_master
A-B-C-D-E-F origin/master
Jetzt brauchte ich einige Teile dieser schlechten Commits, also wählte ich die benötigten Teile aus und machte einige neue Commits, sodass ich jetzt vor Ort Folgendes habe:
A-B-C-G-H master
\ D-E-F old_master
Jetzt möchte ich diesen Zustand auf das Remote-Repo übertragen. Wenn ich jedoch versuche, einen git push
Git zu machen, gibt mir das höflich die Bürste ab:
$ git push origin +master:master --force
Total 0 (delta 0), reused 0 (delta 0)
error: denying non-fast forward refs/heads/master (you should pull first)
To [email protected]:myrepo.git
! [remote rejected] master -> master (non-fast forward)
error: failed to push some refs to '[email protected]:myrepo.git'
Wie kann ich das Remote-Repo dazu bringen, den aktuellen Status des lokalen Repos zu erfassen?
git push -force
sorgfältiger zu tun .Antworten:
Wenn das Erzwingen eines Pushs nicht hilft ("
git push --force origin
" oder "git push --force origin master
" sollte ausreichen), kann dies bedeuten, dass der Remote-Server Pushs ohne schnellen Vorlauf entweder über die Konfigurationsvariable receive.denyNonFastForwards ablehnt ( Beschreibung siehe git config manpage) oder über Update / Pre-Receive Hook.Mit älterem Git können Sie diese Einschränkung umgehen, indem Sie "
git push origin :master
" (siehe ':' vor dem Zweignamen) löschen und dann dengit push origin master
angegebenen Zweig " " neu erstellen .Wenn Sie dies nicht ändern können, dann wäre die einzige Lösung sein , anstatt die Geschichte neu zu schreiben , um ein COMMIT zu erstellen Zurücksetzen Änderungen in DEF :
quelle
get revert HEAD~N
geholfen.N
ist die Anzahl der Commits. Wenn ich beispielsweise das vorherige Commit benötige, verwende ichgit revert HEAD~1
Um Jakubs Antwort zu ergänzen: Wenn Sie in ssh Zugriff auf den Remote-Git-Server haben, können Sie in das Git-Remote-Verzeichnis gehen und Folgendes festlegen:
Kehren Sie dann zu Ihrem lokalen Repo zurück und versuchen Sie erneut, Ihr Commit durchzuführen mit
--force
:Und schließlich die Servereinstellung auf den ursprünglichen geschützten Zustand zurücksetzen:
quelle
vi
finden Sie in diesem SO-Beitrag: stackoverflow.com/a/43721579/2073804Anstatt Ihren "Master" -Zweig zu reparieren, ist es viel einfacher, ihn durch Umbenennen der Zweige mit Ihrem "gewünschten Master" zu tauschen. Siehe https://stackoverflow.com/a/2862606/2321594 . Auf diese Weise würden Sie nicht einmal eine Spur von mehreren Wiederherstellungsprotokollen hinterlassen.
quelle
Das ganze Geschäft mit dem Zurücksetzen von Gittern schien für mich sehr kompliziert zu sein.
Also habe ich etwas in dieser Richtung getan, um meinen src-Ordner in den Zustand zu bringen, den ich vor ein paar Commits hatte
Auf diese Weise wird der Status in der src in einer tar-Datei gespeichert und git wird gezwungen, diesen Status zu akzeptieren, ohne zu viel herumzuspielen. Im Grunde wird das src-Verzeichnis durch den Status ersetzt, den es vor einigen Commits hatte.
quelle
Für Benutzer von GitHub hat dies bei mir funktioniert:
git reset --hard <full_hash_of_commit_to_reset_to>
git push --force
Dadurch wird der Zweigverlauf auf Ihrem lokalen Computer und dem GitHub-Server "korrigiert". Jeder, der diesen Zweig seit dem fehlerhaften Commit mit dem Server synchronisiert hat, hat den Verlauf auf seinem lokalen Computer. Wenn sie die Berechtigung haben, direkt in den Zweig zu pushen, werden diese Commits bei der Synchronisierung sofort wieder angezeigt.
Alles, was alle anderen tun müssen, ist der
git reset
Befehl von oben, den Zweig auf ihrem lokalen Computer zu "korrigieren". Natürlich müssten sie sich vor lokalen Verpflichtungen für diesen Zweig nach dem Ziel-Hash hüten. Cherry wählt / sichert diese und wendet sie nach Bedarf erneut an. Wenn Sie sich jedoch in einem geschützten Zweig befinden, ist die Anzahl der Personen, die sich direkt darauf festlegen können, wahrscheinlich begrenzt.quelle