it-swarm.com.de

Entfernen Sie Dateien aus Git Commit

Ich verwende Git und habe einige Dateien mit festgeschrieben 

git commit -a

Später stellte ich fest, dass fälschlicherweise eine Datei zum Commit hinzugefügt wurde.

Wie kann ich eine Datei aus dem letzten Commit entfernen?

1249
Mojoy

Ich denke, dass andere Antworten hier falsch sind, denn dies ist eine Frage des Verschiebens der versehentlich zugesagten Dateien aus dem vorherigen Commit in den Bereitstellungsbereich, ohne die an ihnen vorgenommenen Änderungen abzubrechen. Dies kann wie von Paritosh Singh vorgeschlagen geschehen:

git reset --soft HEAD^ 

oder

git reset --soft HEAD~1

Setzen Sie dann die unerwünschten Dateien zurück, um sie vom Commit auszuschließen:

git reset HEAD path/to/unwanted_file

Jetzt erneut festschreiben, Sie können dieselbe Festschreibungsnachricht sogar erneut verwenden:

git commit -c ORIG_HEAD  
2425
juzzlin

AUFMERKSAMKEIT! Wenn Sie nur eine Datei aus Ihrem vorherigen Commit entfernen möchten und sie auf der Festplatte behalten möchten , lesen Sie Juzzlins Antwort genau oben.

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

  1. entferne die Datei git rm <file>
  2. festschreiben mit Änderungsflag: git commit --amend

Das Änderungsflag weist git an, erneut festzuschreiben, dieses Festschreiben jedoch mit dem letzten Festschreiben "zusammenzuführen" (nicht im Sinne des Zusammenführens von zwei Zweigen).

Wie in den Kommentaren angegeben, entspricht die Verwendung von git rm der Verwendung des Befehls rm selbst!

288
CharlesB

In allen vorhandenen Antworten geht es darum, unerwünschte Dateien aus dem Verzeichnislastcommit zu entfernen.

Wenn Sie unerwünschte Dateien aus einemoldcommit (sogar Push) entfernen möchten und kein neues Commit erstellen möchten, was aufgrund der Aktion nicht erforderlich ist:

1.

Suchen Sie das Commit, mit dem die Datei übereinstimmen soll.

git checkout <commit_id> <path_to_file>

sie können dies mehrmals tun, wenn Sie viele Dateien entfernen möchten.

2.

git commit -am "remove unwanted files"

3.

Suchen Sie die commit_id des commit, zu dem die Dateien versehentlich hinzugefügt wurden , sagen wir hier "35c23c2"

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

Dieser Befehl öffnet den Editor entsprechend Ihren Einstellungen. Die Standardeinstellung ist vim.

Verschieben Sie das letzte Commit ("unerwünschte Dateien entfernen") in die nächste Zeile des falschen Commits (in unserem Fall "35c23c2"), und legen Sie den Befehl als fixup fest:

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

Sie sollten gut sein, nachdem Sie die Datei gespeichert haben.

Beenden : 

git Push -f

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

125
Brian

Wie die akzeptierte Antwort anzeigt, können Sie dies tun, indem Sie das gesamte Commit zurücksetzen. Dies ist jedoch eine ziemlich harte Haltung.
Ein sauberer Weg, dies zu tun, wäre, das Commit beizubehalten und die geänderten Dateien einfach daraus zu entfernen.

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

Der git reset nimmt die Datei wie im vorherigen Commit und stellt sie im Index bereit. Die Datei im Arbeitsverzeichnis ist nicht betroffen.
Der git commit schreibt dann den Index ein und zerquetscht ihn in das aktuelle Commit.

Dies nimmt im Wesentlichen die Version der Datei, die sich im vorherigen Commit befand, und fügt sie dem aktuellen Commit hinzu. Dies führt zu keiner Nettoveränderung, sodass die Datei effektiv aus dem Festschreiben entfernt wird.

90
Patrick

Wenn Sie die Änderungen nicht auf den Server übertragen haben, können Sie sie verwenden

git reset --soft HEAD~1

Es werden alle Änderungen zurückgesetzt und es wird wieder ein Commit ausgeführt

Wenn Sie Ihre Änderungen gepusht haben, folgen Sie den von @CharlesB beantworteten Schritten

35
Paritosh Singh

Das Entfernen der Datei mit rm löscht sie!

Sie fügen immer ein Commit in git hinzu, anstatt sie zu entfernen. Bringen Sie in diesem Fall die Datei in den Zustand zurück, in dem sie sich vor dem ersten Commit befand (dies kann eine Löschen-Aktion "rm" sein, wenn die Datei neu ist) und dann erneutes Commit und die Datei wird gehen.

So stellen Sie die Datei in einen früheren Zustand zurück:

    git checkout <commit_id> <path_to_file>

oder um es in den Zustand am entfernten HEAD zurückzusetzen:

    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 wurde!).

35
Bob Flannigon
git checkout HEAD~ path/to/file
git commit --amend
33

Im Folgenden wird nur die von Ihnen beabsichtigte Datei inszeniert, wie es vom OP gefordert wurde.

git reset HEAD^ /path/to/file

Sie werden etwas wie das Folgende sehen ...

Änderungen, die festgeschrieben werden sollen: (Verwenden Sie "git reset HEAD ..."), um die Bühne zu entfernen.

geändert:/Pfad/zu/Datei

Änderungen werden nicht für das Commit bereitgestellt: (Verwenden Sie "git add ...", um zu aktualisieren Was wird festgeschrieben) (verwenden Sie "git checkout - ...", um Änderungen im Arbeitsverzeichnis zu verwerfen.

geändert:/Pfad/zu/Datei

  • "Zu bezeichnende Änderungen" ist die vorherige Version der Datei vor dem Festschreiben. Dies wird wie eine Löschung aussehen, wenn die Datei nie existiert hat. Wenn Sie diese Änderung festschreiben, wird es eine Revision geben, die die Änderung in der Datei in Ihrem Zweig zurücksetzt.
  • "Nicht festgeschriebene Änderungen" ist die von Ihnen festgeschriebene Änderung und der aktuelle Status der Datei

An dieser Stelle können Sie die Datei nach Belieben ausführen, z. B. auf eine andere Version zurücksetzen. 

Wenn Sie bereit sind zu begehen:

git commit --amend -a

oder (falls Sie andere Änderungen haben, die Sie noch nicht festlegen möchten)

git commit add /path/to/file
git commit --amend
28
ThatsAMorais

Ich werde es dir mit einem Beispiel erklären.
Sei A, B, C 3 aufeinander folgende Commits. Commit B enthält eine Datei, die nicht festgeschrieben werden sollte.

git log  # take A commit_id
git rebase -i "A_commit_ID" # do an interactive rebase
change commit to 'e' in rebase vim # means commit will be edited
git rm unwanted_file
git rebase --continue
git Push --force-with-lease <branchName>    
11
Moaz Rashad

Wenn Sie Ihr Commit beibehalten möchten (möglicherweise haben Sie bereits einige Zeit mit dem Schreiben einer ausführlichen Commit-Nachricht verbracht und möchten es nicht verlieren), und Sie möchten die Datei nur aus dem Commit entfernen, jedoch nicht aus dem Repository:

git checkout Origin/<remote-branch> <filename>
git commit --amend
9
mattexx

Die Verwendung der git-Benutzeroberfläche vereinfacht das Entfernen einer Datei aus dem vorherigen Commit.

Angenommen, es handelt sich nicht um einen gemeinsam genutzten Zweig, und es macht Ihnen nichts aus, Umschreibungsgeschichte , und führen Sie dann Folgendes aus:

git gui citool --amend

Sie können die versehentlich festgeschriebene Datei deaktivieren und dann auf "Übernehmen" klicken.

enter image description here

Die Datei wird aus dem Festschreiben entfernt, aber wird auf der Festplatte gehalten. Wenn Sie also die Datei nach dem irrtümlichen Hinzufügen deaktiviert haben, wird sie in der Liste der nicht protokollierten Dateien angezeigt (und wenn Sie die Datei nach einem versehentlichen Ändern deaktiviert haben, wird sie in Ihren Änderungen nicht für die Commit-Liste angezeigt).

9
JDiMatteo
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"

wird die lokale Datei noch verlassen. Wenn Sie die Datei auch nicht lokal haben möchten, 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 behalten, und wie ein sauberer Verlauf, denke ich, könnte dies ein einfacherer Weg sein:

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>^

und Sie können die Re-Base dann problemlos beenden, ohne sich an komplexere Befehle erinnern zu müssen oder eine Nachricht zu übergeben oder so viel einzugeben.

8
Bryan Buckley

Führen Sie eine Folge 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

Ich wollte nur die erste Antwort ergänzen, da ich einen zusätzlichen Befehl ausführen musste:

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

Prost!

4
andrepo

git reset --soft HEAD^ macht Ihr Commit zurück und wenn Sie git status eingeben, erfahren Sie, was zu tun ist:

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)
3
cardamom

Etwas, das für mich funktioniert hat, aber trotzdem der Meinung ist, dass es eine bessere Lösung geben sollte:

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

Lassen Sie einfach die Änderung, die Sie verwerfen möchten, im anderen Commit, und überprüfen Sie andere

$ git commit --amend // or stash and rebase to <commit_id> to amend changes
3
saiyancoder

Ich denke, eine schnellere und einfachere Methode ist die Verwendung des git rebase interaktiven Modus.

git rebase -i head~1  

(oder Kopf ~ 4, wie weit du willst)

und dann anstelle von "pick" verwenden Sie "edit" ..__ Ich wusste nicht, wie mächtig "edit" ist.

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

Ich hoffe, Sie finden es hilfreich. 

2
Matt

Hatte dasselbe Problem, bei dem ich Änderungen in einem lokalen Zweig vorgenommen habe, in dem ich nur eine Datei wiederherstellen wollte. Was für mich funktionierte, war -

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

(Origin/feature/target_branch ist der entfernte Zweig, in den ich meine Änderungen verschieben möchte.)

(Feature/Staging ist mein temporärer Staging-Zweig, in den ich alle meine gewünschten Änderungen mit Ausnahme der Änderung dieser einen Datei stecken werde)}

  1. Erstellen Sie einen lokalen Zweig aus meinem Origin/feature/target_branch - genannt Feature/Staging

  2. Mein lokaler Zweig feature/target_branch wurde mit dem Zweig feature/staging zusammengeführt

  3. Feature/Staging ausgecheckt, dann git reset --soft ORIG_HEAD _ ​​(Jetzt werden alle Änderungen am Feature/Staging 'bereitgestellt, jedoch nicht festgeschrieben.)

  4. Unstaged die Datei, die ich zuvor mit unnötigen Änderungen eingecheckt habe

  5. Der Upstream-Zweig für feature/staging wurde in Origin/feature/target_branchgeändert. _

  6. Die restlichen Änderungen wurden festgeschrieben und auf meine entfernte Origin/feature/target_branch übertragen.

2
user1201303

Wenn Sie versehentlich eine Datei zu Ihrem Commit hinzugefügt haben, können Sie so etwas tun

git rm --cached path_to_file

achten Sie darauf, --cached nicht zu verwenden, da sonst Ihre Datei auch aus Ihrem Projekt entfernt wird.

0
HamzaMushtaq

Wenn Sie Dateien aus früheren Commits entfernen möchten, verwenden Sie Filter

git filter-branch --Prune-empty --index-filter 'git rm --ignore-unmatch --cached "file_to_be_removed.dmg"'

Wenn Sie diesen Fehler sehen:

Kann keine neue Sicherung erstellen. Eine vorherige Sicherung ist bereits in refs/original/vorhanden. Erzwinge das Überschreiben der Sicherung mit -f .

Entfernen Sie einfach die Refs-Backups auf Ihrem lokalen Repo

$ rm -rf .git/refs/original/refs
0
wilo087

Wenn Sie GitHub verwenden und den Commit noch nicht gepusht haben, löst GitHub Desktop dieses Problem leicht:

  1. Wählen Sie Repository -> Letzte Commit rückgängig machen
  2. Deaktivieren Sie die falsch hinzugefügte Datei. Ihre vorherige Bestätigungsnachricht wird bereits im Dialogfeld angezeigt.
  3. Drücken Sie die Commit-Taste!
0
Ron

Ich habe die aktuellen Dateien in einen anderen Ordner kopiert und dann alle nicht übertragenen Änderungen entfernt, indem ich:

git reset --hard @{u}

Dann kopiere die Dinge zurück. Commit, Push.

0
Miranda

wenn Sie Ihre Änderungen noch nicht an git übergeben haben

git reset --soft HEAD~1

Alle Änderungen werden zurückgesetzt und ein Commit zurückgesetzt

Wenn dies der letzte Commit ist, den Sie ausgeführt haben und die Datei aus dem lokalen und fernen Repository löschen möchten, versuchen Sie Folgendes:

git rm <file>
 git commit --amend

oder noch besser:

zuerst zurücksetzen

git reset --soft HEAD~1

setzen Sie die unerwünschte Datei zurück

git reset HEAD path/to/unwanted_file

erneut festschreiben

git commit -c ORIG_HEAD  
0
TanvirChowdhury

Dies funktioniert für mich, um die Datei aus dem Bit-Bucket-Repo zu entfernen, aus dem ich die Datei zunächst in den Zweig verschoben habe.

git checkout Origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git Push
0
swathi

Wenn Sie diese Datei nicht mehr benötigen, können Sie dies tun 

git rm file
git commit --amend
git Push Origin branch
0
tven