Entfernen Sie Dateien aus Git Commit

Ich benutze git und habe einige Dateien mit gemacht

 git commit -a 

Später entdeckte ich, dass die Datei versehentlich zum Commit hinzugefügt wurde.

Wie lösche ich eine Datei aus dem letzten Commit?

849
18 сент. Mojoy ist am 18. September eingestellt. 2012-09-18 19:59 '12 um 19:59 Uhr 2012-09-18 19:59
@ 19 Antworten

Ich denke, dass die anderen Antworten hier falsch sind, weil es darum geht, die fehlerhaft fixierten Dateien von der vorherigen Fixierung zurück in den Zwischenbereich zu verschieben, ohne die durch sie vorgenommenen Änderungen rückgängig zu machen. Dies kann wie von Paritosh Singh vorgeschlagen erfolgen:

 git reset --soft HEAD^ 

oder

 git reset --soft HEAD~1 

Setzen Sie dann Junk-Dateien zurück, um sie nicht zu übergeben:

 git reset HEAD path/to/unwanted_file 

Versuchen Sie es erneut, Sie können dieselbe Commit-Nachricht erneut verwenden:

 git commit -c ORIG_HEAD 
1673
10 марта '13 в 13:56 2013-03-10 13:56 Die Antwort ist Juzzlin 10. März 13 um 13:56 2013-03-10 13:56 gegeben

Achtung ! Wenn Sie eine Datei aus Ihrem vorherigen Commit löschen und auf der Festplatte speichern möchten , lesen Sie die Juzzlin-Antwort etwas höher.

Wenn dies Ihr letzter Commit ist und Sie die Datei vollständig aus Ihrem lokalen und Remote-Repository entfernen möchten, können Sie:

  • lösche die Datei git rm <file>
  • git commit --amend mit Änderungskennzeichen: git commit --amend
border=0

Das Fix-Flag weist git an, es erneut zu reparieren, aber "zusammenzuführen" (nicht im Sinne des Zusammenführens zweier Zweige), das Problem mit dem letzten Fix zu beheben.

Und um es wie du zu sagen, der Befehl rm in git macht, was rm selbst tut!

168
18 сент. Antwort von CharlesB 18 Sep. 2012-09-18 20:22 '12 um 20:22 Uhr 2012-09-18 20:22

Bestehende Antworten schlagen vor, unerwünschte Dateien vom letzten zu entfernen.

Wenn Sie nicht benötigte Dateien aus dem alten Commit löschen möchten (auch wenn gedrückt) und keinen neuen Commit erstellen möchten, was aufgrund der Aktion optional ist:

1

Suchen Sie nach dem Commit, zu dem die Datei passen soll.

 git checkout <commit_id> <path_to_file> 

Sie können dies mehrmals tun, wenn Sie viele Dateien löschen möchten.

2

 git commit -am "remove unwanted files" 

3

Suchen Sie hier das commit_id-Commit, mit dem die Dateien fälschlicherweise hinzugefügt wurden, beispielsweise "35c23c2"

 git rebase 35c23c2~1 -i // notice: "~1" is necessary 

Dieser Befehl öffnet den Editor entsprechend Ihren Einstellungen. Der Standardwert ist vim.

Verschieben Sie das letzte Commit (dies sollte "nicht benötigte Dateien löschen") in die nächste Zeile des falschen Commits ("35c23c2" in unserem Fall) und setzen Sie den Befehl als fixup :

 pick 35c23c2 the first commit fixup 0d78b28 remove unwanted files 

Nach dem Speichern der Datei sollte es Ihnen gut gehen.

Zu beenden:

 git push -f 

Wenn Sie leider Konflikte bekommen, müssen Sie diese manuell lösen.

75
27 янв. Beantwortet von Brian 27. Januar 2015-01-27 18:24 '15 am 18:24 2015-01-27 18:24

Das Löschen einer Datei mit rm löscht sie!

Sie fügen immer ein Commit für git hinzu, anstatt es zu löschen. Bringen Sie in diesem Fall die Datei in den Zustand zurück, in dem sie sich vor dem ersten Commit befand (dies kann die Delete-Aktion "rm" sein, wenn die Datei neu ist) .

So setzen Sie eine Datei in den vorherigen Zustand zurück:

  git checkout <commit_id> <path_to_file> 

oder bringen Sie es in den Zustand auf dem Remote HEAD zurück:

  git checkout origin/master <path_to_file> 

Ändern Sie dann das Commit und Sie sollten feststellen, dass die Datei aus der Liste verschwunden ist (und nicht von Ihrer Festplatte gelöscht wird!).

30
28 янв. Bob Flannigon hat am 28. Januar eine Antwort gepostet 2013-01-28 17:00 '13 um 17:00 Uhr 2013-01-28 17:00 Uhr

Wenn Sie auf dem Server nicht auf Änderungen geklickt haben, können Sie verwenden

 git reset --soft HEAD~1 

Alle Änderungen werden zurückgesetzt und es wird wieder ein Commit ausgeführt.

Wenn Sie auf Ihre Änderungen geklickt haben, führen Sie die in @CharlesB angegebenen Schritte aus

28
18 сент. Die Antwort wird von Paritosh Singh 18 Sep gegeben . 2012-09-18 21:28 '12 um 21:28 2012-09-18 21:28
 git checkout HEAD~ path/to/file git commit --amend 
27
23 авг. Antwort von Denis Shchepetov am 23. August 2013-08-23 22:01 '13 um 22:01 Uhr 2013-08-23 22:01

Wie die akzeptierte Antwort zeigt, können Sie dies tun, indem Sie das gesamte Commit löschen. Dies ist jedoch ein ziemlich schwieriger Ansatz.
Ein sauberer Weg, dies zu tun, besteht darin, das Commit zu speichern und die geänderten Dateien einfach zu entfernen.

 git reset HEAD^ -- path/to/file git commit --amend --no-edit 

git reset nimmt die Datei auf die gleiche Weise wie beim vorherigen Commit und generiert sie im Index. Die Datei im Arbeitsverzeichnis wird nicht berührt.
Dann fixiert git commit fixes und quetscht den Index in das aktuelle Commit.

Es akzeptiert im Wesentlichen die Version der Datei, die sich im vorherigen Commit befand, und fügt sie dem aktuellen Commit hinzu. Dadurch wird das Netzwerk nicht geändert, sodass die Datei effektiv aus dem Commit entfernt wird.

25
25 февр. Antwort von Patrick am 25. Februar 2017-02-25 03:06 '17 am 3:06 2017-02-25 03:06

Im Folgenden wird nur die von Ihnen beabsichtigte Datei deaktiviert. Dies ist für das OP erforderlich.

 git reset HEAD^ /path/to/file 

Sie werden etwas wie das Folgende sehen ...

Änderungen, die Sie vornehmen müssen: (Zum Deinstallieren verwenden Sie "git reset HEAD ...")

geändert: / Pfad / zu / Datei

Beim Commit werden keine Änderungen vorgenommen: (Aktualisieren Sie mit "git add ...", was gemacht wird.) (Verwenden Sie "git checkout -...", um Änderungen im Arbeitsverzeichnis zu verwerfen.)

geändert: / Pfad / zu / Datei

  • "Änderungen, die Sie vornehmen müssen" ist eine frühere Version der Datei, bevor Sie sie festlegen. Wenn die Datei nie existiert, sieht es aus wie ein Löschen. Wenn Sie diese Änderung vornehmen, wird eine Revision angezeigt, die die Änderung an die Datei in Ihrem Zweig zurückgibt.
  • "Änderungen werden nicht für Commit übermittelt" sind die von Ihnen vorgenommene Änderung und der aktuelle Status der Datei

An dieser Stelle können Sie tun, was Sie in der Datei wollen, z. B. auf eine andere Version zurücksetzen.

Wenn Sie bereit sind zu begehen:

 git commit --amend -a 

oder (wenn Sie andere Änderungen haben, die Sie nicht vornehmen möchten)

 git commit add /path/to/file git commit --amend 
24
07 дек. Die Antwort ist gegeben ThatsAMorais 07 Dez. 2014-12-07 10:13 '14 am 10:13 2014-12-07 10:13

Wenn Sie das Festschreiben speichern möchten (möglicherweise haben Sie bereits einige Zeit mit dem Erstellen einer ausführlichen Nachricht über das Festschreiben verbracht und möchten es nicht verlieren), und Sie möchten die Datei nur aus dem Festschreiben, nicht jedoch vollständig aus dem Repository löschen

 git checkout origin/<remote-branch> <filename> git commit --amend 
8
17 июня '13 в 23:07 2013-06-17 23:07 Die Antwort wird gegeben mattexx 17. Juni 13 um 23:07 2013-06-17 23:07
 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "removed unwanted file from git" 

hinterlässt eine lokale Datei. Wenn Sie auch nicht möchten, dass die Datei lokal ist, können Sie die Option --cached überspringen.

Wenn sich die gesamte Arbeit in Ihrem lokalen Zweig befindet, müssen Sie die Datei in einem späteren Commit speichern, und ich denke, um einen sauberen Verlauf zu haben, denke ich, dass dies ein einfacherer Weg sein könnte:

 git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file> git commit --squash <commit_id> git add <file_to_remove_from_commit_<commit_id>_which_added_file> git commit -m "brand new file!" git rebase --interactive <commit_id>^ 

Sie können den Neustart ganz einfach abschließen, ohne sich komplexere Befehle merken zu müssen, eine Meldung zu korrigieren oder dieselbe Nummer einzugeben.

6
23 февр. Die Antwort wird am 23. Februar von Bryan Buckley gegeben . 2016-02-23 09:22 '16 um 09:22 Uhr 2016-02-23 09:22

Die Verwendung der git-GUI kann das Löschen einer Datei aus einem vorherigen Commit erleichtern.

Angenommen, dies ist kein gemeinsam genutzter Zweig, und Sie haben nichts dagegen , die Geschichte neu zu schreiben , und führen dann Folgendes aus:

 git gui citool --amend 

Sie können die Datei, die versehentlich behoben wurde, abbrechen und dann auf "Übernehmen" klicken.

2019

6
18 мая '15 в 22:50 2015-05-18 22:50 Die Antwort wird von JDiMatteo am 18. Mai 15 um 22:50 Uhr 2015-05-18 22:50 gegeben

Führen Sie eine Sequenz der folgenden Befehle aus:

 //to remove the last commit, but preserve changes git reset --soft HEAD~1 //to remove unneded file from the staging area git reset HEAD `<your file>` //finally make a new commit git commit -m 'Your message' 
5
10 сент. Die Antwort wird von Sergey Onishchenko 10 Sep gegeben . 2015-09-10 14:51 '15 am 14:51 2015-09-10 14:51

Ich werde Ihnen ein Beispiel erklären: Sei A, B, C 3 aufeinanderfolgende Fixierungen. Commit B enthält eine Datei, die nicht festgeschrieben werden sollte.

  • $ git log # take A commmit_id
  • $ git rebase -i "A_ID"
  • Ändern Sie in vim rebase das Festschreiben in 'e'
  • $ git rm unerwünschte_Datei
  • $ git rebase weiter
  • $ git Push-Kraft
3
17 авг. Antwort von Moaz Rashad 17 Aug. 2017-08-17 12:52 '17 am 12:52 2017-08-17 12:52

Ich wollte nur die oberste Antwort hinzufügen, da ich einen zusätzlichen Befehl ausführen musste:

 git reset --soft HEAD^ git checkout origin/master <filepath> 

Hurra!

3
25 мая '16 в 18:24 2016-05-25 18:24 Die Antwort wird von andrepo am 25. Mai '16 um 18:24 2016-05-25 18:24 gegeben

Etwas, das für mich funktioniert hat, aber ich denke immer noch, dass es eine bessere Lösung geben sollte:

 $ git revert <commit_id> $ git reset HEAD~1 --hard 

Belassen Sie die Änderung, die Sie abbrechen möchten, in einem anderen Commit, und überprüfen Sie die anderen.

 $ git commit --amend // or stash and rebase to <commit_id> to amend changes 
2
14 авг. Antwort von Saiyancoder 14 aug. 2014-08-14 08:34 14 um 08:34 Uhr 2014-08-14 08:34 Uhr

Ich denke, der schnellere und einfachere Weg ist der interaktive Git-Modus.

 git rebase -i head~1 

(oder Kopf ~ 4, wie weit du willst)

und dann 'edit' anstelle von 'pick' verwenden. Ich habe nicht verstanden, wie leistungsfähig die Bearbeitung ist.

https://www.youtube.com/watch?v=2dQosJaLN18

Ich hoffe, dass es Ihnen gefällt.

1
19 мая '16 в 23:58 2016-05-19 23:58 Die Antwort gibt Matt 19. Mai '16 um 23:58 2016-05-19 23:58

Hatte das gleiche Problem, wenn ich Änderungen im lokalen Zweig habe, wo ich nur eine Datei zurückgeben wollte. Was für mich funktioniert hat

( feature / target_branch ) wo ich alle meine Änderungen habe, einschließlich derer , die ich für eine bestimmte Datei rückgängig machen wollte)

( origin / feature / target_branch ) ist der entfernte Zweig, an dem ich Änderungen vornehmen möchte.)

(Die Funktion / Phase ist mein temporärer Zwischenzweig, in dem ich auf alle gewünschten Änderungen aufbauen werde, mit Ausnahme der Änderung dieser Datei.)

  • Erstellen Sie einen lokalen Zweig aus meiner origin / feature / target_branch - es wird eine Funktion / Anweisung genannt

  • Zusammenführen meines lokalen lokalen feature / target_branch- Zweigs mit einem Zweig

  • Die Funktion / Anweisung wird geprüft, dann wird git reset --soft ORIG_HEAD (jetzt werden alle Änderungen von der Funktion / Stufe "organisiert, aber nicht festgelegt).

  • Deinstallierte Datei, die ich zuvor mit unnötigen Änderungen überprüft habe

  • Upstream-Zweig für Funktion / Ursprung / Feature / Target_branch geändert

  • Redid die verbleibenden Phasenänderungen und klickte auf Upstream zu meiner Remote-Quelle / Funktion / Ziel_Branch

1
23 янв. die antwort wird von user1201303 23 jan gegeben. 2017-01-23 07:13 '17 am 7:13 2017-01-23 07:13

Wenn Sie den Commit noch nicht gedrückt haben, löst GitHub Desktop dieses Problem auf einfache Weise:

  • Wählen Sie Repository → Letzte Übernahme rückgängig machen.
  • Deaktivieren Sie die irrtümlich hinzugefügte Datei. Ihre vorherige Bestätigungsnachricht befindet sich bereits im Dialogfeld.
  • Drücken Sie die Hold-Taste!
1
14 марта '17 в 22:41 2017-03-14 22:41 Die Antwort gibt Ron am 14. März 17 um 22:41 Uhr 2017-03-14 22:41

Wenn Sie diese Datei nicht mehr benötigen, können Sie das machen

 git rm file git commit --amend git push origin branch 
0
29 сент. die antwort wird mit 29 sep . gegeben . 2017-09-29 00:49 '17 am 0:49 2017-09-29 00:49

Weitere Fragen zu Tags oder Frage stellen