Löschen Sie das letzte Commit in Bitbucket


103

Ich habe einen Fehler gemacht und weiß nicht, wie ich meinen letzten Push im Repository löschen soll. Ich ziehe die neuesten Updates der App, aber es gibt Konflikte und ich schiebe sie in das Repository.

Wie lösche ich mein letztes Commit? Oder wie man es repariert?

Antworten:


102

Wenn Sie mit anderen Personen im selben Code-Repository arbeiten, sollten Sie zunächst kein Commit löschen, da beim Erzwingen der Aktualisierung des Repositorys die lokalen Repositorys Ihrer Mitarbeiter in einem illegalen Zustand bleiben (z. B. wenn diese) Nach dem gelöschten Commit sind diese Commits ungültig, da sie auf einem jetzt nicht vorhandenen Commit basieren.

Sagte , dass, tun , was Sie können , ist revert die begehen. Dieser Vorgang wird je nach verwendetem CVS unterschiedlich ausgeführt (unterschiedliche Befehle):

Auf git :

git revert <commit>

Auf Quecksilber :

hg backout <REV>

BEARBEITEN: Der Wiederherstellungsvorgang erstellt ein neues Commit, das das Gegenteil des zurückgesetzten Commits bewirkt (z. B. wenn das ursprüngliche Commit eine Zeile hinzugefügt hat, löscht das Zurücksetzungs-Commit diese Zeile), wodurch die Änderungen des unerwünschten Commits effektiv entfernt werden, ohne den Repository-Verlauf neu zu schreiben.


Danke für die Auskunft. Und ich kenne die Konsequenz, wenn ich das Commit lösche. Ich weiß nur nicht, wie ich meine Aktion rückgängig machen soll, weil ich zum ersten Mal einen Fehler gemacht habe. Ich muss mein Commit rückgängig machen, da das System bereits aktiv ist. Wir sind nur zwei, die mit diesem Repository arbeiten.
catherine

git backout <REV>? Oder : hg backout <REV>?
Armando Pérez Marqués

Was aber, wenn die nach dem Zurücksetzen hinzugefügten Commits Änderungen an der zu löschenden Zeile vorgenommen haben?
Rahs

@RahulSaha Da Sie im Grunde versuchen, ein Commit in den Zweig zu integrieren, bin ich mir ziemlich sicher, dass es Ihnen einen Zusammenführungskonflikt gibt, den Sie lösen müssen.
Asermax

98

Wenn Sie nicht mit anderen zusammenarbeiten (oder diese gerne erheblich stören) , können Sie Commits aus Bitbucket-Zweigen entfernen.

Wenn Sie versuchen, einen Nicht-Master-Zweig zu ändern:

git reset HEAD^               # remove the last commit from the branch history
git push origin :branch_name  # delete the branch from bitbucket
git push origin branch_name   # push the branch back up again, without the last commit

Wenn Sie versuchen, den Hauptzweig zu ändern

Im Allgemeinen ist der Hauptzweig nichts Besonderes - es ist nur eine Konvention. Für Bitbucket und Github und ähnliche Sites muss jedoch normalerweise ein Hauptzweig vorhanden sein (vermutlich, weil es einfacher ist, mehr Code zu schreiben, als das Ereignis zu behandeln, dass ein Repository keine Zweige hat - nicht sicher). Sie müssen also einen neuen Zweig erstellen und diesen zum Hauptzweig machen:

# on master:
git checkout -b master_temp  
git reset HEAD^              # undo the bad commit on master_temp
git push origin master_temp  # push the new master to Bitbucket

Gehen Sie in Bitbucket zu den Repository-Einstellungen und ändern Sie den "Hauptzweig" in master_temp(ändern Sie in Github den "Standardzweig").

git push origin :master     # delete the original master branch from Bitbucket
git checkout master
git reset master_temp       # reset master to master_temp (removing the bad commit)
git push origin master      # re-upload master to bitbucket

Gehen Sie jetzt zu Bitbucket, und Sie sollten den gewünschten Verlauf sehen. Sie können jetzt zur Einstellungsseite gehen und den Hauptzweig wieder auf ändern master.

Dieser Prozess funktioniert auch mit anderen Verlaufsänderungen (z git filter-branch. B. ). Sie müssen nur sicherstellen, dass die entsprechenden Commits zurückgesetzt werden, bevor der neue Verlauf vom alten getrennt wird.

edit : anscheinend musst du dich nicht um all diesen Ärger mit Github kümmern, da du einen Reset-Zweig erzwingen kannst .

Umgang mit verärgerten Mitarbeitern

Wenn das nächste Mal jemand versucht, aus Ihrem Repository zu ziehen (wenn er bereits das fehlerhafte Commit gezogen hat), schlägt das Ziehen fehl. Sie müssen vor dem geänderten Verlauf manuell auf ein Commit zurückgesetzt und dann erneut gezogen werden.

git reset HEAD^
git pull

Wenn sie das fehlerhafte Commit gezogen und zusätzlich festgeschrieben haben, müssen sie zurückgesetzt werden und dann git cherry-pickdie guten Commits, die sie erstellen möchten, um den gesamten Zweig ohne das schlechte Commit effektiv neu zu erstellen.

Wenn sie das schlechte Commit nie ausgeführt haben, wirkt sich dieser gesamte Prozess nicht auf sie aus, und sie können wie gewohnt ziehen.


1
Für diejenigen, die mit der Verwendung von SourceTree besser vertraut sind: 1) Informationen zum Ändern des Hauptzweigs in der Web-Benutzeroberfläche für BitBucket finden Sie in den Repo-Einstellungen. 2) Um einen Zweig in der Web-Benutzeroberfläche zu löschen, lesen Sie die Seite Zweige. 3) Setzen Sie das lokale Repo wie oben beschrieben zurück. 4) Verschieben Sie Ihre lokalen Änderungen nach oben, um diese Zweige neu zu erstellen.
Richard Le Mesurier

2
Als jemand, der versehentlich ein Geheimnis verraten hat, habe ich die Gründlichkeit dieser Antwort sehr geschätzt. Vielen Dank!
Drehmoment

48

Sie können zurücksetzen, um HEAD^dann das Drücken zu erzwingen.

git reset HEAD^
git push -u origin master --force

Es löscht Ihr letztes Commit und zeigt Bitbucket als gelöschtes Commit an, bleibt aber weiterhin auf dem Server.


Github wird dies zulassen, aber zum jetzigen Zeitpunkt erlaubt Bitbucket keine Kraftstöße.
JamesQMurphy

4
Tatsächlich unterstützt Bitbucket Force Pushs, nur das Diff, anstatt die nicht verfolgten Commits vollständig zu entfernen, markiert es sie als gelöscht.
Shubanker

Der empfohlene Weg von Bitbucket ist die Verwendung von "Zurücksetzen". Aber ich denke in meinem Fall ist dies angemessener. Da ich der einzige bin, der es benutzt, und es sich sauberer anfühlt als Revert. Vielen Dank.
Nafsaka

1
Ja, das funktioniert immer noch auf Bitbucket. Du hast mir gerade viel Zeit gespart! Ich habe ein Commit / Push von meiner Eclipse gemacht und mich in ein anderes Projekt verwickelt, das ich hatte. Zum Teil aufgrund einer schlechten Praxis von meiner Seite, indem ich sowohl die Befehlszeile als auch die eingebaute Eclipse für die Arbeit an Git verwendete.
DarkCygnus

Genial oder einfacher: Setzen Sie den aktuellen Zweig auf dieses Commit zurück und beheben Sie dann mit diesem Force-Push-to-Server mein Problem
Anthony Kal

3

Ich hatte in der Vergangenheit Probleme mit der Wiederherstellung von Git (hauptsächlich, weil ich nicht ganz sicher bin, wie es funktioniert). Ich hatte Probleme beim Zurücksetzen aufgrund von Zusammenführungsproblemen.

Meine einfache Lösung ist dies.

Schritt 1.

 git clone <your repos URL> .

Ihr Projekt in einem anderen Ordner, dann:

Schritt 2.

git reset --hard <the commit you wanna go to>

dann Schritt 3.

Fügen Sie in Ihrem neuesten (und Haupt-) Projektverzeichnis (dem Verzeichnis mit dem problematischen letzten Commit) die Dateien von Schritt 2 ein

Schritt 4.

git commit -m "Fixing the previous messy commit" 

Schritt 5.

Genießen


1
Ausschneiden und Einfügen ist wirklich chaotisch. Außerdem würde dies das Problem aus der Frage nicht lösen.
Daniel Lee

1
git revertist einfach: Es wird ein neues Commit erstellt, das die Änderungen in einem vorherigen Commit (oder mehreren Commits) umkehrt. Commits werden nicht gelöscht, daher ist sie für diese Frage nicht relevant. Auch der Klonschritt hier ist nicht wirklich notwendig.
naught101

1
Git Revert ist der gleiche Mechanismus wie oben.
Nafsaka

3

Hier ist ein einfacher Ansatz in bis zu 4 Schritten:

0 - Teilen Sie dem Team mit, dass Sie das Repository reparieren möchten

Verbinden Sie sich mit dem Team und informieren Sie es über die bevorstehenden Änderungen.

1 - Entfernen Sie das letzte Commit

Angenommen, Ihr Zielzweig lautet master:

$ git checkout master              # move to the target branch
$ git reset --hard HEAD^           # remove the last commit
$ git push -f                      # push to fix the remote

An diesem Punkt sind Sie fertig, wenn Sie alleine arbeiten.

2 - Korrigieren Sie die lokalen Repositorys Ihres Teamkollegen

Auf Ihrem Teamkollegen:

$ git checkout master              # move to the target branch
$ git fetch                        # update the local references but do not merge  
$ git reset --hard origin/master   # match the newly fetched remote state

Wenn Ihr Teamkollege keine neuen Commits hatte, sind Sie an diesem Punkt fertig und sollten synchron sein.

3 - Verlorene Commits zurückbringen

Angenommen, ein Teamkollege hatte ein neues und unveröffentlichtes Commit, das dabei verloren ging.

$ git reflog                       # find the new commit hash
$ git cherry-pick <commit_hash>

Tun Sie dies für so viele Commits wie nötig.

Ich habe diesen Ansatz viele Male erfolgreich angewendet. Es erfordert Teamarbeit, um sicherzustellen, dass alles synchronisiert ist.


2

Wie andere gesagt haben, möchten Sie normalerweise hg backoutoder verwenden git revert. Manchmal möchten Sie jedoch ein Commit wirklich loswerden.

Zunächst möchten Sie zu den Einstellungen Ihres Repositorys gehen. Klicken Sie auf den Strip commitsLink.

Strip schreibt einen Link in den Bitbucket-Einstellungen fest

Geben Sie die Änderungssatz-ID für den Änderungssatz ein, den Sie zerstören möchten, und klicken Sie auf Preview strip. So können Sie sehen, welche Art von Schaden Sie anrichten werden, bevor Sie es tun. Dann klicken ConfirmSie einfach und Ihr Commit ist nicht mehr Geschichte. Stellen Sie sicher, dass Sie allen Ihren Mitarbeitern mitteilen, was Sie getan haben, damit sie das beleidigende Commit nicht versehentlich zurückschieben.


Welche Version ist das und welche Berechtigungen sind erforderlich? In der Version 6.4.3, die ich mir ansehe, sieht es anders aus, und dieser Artikel ist nicht vorhanden. Ich bin Repository-Administrator.
Raphael

1

Sobald Änderungen festgeschrieben wurden, können sie nicht mehr gelöscht werden. weil die grundlegende Natur des Commits darin besteht, nicht zu löschen.

Was Sie tun können (einfache und sichere Methode),

Interaktiver Rebase:

1) git rebase -i HEAD~2 # zeigt Ihre letzten 2 Commits an

2) Ihr Commit wird wie folgt aufgelistet: Zuletzt wird am Ende der Seite LILO angezeigt (last in Last Out).

Geben Sie hier die Bildbeschreibung ein

Löschen Sie die letzte Festschreibungszeile vollständig

3) Speichern Sie es durch ctrl+XoderESC:wq

Jetzt wird Ihre Filiale ohne Ihr letztes Commit aktualisiert.


1

Sie können den Befehl auch für Bitbucket schreiben, wie von Dustin erwähnt :

git push -f origin HEAD^:master

Hinweis: Anstelle von Master können Sie einen beliebigen Zweig verwenden. Und es löscht einfach auf Bitbucket drücken.

So entfernen Sie das letzte Commit lokal in Git:

git reset --hard HEAD~1

0

Inzwischen ermöglicht Cloud-Bitbucket (ich bin nicht sicher, welche Version) das Zurücksetzen eines Commits aus dem Dateisystem wie folgt (ich sehe nicht, wie das Zurücksetzen von der Bitbucket-Oberfläche im Chrome-Browser erfolgt).

- Sichern Sie Ihr gesamtes Verzeichnis, um die Änderungen zu sichern, die Sie versehentlich festgeschrieben haben

-Wählen Sie das ausgecheckte Verzeichnis aus

-Rechte Maustaste: Schildkröten-Git-Menü

-repo-browser (die Menüoption 'Zurücksetzen' macht nur die nicht festgeschriebenen Änderungen rückgängig)

-Drücken Sie die HEAD-Taste

-Wählen Sie die oberste Zeile (das letzte Commit)

-rechte Maustaste: Änderung durch dieses Commit rückgängig machen

-Nachdem die Änderungen im Dateisystem rückgängig gemacht wurden, drücken Sie Commit

-dies aktualisiert GIT mit der Meldung 'Zurücksetzen (Ihre vorherige Nachricht). Dies kehrt Commit so und so zurück '

-Wählen Sie "Commit and Push".

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.