remote - git remove specific commit




Commits aus einem Zweig in Git löschen (18)

Ich möchte wissen, wie man ein Commit löscht.

Mit delete meine ich, es ist, als ob ich das Commit nicht gemacht hätte, und wenn ich in der Zukunft einen Push mache, werden meine Änderungen nicht an den entfernten Zweig weitergeleitet.

Ich lese Git-Hilfe, und ich denke, der Befehl, den ich verwenden sollte, ist git reset --hard HEAD . Ist das richtig?


Alle obigen Befehle stellen den Status Ihrer Arbeitsstruktur und des Index wie vor dem Festschreiben wieder her, jedoch nicht den Status des Repositorys. Wenn Sie es betrachten, wird das "entfernte" Commit nicht wirklich entfernt, es ist einfach nicht das an der Spitze des aktuellen Zweigs.

Ich denke, es gibt keine Möglichkeit, ein Commit mit Porzellanbefehlen zu entfernen. Die einzige Möglichkeit ist es, es aus dem Log zu entfernen und erneut umzuschreiben und dann eine git prune --expire -now .


Angenommen, wir möchten 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>

Hinweis: Sie müssen über Administratorrechte für das Repo verfügen, da Sie --hard und -f .

  • git checkout b3d92c5 Das letzte verwendbare Commit git checkout b3d92c5 .
  • git checkout -b repair Erstellen Sie einen neuen Zweig, an dem Sie arbeiten können.
  • git cherry-pick 77b9b82 Commit git cherry-pick 77b9b82 3.
  • git cherry-pick 2c6a45b Ausführen des Commits 1.
  • git checkout master Checkout master.
  • git reset --hard b3d92c5 Master auf zuletzt verwendbares Commit git reset --hard b3d92c5 .
  • git merge repair Füge unsere neue Filiale auf Master zusammen.
  • git push -f origin master Schieben Sie den Master zum Remote-Repo.

Eine andere Möglichkeit ist einer meiner persönlichen Lieblingsbefehle:

git rebase -i <commit>~1

Dies startet die Erneuerung im interaktiven Modus -i an der Stelle kurz vor dem Commit, das Sie schlagen wollen. Der Editor beginnt mit der Auflistung aller Commits seitdem. Löschen Sie die Zeile mit dem zu löschenden Commit und speichern Sie die Datei. Rebase erledigt den Rest der Arbeit, löscht nur diesen Commit und gibt alle anderen wieder in das Protokoll zurück.


Hier ist eine andere Möglichkeit, dies zu tun:

Überprüfen Sie den Zweig, den Sie wiederherstellen möchten, und setzen Sie dann Ihre lokale Arbeitskopie auf den Commit zurück, den Sie auf dem Remote-Server als letztes verwenden möchten (alles, was danach passiert, wird auf Wiedersehen gehen). Dazu habe ich in SourceTree mit der rechten Maustaste auf das geklickt und "BRANCHNAME auf dieses Commit zurücksetzen" ausgewählt. Ich denke, die Befehlszeile lautet:

git reset --hard COMMIT_ID

Da Sie Ihren Zweig gerade aus der Ferne ausgecheckt haben, werden Sie keine lokalen Änderungen vornehmen, um sich Sorgen um den Verlust zu machen. Aber das würde sie verlieren, wenn Sie es tun würden.

Navigieren Sie dann zum lokalen Verzeichnis Ihres Repositorys und führen Sie den folgenden Befehl aus:

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Dadurch werden alle Commits nach dem aktuellen in Ihrem lokalen Repository gelöscht, jedoch nur für diesen einen Zweig.


Quelle: https://gist.github.com/sagarjethi/c07723b2f4fa74ad8bdf229166cf79d8

Löschen Sie den letzten Commit

Zum Beispiel dein letzter Commit

git push ursprung + aa61ab32 ^: master

Nun möchten Sie dieses Commit löschen und anschließend eine einfache Möglichkeit, dies zu tun

Schritte

  1. Setzen Sie zuerst den Zweig auf das übergeordnete Element des aktuellen Commits zurück

  2. Drücken Sie die Fernbedienung mit Gewalt.

git reset HEAD^ --hard

git push origin -f

Für ein bestimmtes Commit möchten Sie Folgendes zurücksetzen

git reset bb676878^ --hard

git push origin -f

Setzen Sie die lokale Zweigstelle zurück

git reset --hard HEAD~<Number of commit> So git reset --hard HEAD~3

Erzwinge den Push zum Ursprung

git push -f origin

Verwenden Sie git revert https://git-scm.com/docs/git-revert Es wird den gesamten Code rückgängig machen, dann können Sie das nächste Commit ausführen. Dann wird der Kopf auf das letzte Commit zeigen. Rückgängig gemachte Commits werden nie gelöscht, sie wirken sich jedoch nicht auf den letzten Commit aus.


Verwenden Sie zum Löschen in der Zweigstelle

git reset --hard HEAD~1

Um in einem entfernten Zweig zu löschen, verwenden Sie

git push origin HEAD --force

Was ich normalerweise mache, wenn ich ein Commit mache und treibe (wenn jemand sein Commit dazu drängt, das Problem zu lösen):

git reset --hard HEAD~1

git push -f origin

Ich hoffe das hilft


Wenn Sie Ihre letzte Festschreibung korrigieren möchten, können Sie die Festschreibung rückgängig machen und die darin enthaltenen Dateien aufheben, indem Sie Folgendes tun:

git reset HEAD~1

Dadurch wird das Repository vor den Befehlen git add, die die Dateien bereitgestellt haben, in den Status zurückgesetzt. Ihre Änderungen werden in Ihrem Arbeitsverzeichnis gespeichert. HEAD ~ 1 bezieht sich auf das Commit unterhalb der aktuellen Spitze des Zweigs.

Wenn Sie N-Commits aufheben möchten, aber die Codeänderungen in Ihrem Arbeitsverzeichnis beibehalten:

git reset HEAD~N

Wenn Sie Ihre letzte Festschreibung loswerden möchten und die Codeänderungen nicht beibehalten möchten, können Sie einen "harten" Reset durchführen.

git reset --hard HEAD~1

Ebenso, wenn Sie die letzten N-Commits verwerfen möchten und die Codeänderungen nicht beibehalten möchten:

git reset --hard HEAD~N

Wenn Sie das Commit noch nicht an einem anderen Ort gepusht haben, können Sie git rebase -i , um das Commit zu entfernen. Finden Sie zunächst heraus, wie weit (etwa) diese Festschreibung zurückliegt. Dann mach:

git rebase -i HEAD~N

Das ~N bedeutet, dass die letzten N Commits zurückgesetzt werden ( N muss eine Zahl sein, z. B. HEAD~10 ). Dann können Sie die Datei bearbeiten, die Git Ihnen zur Verfügung stellt, um das fehlerhafte Commit zu löschen. Beim Speichern dieser Datei schreibt Git dann alle folgenden Commits so, als wäre das von Ihnen gelöschte nicht vorhanden.

Das Git Book enthält einen guten Abschnitt zum Umbasieren mit Bildern und Beispielen.

Seien Sie jedoch vorsichtig, denn wenn Sie etwas ändern, das Sie an anderer Stelle verschoben haben , ist ein anderer Ansatz erforderlich, es sei denn, Sie planen einen Force-Push.


Wenn Sie den Verlauf beibehalten und das Commit und das Revert anzeigen möchten, sollten Sie Folgendes verwenden:

git revert GIT_COMMIT_HASH

Geben Sie die Nachricht ein, aus der hervorgeht, warum Sie zurückkehren, und dann:

git push  

Wenn Sie ein git log ausgeben, sehen Sie sowohl die "falsche" Festschreibung als auch die Protokollnachrichten.


Wenn Sie keine Änderungen veröffentlicht haben, können Sie das letzte Commit entfernen

$ git reset --hard HEAD^

(Beachten Sie, dass dadurch auch alle nicht festgeschriebenen Änderungen entfernt werden.

Wenn Sie bereits zu löschende Commits veröffentlicht haben, verwenden Sie git revert

$ git revert HEAD

git reset --hard

git Push Ursprung HEAD --force

Wenn eine oder mehrere Commits markiert sind, löschen Sie zuerst die Tags. Andernfalls wird das gekennzeichnete Commit nicht entfernt.


git reset --hard : git reset --hard IHRE ÄNDERUNGEN IM ARBEITSVERZEICHNIS . Stellen Sie sicher, dass alle lokalen Änderungen, die Sie behalten möchten, vor dem Ausführen dieses Befehls gespeichert werden .

Angenommen, Sie sitzen auf diesem Commit, dann wird dieser Befehl es verpassen ...

git reset --hard HEAD~1

Der HEAD~1 bedeutet das Commit vor dem Kopf.

Oder Sie können sich die Ausgabe von git log ansehen, die Commit-ID des Commits finden, zu dem Sie eine Sicherungskopie erstellen möchten, und dann Folgendes tun:

git reset --hard <sha1-commit-id>

Wenn Sie es bereits geschoben haben, müssen Sie einen Kraftstoß ausführen, um es loszuwerden ...

git push origin HEAD --force

Wenn andere es jedoch gezogen haben, ist es besser, einen neuen Zweig zu gründen. Denn wenn sie ziehen, wird sie einfach in ihre Arbeit integriert, und Sie werden sie wieder hochschieben lassen.

Wenn Sie bereits gepusht haben, ist es möglicherweise besser, git revert , um ein "Spiegelbild" - Commit zu erstellen, das die Änderungen rückgängig macht. Beide Commits werden jedoch im Protokoll angezeigt.

FYI - git reset --hard HEAD ist großartig, wenn Sie WORK IN PROGRESS loswerden möchten. Sie werden auf den letzten Commit zurückgesetzt und alle Änderungen in Ihrem Arbeitsbaum und Index gelöscht.

Wenn Sie nach einem Commit suchen, das Sie "gelöscht" haben, ist es normalerweise in git reflog vorhanden, es sei denn, Sie haben Ihr Repository mit Garbage gesammelt.


Ändern Sie die Geschichte gewaltsam

Angenommen, Sie möchten nicht nur das letzte Commit löschen, sondern bestimmte Commits der letzten n Commits löschen, gehen Sie wie folgt vor:

git rebase -i HEAD~<number of commits to go back> , also git rebase -i HEAD~5 wenn Sie die letzten fünf Commits sehen möchten.

Ändern Sie dann im Texteditor das Wort " pick und drop neben jedem Commit ab, den Sie entfernen möchten. Speichern Sie und beenden Sie den Editor. Voila!

Additiv Änderungsverlauf

Versuchen Sie git revert <commit hash> . Revert wird ein neues Commit erstellt, das das angegebene Commit rückgängig macht.


Ich füge diese Antwort hinzu, weil ich nicht sehe, warum jeder, der gerade versucht hat, Arbeit zu begehen, diese Arbeit wegen eines Fehlers mit Git löschen möchte!

Wenn Sie Ihre Arbeit behalten und den Commit-Befehl "rückgängig machen" möchten (Sie haben ihn erwischt, bevor Sie die Repo-Aktion ausführen):

git reset --soft HEAD~1

Verwenden Sie das Flag " --hard" nur, wenn Sie Ihre laufenden Arbeiten seit dem letzten Commit zerstören möchten.


git rebase -i HEAD~2

Hier ist '2' die Anzahl der Commits, die Sie zurücksetzen möchten.

'git rebase -i HEAD`

wenn Sie alle Commits zurückweisen möchten.

Dann können Sie eine dieser Optionen auswä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 nachbestellt werden. Sie werden von oben nach unten ausgeführt. Wenn Sie hier eine Zeile entfernen, WIRD DAS COMMIT VERLOREN. Wenn Sie jedoch alles entfernen, wird die Rebase abgebrochen. Beachten Sie, dass leere Commits auskommentiert werden

Sie können dieses Commit einfach mit der Option "d" oder Entfernen einer Zeile mit Ihrem Commit entfernen.





git-reset