Antworten:
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.
git backout <REV>
? Oder : hg backout <REV>
?
Wenn Sie nicht mit anderen zusammenarbeiten (oder diese gerne erheblich stören) , können Sie Commits aus Bitbucket-Zweigen entfernen.
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
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 .
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-pick
die 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.
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.
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
git revert
ist 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.
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.
Wie andere gesagt haben, möchten Sie normalerweise hg backout
oder 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 commits
Link.
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 Confirm
Sie 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.
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).
Löschen Sie die letzte Festschreibungszeile vollständig
3) Speichern Sie es durch ctrl+X
oderESC:wq
Jetzt wird Ihre Filiale ohne Ihr letztes Commit aktualisiert.
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
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".