Wie kann man gepushte Commits rückgängig machen?

Lesezeit: 7 Minuten

Benutzer-Avatar
John Little

Wir möchten die letzten 2 Commits rückgängig machen, die beide an den Ursprungsmaster gepusht wurden. In Tortoise Git können wir den Verlauf anzeigen und auf das drittletzte Commit klicken und “Master auf diese zurücksetzen” auswählen, was unserer Meinung nach bedeutet, zu dieser Version zurückzukehren.

Wenn Sie diese Option auswählen, müssen Sie jedoch eine dieser drei Optionen auswählen:

  1. soft – Lassen Sie den Arbeitsbaum und den Index unberührt.
  2. gemischt – Arbeitsbaum unberührt lassen, Index zurücksetzen
  3. hart – Arbeitsbaum und Index zurücksetzen.

Leider wissen wir nicht, welche dieser 3 Optionen wir wählen sollen – wir wollen nur die letzten beiden Commits rückgängig machen und in der Zeit zurückgehen.

Die nächste Frage ist, ob dieser Vorgang auf dem Remote-Ursprung, Ihrem Repo oder Ihrem Arbeitsverzeichnis oder einer Kombination dieser 3 erfolgt? Muss zB nach dem Zurücksetzen ein Commit und Push durchgeführt werden, oder erledigt es das für Sie?

Wir würden vermuten, dass HARD das ist, was wir wollen – es wird das Repository (nicht sicher welches) und unseren lokalen Quellcode auf eine frühere Version zurücksetzen. Wenn dies der Fall ist, warum ist dies nicht die Standardeinstellung, und was ist der Anwendungsfall für die anderen beiden Optionen? Entweder möchten Sie wiederherstellen oder nicht, und wenn Sie nur das Remote-Repo und nicht Ihre lokalen Arbeitsdateien wiederherstellen, werden Sie in einem unordentlichen Zustand sein.

Wir haben keine lokal modifizierten Dateien.

Beachten Sie, dass wir ziemlich verzweifelt nach einer Lösung suchen, die Git nicht kaputt macht (wir haben Git in der Vergangenheit kaputt gemacht und mussten ein neues Repo erstellen). Vielleicht ist eine andere Methode möglich, z. B. eine vorherige Version auszuchecken und sie dann über die neueste Version einzuchecken, aber wir wissen nicht, wie das geht.

Wir bekommen, dass wir so etwas tun können:

git checkout [revision]

Aber wie teilen wir git dann mit, dass wir diese Version zum neuen Kopf machen oder den Kopf durch diesen ersetzen wollen? Ich vermute, wir können uns nicht einfach festlegen, da es nichts zu tun gibt, da wir nicht mehr auf dem Kopf des Meisters sind. Nebenbei, wenn Sie sich ein vorheriges ansehen. Version, und ändere sie, und übertrage, was übergibst du und wohin?

ich habe gelesen https://www.atlassian.com/git/tutorials/undoing-changes aber es geht nicht auf die Beziehung zwischen lokalen und entfernten Repos ein. Wenn die rückgängig zu machenden Commits alle auf den Remote-Origin-Master gepusht werden, ist unklar, wie das Rezept lautet, um den Remote-Ursprung, das lokale Repo und das Arbeitsverzeichnis wiederherzustellen – alle 3 müssen auf die Commits vor 3 Commits zurückgesetzt werden. Es ist uns egal, ob dies mit einem Reset oder Revert geschieht – wir brauchen nur eine Möglichkeit, dies zu tun, die an allen 3 Standorten funktioniert.

Es könnte sein, dass das richtige Rezept ungefähr so ​​​​aussieht:

   git status (we are on master with a clean working dir)
   git git revert HEAD~2
   git commit -m "revert"
   git push origin mater

Aber wir haben diese Schritte in den Beispielen noch nie gesehen und würden es lieber mit Tortoise Git machen, wenn möglich.

Diese Lösung hat mir Zeit gespart

1) git reset –hard 93827927ed6e245be27f94c93c7e3574e85b91c6 (das ist deine Commit-ID)
2) git reset HEAD~1
3) Git-Stash
4) git hinzufügen.
5) git commit -m “Deine neue Commit-Nachricht hier”
6) git push –force

Es gibt zwei Möglichkeiten, wie Sie dies tun können.

  1. Sie können einfach alles entfernen und zum alten Zustand zurückkehren, der für Sie richtig ist.
  2. Machen Sie die vorgenommenen Änderungen rückgängig.

Für die 1. Lösungkönnen Sie die folgenden Befehle verwenden:

git reset --hard <commit-id>

Dadurch wird der Kopf für den Zweig, in dem Sie sich gerade befinden, auf diese spezifische “Commit-ID” gebracht, die Ihrer Meinung nach korrekt und angemessen ist.

git push -f origin <branch-name>

Dieser Befehl wird zwangsweise in den Zweig verschoben, in dem Sie sich befinden. Die Kombination dieses Befehls und des obigen Befehls kann es Ihnen ermöglichen, alle unnötigen Commits zu entfernen, die Sie in Ihrem Zweig haben, beginnend ganz oben und bis zu dieser “Commit-ID”.

Notiz: Dadurch wird die “Commit-ID” nicht entfernt, bis die “Commit-ID” aus Ihrem Zweig entfernt wird.

Für die 2. Lösungkönnen Sie die folgenden Befehle verwenden:

git revert <commit-id>

Dieser Befehl wird verwendet, um die spezifische “Commit-ID” rückgängig zu machen, die Sie rückgängig machen möchten.

Wenn Sie versehentlich einen anderen Branch in Ihren anderen Branch gemergt haben, können Sie diesen Befehl verwenden, um die Merge-Anforderung rückgängig zu machen:

git revert -m 2 <commit-id>

Dieser Befehl wird verwendet, um alle Änderungen rückgängig zu machen oder zu entfernen, die im Merge-Commit „commit-id“ vorgenommen wurden. Dadurch kann der Merge-Commit „commit-id“ rückgängig gemacht werden, außerdem werden alle Änderungen des Commit entfernt, die mit diesem Merge einhergingen. Die Commits, die mit der Zusammenführung einhergingen, werden jedoch nicht entfernt

  • Wie die oberste Antwort erwähnt, sollten Sie sich vor dem Push festlegen

    – Zeeshan Khan

    29. Juni um 12:28 Uhr

Benutzer-Avatar
julianisch

Es gibt zwei Möglichkeiten:

  1. Gehen Sie zurück in die Geschichte, aber bewahren Sie die Geschichte: revert
  2. Gehen Sie in der Geschichte zurück und ändern Sie die Geschichte, damit der Inhalt der Commits für immer entfernt wird: reset --hard und push --force.

Wenn Sie sich nicht sicher sind, dann verwenden Sie revertes ist die sicherste Option.

Wenn Sie die Commits wirklich, wirklich gerne entfernen möchten und sich nicht um den geänderten Verlauf kümmern, verwenden Sie reset --hard und push --force. Dies hat folgende Konsequenzen:

  • Andere könnten den Commit wieder einführen
  • Andere könnten von dem entfernten Commit abhängen
  • In öffentlichen Repositories ist Force Pushing zum Master ein No-Go

Fragen

Die nächste Frage ist, ob dieser Vorgang auf dem Remote-Ursprung, Ihrem Repo oder Ihrem Arbeitsverzeichnis oder einer Kombination dieser 3 erfolgt? Muss zB nach dem Zurücksetzen ein Commit und Push durchgeführt werden, oder erledigt es das für Sie?

Im Allgemeinen befinden sich alle Änderungen in TortioseGit in Ihrem Klon (“Arbeitskopie”). Auch Push ist immer eine manuelle Aktion

Wir würden vermuten, dass HARD das ist, was wir wollen – es wird das Repository (nicht sicher welches) und unseren lokalen Quellcode auf eine frühere Version zurücksetzen. Wenn dies der Fall ist, warum ist dies nicht die Standardeinstellung, und was ist der Anwendungsfall für die anderen beiden Optionen?

Da hard Commits und damit den Verlauf entfernt, ist dies eine gefährliche Operation. Sie könnten auch Änderungen anderer entfernen!

Was ist der Anwendungsfall für die anderen beiden Optionen?

Siehe Was ist der Unterschied zwischen git reset –mixed, –soft und –hard?

Schritte in TortoiseGit:

Zurückkehren

  1. Commit rückgängig machen (aus Log)

Geben Sie hier die Bildbeschreibung ein

  1. Änderungen übernehmen
    Geben Sie hier die Bildbeschreibung ein

  2. und schieben

Hart zurücksetzen und Druck erzwingen

  1. Zurücksetzen (aus Protokoll)

Geben Sie hier die Bildbeschreibung ein

  1. Wähle schwer

Geben Sie hier die Bildbeschreibung ein

  1. Push erzwingen (Checkbox “Bekannte Änderungen”)

Geben Sie hier die Bildbeschreibung ein

Benutzer-Avatar
Alexander

Ich denke, Sie verwechseln Zurücksetzen und Zurücksetzen, sehen Sie Änderungen rückgängig machen:

zurückkehren

Der Befehl git revert macht einen festgeschriebenen Snapshot rückgängig. Aber anstatt das Commit aus dem Projektverlauf zu entfernen, findet es heraus, wie die durch das Commit eingeführten Änderungen rückgängig gemacht werden können, und hängt ein neues Commit mit dem resultierenden Inhalt an. Dies verhindert, dass Git den Verlauf verliert, was für die Integrität Ihres Revisionsverlaufs und für eine zuverlässige Zusammenarbeit wichtig ist.

zurücksetzen

Wenn git revert eine „sichere“ Methode ist, um Änderungen rückgängig zu machen, können Sie sich git reset als die gefährliche Methode vorstellen. Wenn Sie mit git reset rückgängig machen (und die Commits nicht mehr von irgendeiner Referenz oder dem Reflog referenziert werden), gibt es keine Möglichkeit, die ursprüngliche Kopie abzurufen – es ist ein dauerhaftes Rückgängigmachen. Bei der Verwendung dieses Tools ist Vorsicht geboten, da es einer der wenigen Git-Befehle ist, der das Potenzial hat, Ihre Arbeit zu verlieren.

Wahrscheinlich ist es in Ihrem Fall besser, zurück zu verwenden:

Geben Sie hier die Bildbeschreibung ein

In diesem Fall erstellen Sie einfach ein neues Commit, das ein bestimmtes Commit zurücksetzt, keine Änderung des Verlaufs. Sie können dies lokal tun und dann auf Remote übertragen.

Wenn Sie trotzdem zurücksetzen möchten und lokale Änderungen nicht beibehalten müssen, führen Sie einen Hard-Reset durch:

Geben Sie hier die Bildbeschreibung ein

und dann solltest du force push machen:

git push -f

1116740cookie-checkWie kann man gepushte Commits rückgängig machen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy