Git: Entfernen Sie die festgeschriebene Datei nach dem Push

99

Gibt es eine Möglichkeit, eine festgeschriebene Datei in Git zurückzusetzen? Ich habe ein Commit an GitHub gesendet und dann festgestellt, dass es eine Datei gibt, die ich nicht verschieben wollte (ich habe die Änderungen noch nicht abgeschlossen).

kmaci
quelle
Möchten Sie die Datei nach einem Push vollständig aus GitHub entfernen? Ansonsten nur: git rm <Datei>, git push.
rdrmntn

Antworten:

141

Update: Sicherere Methode hinzugefügt

bevorzugte Methode:

  1. Überprüfen Sie den vorherigen (unveränderten) Status Ihrer Datei. Beachten Sie den doppelten Strich

    git checkout HEAD^ -- /path/to/file
    
  2. begehen Sie es:

    git commit -am "revert changes on this file, not finished with it yet"
    
  3. Schieben Sie es, keine Kraft erforderlich:

    git push
    
  4. Kehren Sie zu Ihrer unvollendeten Arbeit zurück und wiederholen Sie den Vorgang (dreimal Pfeil nach oben):

    git checkout HEAD^ -- /path/to/file
    

effektiv "unverbindlich":

Um das letzte Commit des Repository-HEAD zu ändern, verschleiern Sie Ihre versehentlich gedrängte Arbeit, während Sie möglicherweise in einen Konflikt mit Ihrem Kollegen geraten, der es möglicherweise bereits gezogen hat und der graues Haar wachsen lässt und viel Zeit verliert, wenn er versucht, seinen lokalen Zweigstellenleiter zu versöhnen mit dem zentralen:

So entfernen Sie Dateiänderungen aus dem letzten Commit:

  1. Gehen Sie wie folgt vor, um die Datei auf den Status vor dem letzten Festschreiben zurückzusetzen:

    git checkout HEAD^ /path/to/file
    
  2. Gehen Sie wie folgt vor, um das letzte Commit mit der zurückgesetzten Datei zu aktualisieren:

    git commit --amend
    
  3. Um das aktualisierte Commit auf das Repo zu übertragen, gehen Sie wie folgt vor:

    git push -f
    

Erwägen Sie wirklich die Verwendung der zuvor erwähnten bevorzugten Methode.

xor
quelle
1
Wenn Sie nicht der einzige Entwickler in einem Projekt sind, sollten Sie git push -f wirklich nicht verwenden. Es schafft weit mehr Probleme als es wert ist. Entfernen Sie einfach die Datei und führen Sie ein neues Commit durch.
Richard
1
@ user553086 konnte nicht mehr zustimmen. Besser jetzt?
xor
Ist dies mit Commits weiter zurück in der Geschichte machbar? Könnte ich das mit machen git checkout HEAD~2 /path/to/file? Bearbeiten: Sieht so aus, als ob ich in meinem Fall einfach wolltegit rm /path/to/file
starscream_disco_party
1
Du hast mir gerade 4 Stunden gespart, Bruder!
Tosin Onikute
50

Wenn Sie die Datei aus dem Remote-Repo entfernen möchten, entfernen Sie sie zuerst mit der Option --cache aus Ihrem Projekt und drücken Sie sie dann:

git rm --cache /path/to/file
git commit -am "Remove file"
git push

(Dies funktioniert auch, wenn die Datei vor einigen Commits zum Remote-Repo hinzugefügt wurde.) Denken Sie daran, die Dateierweiterungen, die Sie nicht pushen möchten, zu .gitignore hinzuzufügen.

micoru
quelle
2
Dadurch werden die Dateien aus dieser Festschreibungsweiterleitung entfernt, die Dateien sind jedoch in den älteren Festschreibungen weiterhin sichtbar.
Ken
26

Sie können nur eine Datei auf eine bestimmte Revision zurücksetzen.

Zuerst können Sie überprüfen, bei welchen Commits die Datei geändert wurde.

git log path/to/file.txt

Anschließend können Sie die Datei mit der Versionsnummer auschecken.

git checkout 3cdc61015724f9965575ba954c8cd4232c8b42e4 /path/to/file.txt

Danach können Sie es festschreiben und erneut pushen.

René Höhle
quelle
6

Setzen Sie die Datei in den richtigen Zustand zurück, schreiben Sie sie fest und drücken Sie erneut.

Wenn Sie sicher sind, dass noch niemand Ihre Änderungen abgerufen hat, können Sie --amendbeim Festschreiben das vorherige Festschreiben ändern (dh den Verlauf neu schreiben) und dann drücken. Ich denke, Sie müssen die -fOption beim Drücken verwenden, um den Druck zu erzwingen.

JB Nizet
quelle
3
  1. Holen Sie sich den Hash-Code des letzten Commits.

    • git log
  2. Setzen Sie das Commit zurück
    • git revert <hash_code_from_git_log>
  3. Schieben Sie die Änderungen
    • git push

Check-out in der GHR. Sie könnten bekommen, was immer Sie brauchen, hoffen, dass dies nützlich ist

krish babu
quelle