4212 Stimmen

Löschen von Übertragungen aus einem Zweig in Git

Ich würde gerne wissen, wie ich eine Übertragung löschen kann.

Unter delete Ich meine, dass es so ist, als ob ich diesen Commit nicht gemacht hätte, und wenn ich in Zukunft einen Push mache, werden meine Änderungen nicht in den entfernten Zweig gepusht.

Ich habe die Git-Hilfe gelesen und denke, dass ich den folgenden Befehl verwenden sollte git reset --hard HEAD . Ist dies korrekt?

64 Stimmen

Ich denke, das ist no ein Duplikat von Git letzte Übergabe rückgängig machen da er fragt, wie er löschen soll cualquier von einem Zweig übertragen. Ich denke auch, dass keine der Antworten auf diese Frage eingeht. Sie alle spulen die letzten Commits zurück, nicht cherry-pick y delete eine einzelne Übergabe, die vielleicht schon eine Weile zurückliegt.

22 Stimmen

@Chris, die Antwort mit git rebase -i HEAD~10 geht auf diese Frage ein, da es Ihnen erlaubt, die zu löschenden Commits willkürlich auszuwählen. Git wendet die Commits in dem von Ihnen angegebenen Bereich einzeln an und ignoriert dabei Commits, die Sie aus dem Protokoll entfernt haben. Ich habe diesen Befehl heute verwendet, um die zweit- und drittjüngsten Commits in meinem Repo zu löschen, während ich den obersten beibehalten habe. Ich stimme zu, dass keine der anderen Antworten zufriedenstellend ist.

0 Stimmen

@MST ja, ich hätte sagen sollen, dass keine der Optionen in der akzeptierten Antwort auf diese Frage eingeht, aber Sie haben absolut Recht - dieser Befehl scheint zu funktionieren

131voto

tk_ Punkte 14471

Angenommen, wir wollen die Commits 2 und 4 aus dem Repo entfernen. (

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

Note : Sie müssen über Administratorrechte für das Projektarchiv verfügen da Sie mit --hard y -f .

  • git checkout b3d92c5 Prüfen Sie die letzte brauchbare Übertragung.
  • git checkout -b repair Erstellen Sie einen neuen Zweig, an dem Sie arbeiten möchten.
  • git cherry-pick 77b9b82 Begehen Sie die Übergabe 3.
  • git cherry-pick 2c6a45b Führen Sie Commit 1 durch.
  • git checkout master Meister der Kasse.
  • git reset --hard b3d92c5 Setzt den Master auf die letzte brauchbare Übertragung zurück.
  • git merge repair Mischen Sie unseren neuen Zweig mit master.
  • git push -f origin master Schieben Sie den Master in das entfernte Repository.

3 Stimmen

Der letzte Schritt sollte sein git push -f origin master es gibt keine Option --hard

7 Stimmen

Ich denke commit 0 ist älter als commit 1 . Bitte können Sie mir sagen, warum der erste Durchlauf commit 3 (durch Rosinenpicken) und dann durch commit 1 ? Nach dem Auschecken von b3d92cd ( commit 0 ) Ich würde erwarten, dass Cherry-Pick commit 1 entonces commit 3 . Danke.

1 Stimmen

@JarekC Ich glaube, der oberste Commit ist der neueste Commit hier, es sei denn, ich sehe etwas falsch...

73voto

Siva Praveen Punkte 1747
git rebase -i HEAD~2

Dabei steht '2' für die Anzahl der Commits, die Sie rebasen wollen.

'git rebase -i HEAD`

wenn Sie alle Übertragungen zurücksetzen wollen.

Dann können Sie eine dieser Optionen wählen.

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

d, drop = remove commit

Diese Zeilen können neu sortiert werden; sie werden von oben nach unten ausgeführt. Wenn Sie hier eine Zeile entfernen, geht DIESE ÜBERTRAGUNG VERLOREN. Wenn Sie jedoch alles entfernen, wird der Rebase abgebrochen. Beachten Sie, dass leere Commits auskommentiert werden

Sie können diesen Commit einfach mit der Option "d" oder Entfernen einer Zeile, die Ihren Commit enthält, entfernen.

0 Stimmen

In der neuesten Git-Version gibt es keine Option mehr d . Sie müssen nur Zeilen mit Übertragungen aus Rebase entfernen, um sie zu löschen.

61voto

Javier C. Punkte 6835

[Schnelle Antwort]

Sie haben viele Alternativen, zum Beispiel:

  • Alternative 1:

    git rebase -i <YourCommitId>~1

    Ändern Sie YourCommitId in die Nummer des Commits, zu dem Sie zurückkehren möchten.

  • Alternative 2:

    git reset --hard YourCommitId
    git push <origin> <branch> --force

    Ändern Sie YourCommitId in die Nummer des Commits, zu dem Sie zurückkehren möchten.

    Ich empfehle diese Option nicht, da Sie dabei Ihre laufende Arbeit verlieren können.

  • Alternative 3:

    git reset --soft HEAD~1

    Sie können Ihre Arbeit behalten und nur die Übertragung rückgängig machen.

1 Stimmen

git reset --soft HEAD~1 hat bei mir perfekt funktioniert. Es stellt sicher, dass ich keine Änderungen aus dieser Übertragung verliere. Vielen Dank für Ihre klare Antwort.

58voto

IliasT Punkte 3385

Geschichte gewaltsam ändern

Angenommen, Sie wollen nicht nur den letzten Commit löschen, sondern bestimmte Commits der letzten n Commits, dann wählen Sie:

git rebase -i HEAD~<number of commits to go back> also git rebase -i HEAD~5 wenn Sie die letzten fünf Übertragungen sehen wollen.

Ändern Sie dann im Texteditor das Wort pick a drop neben jeder Übertragung, die Sie entfernen möchten. Speichern Sie und beenden Sie den Editor. Voila!

Geschichte additiv ändern

Versuchen Sie git revert <commit hash> . Zurückkehren erstellt eine neu Commit, das den angegebenen Commit rückgängig macht.

0 Stimmen

drop Schlüsselwort nicht definiert ist. Um eine Übertragung zu löschen, entfernen Sie einfach die gesamte Zeile.

2 Stimmen

Bei mir war "Drop" als Schlüsselwort definiert, aber ein "Drop" schien die Übergabe nicht aus der Historie zu entfernen. Das Entfernen der Zeile aus dem interaktiven rebase hingegen schon.

0 Stimmen

Ich habe die Zeile gestrichen, wie es an mehreren Stellen vorgeschlagen wurde: Das hat nichts gebracht. Das Ersetzen des Wortes pick con drop hat die Übertragung gelöscht. Hinweis: Die Anweisungen befinden sich im Abschnitt Auskommentiert im unteren Teil des Inhalts des Texteditors. Verwendung von git version 2.24.3 (Apple Git-128)

58voto

Jakub Narębski Punkte 286531

Wenn Sie die Änderungen nicht veröffentlicht haben, können Sie die letzte Übertragung entfernen, indem Sie

$ git reset --hard HEAD^

(Beachten Sie, dass dadurch auch alle nicht bestätigten Änderungen entfernt werden; verwenden Sie diese Option mit Vorsicht).

Wenn Sie den zu löschenden Commit bereits veröffentlicht haben, verwenden Sie mit einem Git rückgängig machen

$ git revert HEAD

0 Stimmen

Das hat nicht geklappt. Wenn ich git logge, ist immer noch alles da, egal, was ich tue, es werden einfach mehr Commits hinzugefügt. Ich möchte den Verlauf bereinigen.

0 Stimmen

@Costa: Was hat nicht funktioniert (d.h. welche Version haben Sie verwendet), und wie haben Sie git protokolliert?

0 Stimmen

Ich habe fast alles in dieser Frage und Antwort ausprobiert. (Zuletzt habe ich es mit git revert HEAD versucht) Mein Git-Protokoll: tree = log --all --graph --format=format:'%C(bold blue)%h%C(reset) %C(dim black)%s%C(reset)%C(bold red)%d%C(reset) %C(green)by %an, %ar%C(reset)'

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