1103 Stimmen

Zurücksetzen der Fernbedienung auf eine bestimmte Übertragung

Ich möchte alle nach der Übergabe vorgenommenen Änderungen verwerfen <commit-hash> . Also tat ich es:

git reset --hard <commit-hash>

Jetzt möchte ich das Gleiche mit meiner Fernbedienung machen. Wie kann ich das tun? Ich habe einige Commits (und Pushes) durchgeführt, nachdem <commit-hash> und ich möchte sie einfach alle loswerden. Ist nur etwas ging furchtbar und ich möchte es nicht noch schlimmer machen, als es ohnehin schon ist ;(

Ich möchte im Grunde mein Leben zurückspulen origin/master à <commit-hash>

1913voto

Mark Longair Punkte 412179

Angenommen, Ihr Zweig heißt master sowohl hier als auch in der Ferne, und dass Ihre Fernbedienung heißt origin könnten Sie tun:

 git reset --hard <commit-hash>
 git push -f origin master

Sie sollten dies jedoch vermeiden, wenn jemand anderes mit Ihrem entfernten Repository arbeitet und Ihre Änderungen übernommen hat. In diesem Fall wäre es besser, wenn Sie zurückkehren die Commits, die Sie nicht wollen, und pushen Sie dann wie gewohnt.

Aktualisierung: Sie haben weiter unten erklärt, dass andere Leute die von Ihnen vorgenommenen Änderungen zurückgenommen haben, also ist es Es ist besser, eine neue Übertragung zu erstellen, die all diese Änderungen rückgängig macht. . Eine ausführliche Erläuterung der Möglichkeiten findet sich unter diese Antwort von Jakub Narebski . Welche Methode am besten geeignet ist, hängt davon ab, wie viele Übertragungen Sie rückgängig machen wollen und welche Methode für Sie am sinnvollsten ist.

Da aus Ihrer Frage hervorgeht, dass Sie bereits git reset --hard zum Zurücksetzen Ihrer master Zweig, müssen Sie möglicherweise mit der Verwendung von git reset --hard ORIG_HEAD um Ihren Zweig wieder an die vorherige Stelle zu verschieben. (Wie immer bei git reset --hard stellen Sie sicher, dass git status sauber ist, dass Sie auf dem richtigen Zweig sind und dass Sie wissen, dass git reflog als Werkzeug zur Wiederherstellung scheinbar verlorener Commits). Sie sollten auch überprüfen, ob ORIG_HEAD weist auf die richtige Übergabe hin, mit git show ORIG_HEAD .

Fehlersuche:

Wenn Sie eine Meldung wie " ! [remote abgelehnt] a60f7d85 -> master (Vor-Empfangshaken abgelehnt) "

dann müssen Sie das Umschreiben der Zweiggeschichte für den jeweiligen Zweig erlauben. In BitBucket heißt es zum Beispiel "Rewriting branch history is not allowed". Es gibt eine Checkbox namens Allow rewriting branch history die Sie überprüfen müssen.

239voto

Walf Punkte 7428

Die Verwendung anderer Antworten kann zu einem unnötigen Verlust des lokalen Status führen. Lokale Änderungen sind nicht zwangsläufig erforderlich, um eine Remote zu ändern. Diese Methode kann immer noch Ihre Remote zerstören, wenn Sie den falschen Commit zum Zurückgehen wählen, aber selbst dann können Sie normalerweise den richtigen Commit finden und es erneut versuchen.

Sie muss den gewünschten Commit irgendwo in Ihrem lokalen Repo haben, der mit dem Remote übereinstimmen soll.

  1. Do no eine Rückstellung vornehmen.
  2. Utilisez git log um das Commit zu finden, an dem Sie die Fernbedienung platzieren möchten. Verwenden Sie git log -p um Änderungen zu sehen, oder git log --graph --all --oneline --decorate um einen kompakten Baum zu sehen.
  3. Kopieren Sie den Hash, das Tag oder (wenn es sich um den Tip handelt) den Zweignamen des Commits.
  4. Führen Sie einen Befehl wie:

    git push --force <remote> <commit-ish>:<the remote branch>

    たとえば

    git push --force origin 606fdfaa33af1844c86f4267a136d4666e576cdc:master

    oder

    git push --force staging v2.4.0b2:releases

Wenn der erzwungene Push fehlschlägt, wird er wahrscheinlich von der Fernbedienung deaktiviert. Dies kann umgangen werden, indem eine oder beide der folgenden Optionen vorübergehend geändert werden receive.denyNonFastForwards y receive.denyDeletes . Wenn Ihr Fernzugriff auf einem Dienst ohne Shell-Zugang gehostet wird, gibt es wahrscheinlich Einstellungen, die Sie ändern können, um erzwungene Pushs zuzulassen.


Ich verwende einen praktischen Alias ( git go ) für die Anzeige der Historie wie in Schritt 2, die wie folgt hinzugefügt werden kann:

git config --global alias.go 'log --graph --all --decorate --oneline'

86voto

Ibrohim Ermatov Punkte 1989

Ich habe ein Problem wie Ihres mit diesen Befehlen gelöst:

git reset --hard <commit-hash> 
git push -f <remote> <local branch>:<remote branch>

39voto

dudasaus Punkte 561

Auf GitLab müssen Sie Ihren Zweig möglicherweise auf ungeschützt bevor Sie dies tun. Sie können dies unter [Repo] > Einstellungen > Repository > Geschützte Verzweigungen tun. Dann funktioniert die Methode aus Marks Antwort.

git reset --hard <commit-hash>
git push -f origin master

25voto

priya khokher Punkte 592

Wenn Sie eine frühere Version der Datei benötigen, empfehle ich die Verwendung von git checkout.

git checkout <commit-hash>

Wenn Sie dies tun, werden Sie in der Zeit zurückgeschickt, es hat keinen Einfluss auf den aktuellen Stand Ihres Projekts, Sie können zu mainline kommen git checkout mainline

aber wenn Sie eine Datei im Argument hinzufügen, wird diese Datei zu Ihnen zurückgebracht von einem früheren Zeitpunkt zu Ihrem aktuellen Projektzeitpunkt, d. h. Ihr aktuelles Projekt wird geändert und muss festgeschrieben werden.

git checkout <commit-hash> -- file_name
git add .
git commit -m 'file brought from previous time'
git push

Der Vorteil dabei ist, dass die Historie nicht gelöscht wird und auch keine bestimmten Codeänderungen rückgängig gemacht werden (git revert)

Weitere Informationen finden Sie hier https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X