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?
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
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:
git rm <file>
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!
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.
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.
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
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!).
git checkout HEAD~ path/to/file
git commit --amend
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
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
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>
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
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.
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).
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.
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'
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!
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)
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
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.
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)}
Erstellen Sie einen lokalen Zweig aus meinem Origin/feature/target_branch - genannt Feature/Staging
Mein lokaler Zweig feature/target_branch wurde mit dem Zweig feature/staging zusammengeführt
Feature/Staging ausgecheckt, dann git reset --soft ORIG_HEAD _ (Jetzt werden alle Änderungen am Feature/Staging 'bereitgestellt, jedoch nicht festgeschrieben.)
Unstaged die Datei, die ich zuvor mit unnötigen Änderungen eingecheckt habe
Der Upstream-Zweig für feature/staging wurde in Origin/feature/target_branchgeändert. _
Die restlichen Änderungen wurden festgeschrieben und auf meine entfernte Origin/feature/target_branch übertragen.
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.
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
Wenn Sie GitHub verwenden und den Commit noch nicht gepusht haben, löst GitHub Desktop dieses Problem leicht:
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.
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
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
Wenn Sie diese Datei nicht mehr benötigen, können Sie dies tun
git rm file
git commit --amend
git Push Origin branch