Früheres Commit entfernen, aber aktuelle Änderungen beibehalten

Lesezeit: 5 Minuten

Benutzeravatar von Bernd Strehl
Bernd Strehl

Ich habe einige Commits in meinem Repository wie:

A - Added Feature A
B - Removed Feature B
C - Redesigned Feature C
D - Added Feature D
E - Added Feature D

Wobei E das letzte Commit ist, das ich gemacht habe. Jetzt möchte ich die Änderungen, die ich mit Feature C vorgenommen habe, loswerden, aber ich möchte die mit D und E hinzugefügten Änderungen beibehalten.

  • mögliches Duplikat von Git: Entfernen ausgewählter Commit-Log-Einträge für ein Repository

    – John Szakmeister

    16. Juli 2013 um 10:24 Uhr

  • @jszakmeister: Nicht genau das Gleiche, der verlinkte Beitrag möchte Commits quetschen, während das OP sie hier löschen möchte

    – KarlB

    16. Juli 2013 um 10:28 Uhr

  • @CharlesB Nicht ganz richtig. Das Squashing von B und C war eine Wahl, ebenso wie das Entfernen der Commits in der Frage des OP. Die Antwort enthält Anweisungen zu beiden.

    – John Szakmeister

    16. Juli 2013 um 10:30 Uhr

Interaktive Neubasierung ist dein Freund!

Wie andere gesagt haben:

$ git rebase -i HEAD~5

…Wo -i ist das interaktive Flag, und HEAD~5 bedeutet, dass die letzten 5 Commits in die interaktive Rebase aufgenommen werden.

Wenn Sie den Editor als Ergebnis der obigen Ausgabe aufwecken, werfen Sie einen Blick auf den Kommentar in der geöffneten Datei:

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

Das Wichtigste für Sie ist Wenn Sie hier eine Zeile entfernen, geht DAS COMMIT VERLOREN.

Löschen Sie also die Zeilen, die auf die Commits verweisen, die Sie loswerden möchten, speichern und schließen Sie, und git erledigt den Rest (je nach Art des Commits und der Rückkehr, die Sie zu löschen versuchen, müssen Sie möglicherweise einige Konflikte beheben ).

Es ist wichtig zu beachten, dass, wenn Sie Ihren Code bereits gepusht haben und andere ihn gezogen haben, das Obige nicht funktioniert, da die Commits ihren Weg dorthin zurückfinden, wenn jemand, der Ihren Zweig ausgecheckt hat, das nächste Mal einen Push durchführt. Das interaktive Rebase löscht die Commits in dem Maße, in dem es keine Aufzeichnungen über sie gibt, sodass die anderen Klone nicht wissen, dass sie gelöscht wurden. Wenn sie das nächste Mal pushen, werden sie versuchen, sie neu zu installieren, da die lokalen Klone “sehen”, dass der Ursprung nicht die Objekte (Commits) hat, die Sie gelöscht haben.

  • Das ist hier viel besser erklärt. Dies sollte als Antwort akzeptiert werden.

    – Cyrill CHAPON

    15. Dezember 2016 um 14:53 Uhr

  • @CyrilCHAPON – obwohl ich zustimme, dass dies eine gute Antwort ist (auf den Fragentitel), ist es meiner Meinung nach nicht unbedingt die richtige Antwort auf die gestellte Frage (im Hauptteil). Die Antwort von IMO @ aib ist die bevorzugte, da die Neubasierung destruktiv ist (schreibt den Verlauf um – wie in dieser Antwort erwähnt, aber IMO nicht ausreichend hervorgehoben). Manchmal ist dies die einzige Antwort, aber IMO-Rebase sollte immer nur als letzter Ausweg auf einem Master-Zweig verwendet werden.

    – Jeremy Davis

    2. November 2017 um 6:13 Uhr

  • Fantastisches, interaktives Rebase ist in der Tat ein Freund.

    – gesetzlich

    13. Februar um 6:17 Uhr

Wenn Sie nur “die Änderungen loswerden” (wie in Ihrem Fragetext angegeben) und nicht tatsächlich “ein Commit entfernen” (wie im Titel angegeben) möchten, ist dies eine einfache Option Hinzufügen ein neuer Commit, der genau das Gegenteil von dem tut, was der frühere Commit getan hat.

Es ist nicht narrensicher und kann aufgrund von Änderungen, die seitdem vorgenommen wurden, zu Konflikten führen, aber es ändert nichts an der Historie, ermöglicht Ihnen, die Umkehrung und ihre Gründe zu dokumentieren, und spielt gut mit anderen Arbeitskopien.

git revert ist das Werkzeug, das verwendet wird, um solche bösen Zwillinge aus einer Reihe von Commits zu machen.

Gehen Sie dazu folgendermaßen vor:

git rebase -i HEAD~3

dann verschieben Sie Commit C, um das erste ganz unten zu sein, Sie werden haben

D - Added Feature D
E - Added Feature D
C - Redesigned Feature C

Sie speichern und verlassen dann

git reset HEAD^

dies wird Commit C rückgängig machen.

Benutzeravatar von mnagel
Nagel

das nennt man rebasing: du willst das -i schalten.

lesen: https://www.atlassian.com/git/tutorial/rewriting-git-history#!rebase-i

für eine ähnliche Frage/Antwort siehe: https://stackoverflow.com/a/2938393/2536029

Wenn Sie nur lokale Änderungen vorgenommen haben, folgen Sie wahrscheinlich am besten einer rebasierenden Antwort. Wenn Sie die Änderungen irgendwo veröffentlicht haben, möchten Sie kein Rebase durchführen, da dies den Verlauf ändern wird, was bedeutet, dass alle anderen ebenfalls ein Rebase durchführen müssen, oder Sie werden Ihr anstößiges Commit wieder zusammenführen.

Wenn andere Leute Ihre Commits haben, ist es am saubersten, die störende Änderung rückgängig zu machen, nicht sie vollständig zu entfernen. Verwenden git revert COMMIT_ID um einen neuen Commit zu erstellen, der die vorgenommenen Änderungen rückgängig macht COMMIT_ID.

Benutzeravatar von Tyler S. Loeper
Tyler S. Loeper

Verwenden Sie Git-Revert

Die bei weitem beste Lösung ist die Verwendung von git revert. Dadurch wird ein neuer Commit erstellt, der die Änderungen in einem bestimmten SHA rückgängig macht. Dies ist ein sehr sicherer Weg, um einen Commit zu entfernen, und kann leicht mit anderen oder entfernten Branches zusammengeführt werden.

So verwenden Sie Git Revert

git revert <insert bad commit hash here>

Benutzeravatar von Aminah Nuraini
Aminah Nuraini

Wenn Sie TortoiseGit unter Windows verwenden, können Sie mit der rechten Maustaste auf den Git-Ordner klicken und dann klicken TortoiseGit > Show log. Sie können alle zuvor durchgeführten Commits anzeigen und dann das Commit markieren, zu dem Sie zurückkehren möchten.

Klicken Sie auf den Commit und Sie können die geänderten Dateien unten sehen. Klicken Sie mit der rechten Maustaste auf die wiederherzustellenden Dateien und klicken Sie dann auf revert to parent revision.

Wie man Commits zurücksetzt

1446000cookie-checkFrüheres Commit entfernen, aber aktuelle Änderungen beibehalten

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

Privacy policy