Ich möchte alle nach dem Festschreiben vorgenommenen Änderungen verwerfen <commit-hash>
. So tat ich:
git reset --hard <commit-hash>
Jetzt möchte ich dasselbe mit meiner Fernbedienung machen. Wie kann ich das machen? Ich habe danach einige Commits (und Pushs) durchgeführt <commit-hash>
und möchte sie nur alle verwerfen. Ist nur etwas furchtbar schief gelaufen und ich möchte es nicht schlimmer machen als es schon ist. ; (
Ich möchte im Grunde meine zurückzuspulen origin/master
zu<commit-hash>
origin/master
nicht von anderen Benutzern gezogen und gedrückt wurden? Das Ändern des Verlaufs eines öffentlichen (dh nicht lokalen) Repositorys sollten Sie jederzeit vermeiden.Antworten:
Angenommen, Ihre Niederlassung wird
master
sowohl hier als auch remote aufgerufen , und Ihre Fernbedienung wird aufgerufenorigin
, könnten Sie Folgendes tun:Sie sollten dies jedoch vermeiden, wenn jemand anderes mit Ihrem Remote-Repository arbeitet und Ihre Änderungen abgerufen hat. In diesem Fall wäre es besser, zufällt Commits , dass Sie nicht wollen, dann ganz normal drücken.
Update: Sie haben unten erklärt, dass andere Personen die von Ihnen vorgenommenen Änderungen übernommen haben. Daher ist es besser, ein neues Commit zu erstellen, das alle diese Änderungen zurücksetzt . In dieser Antwort von Jakub Narębski finden Sie eine schöne Erklärung Ihrer Möglichkeiten, dies zu tun . Welche Methode am bequemsten ist, hängt davon ab, wie viele Commits Sie zurücksetzen möchten und welche Methode für Sie am sinnvollsten ist.
Da aus Ihrer Frage hervorgeht, dass Sie
git reset --hard
Ihrenmaster
Zweig bereits zurückgesetzt haben , müssen Sie möglicherweise zunächst verwendengit reset --hard ORIG_HEAD
, um Ihren Zweig wieder an den vorherigen Ort zu verschieben. ( Stellen Sie wie immergit reset --hard
sicher, dass diesgit status
sauber ist, dass Sie sich auf dem richtigen Zweig befinden und dass Sie sichgit reflog
als Werkzeug zur Wiederherstellung scheinbar verlorener Commits bewusst sind .) Sie sollten auch überprüfen, obORIG_HEAD
auf das richtige Commit verweist, mitgit show ORIG_HEAD
.Fehlerbehebung:
Wenn Sie eine Nachricht wie " ! [Remote abgelehnt] a60f7d85 -> master (Hook vor dem Empfang abgelehnt) " erhalten
Dann müssen Sie das Umschreiben des Zweigverlaufs für den jeweiligen Zweig zulassen. In BitBucket heißt es beispielsweise "Das Umschreiben des Zweigverlaufs ist nicht zulässig". Es gibt ein Kontrollkästchen mit dem Namen,
Allow rewriting branch history
das Sie aktivieren müssen.quelle
git update-ref
anstelle vonreset --hard
; es wird Ihnen ermöglichen, dasselbe zu tun, ohne einen funktionierenden Baum /revert
aber sagen wir, ich möchte die letzten 4 Commits zurücksetzen, also sollte ich es tungit revert comit1; git push; git revert comit2; git push; ...
oder einfachgit revert commit4; git push
?git revert commit4
zurücksetzen. Wenn Sie dies tun, wird ein neues Commit erstellt, das nur die Änderungen rückgängig macht, die in eingeführt wurdencommit4
. Wie die Antwort, auf die ich verwiesen habe, zeigt, können Sie diese in einem einzigen Commit zusammenfassen.git reset --hard
aber ich habe mein lokales gelöscht und wieder vom Ursprung gezogen, damit ich es tun kann.git revert ...
Mein Zweifel ist jetzt: Muss ich jedes Commit und Push (eins nach dem anderen) zurücksetzen oder einfach das erste Commit nach dem zurücksetzen nur richtig begehen?.git
Verzeichnis mit Refs zu verunreinigen , die sie nicht erstellen wollten. Ich habe zu Unrecht gesagt, dass es keine Sicherheitsüberprüfungen gibt. Die Klassifizierung in die Befehle "Sanitär" und "Porzellan" finden Sie auf der Git-Manpage .Verwenden Sie die anderen Antworten, wenn es Ihnen nichts ausmacht, lokale Änderungen zu verlieren. Diese Methode kann Ihre Fernbedienung immer noch zerstören, wenn Sie den falschen Commit-Hash auswählen, zu dem Sie zurückkehren möchten.
Wenn Sie nur die Remote-Übereinstimmung zu einem Commit machen möchten, das sich in Ihrem lokalen Repo befindet:
git log
Sie diese Option , um das Commit zu finden, bei dem sich die Fernbedienung befinden soll.git log -p
um Änderungen zu sehen odergit log --graph --all --oneline --decorate
um einen kompakten Baum zu sehen.Führen Sie einen Befehl wie folgt aus:
z.B
oder
Ich verwende den praktischen Alias (
git go
) zum Anzeigen des Verlaufs wie in Schritt 2, der wie folgt hinzugefügt werden kann:quelle
git config --global alias.graph 'log --graph --all --decorate --oneline'
ist weniger chaotisch und Sie können es immer noch einschränken, zB:git graph -5
q
das Git-Protokoll zu beenden. 2 Minuten werde ich nie zurückkommen.less
undq
ist der normale Weg, um es zu beenden. Git Bash ist wie ein * nix-Terminal.Ich habe ein Problem wie das Ihre mit folgenden Befehlen gelöst:
quelle
In GitLab müssen Sie möglicherweise Ihren Zweig auf ungeschützt setzen, bevor Sie dies tun. Sie können dies unter [Repo]> Einstellungen> Repository> Geschützte Zweige tun. Dann funktioniert die Methode aus Marks Antwort.
quelle
Wenn Sie eine frühere Version der Datei möchten, würde ich die Verwendung von git checkout empfehlen.
Wenn Sie dies tun, werden Sie in der Zeit zurückgeschickt. Dies hat keinen Einfluss auf den aktuellen Status Ihres Projekts. Sie können zur Hauptlinie Git Checkout Mainline gelangen
Wenn Sie dem Argument jedoch eine Datei hinzufügen, wird diese Datei von einer früheren Zeit zu Ihrer aktuellen Projektzeit zurückgesetzt, dh Ihr aktuelles Projekt wird geändert und muss festgeschrieben werden.
Dies hat den Vorteil, dass der Verlauf nicht gelöscht wird und bestimmte Codeänderungen auch nicht zurückgesetzt werden (git revert).
Weitere Informationen finden Sie hier https://www.atlassian.com/git/tutorials/undoing-changes#git-checkout
quelle
Meine zwei Cent zu den vorherigen Antworten: wenn
funktioniert immer noch nicht, möglicherweise möchten Sie
<your-remote-repo>.git/config
den Empfangsbereich der Datei bearbeiten :quelle
Wenn es sich bei Ihrer Niederlassung nicht um Entwicklung oder Produktion handelt, können Sie dies am einfachsten auf ein bestimmtes Commit vor Ort zurücksetzen und von dort aus eine neue Niederlassung erstellen. Sie können verwenden:
Git Checkout 000000
(wobei 000000 die Festschreibungs-ID ist, zu der Sie gehen möchten) in Ihrem problematischen Zweig und erstellen Sie dann einfach einen neuen Zweig:
git remote add [name_of_your_remote]
Dann können Sie eine neue PR erstellen und alles wird gut funktionieren!
quelle
Machen Sie eine Sache, holen Sie sich die SHA-Nr. wie 87c9808 und dann
git push --force origin master
quelle
Quellenbaum: Remote auf ein bestimmtes Commit zurücksetzen
Verschieben Sie dieses Commit auf ein neues origin / feature / 1337_MyAwesomeFeature
Ihr lokaler Feature-Zweig und Ihr Remote-Feature-Zweig befinden sich jetzt im vorherigen Commit (Ihrer Wahl)
quelle