Ich benutze Git und habe nur wenige Dateien mit festgeschrieben
git commit -a
Später stellte ich fest, dass dem Commit fälschlicherweise eine Datei hinzugefügt wurde.
Wie kann ich eine Datei aus dem letzten Commit entfernen?
quelle
Ich benutze Git und habe nur wenige Dateien mit festgeschrieben
git commit -a
Später stellte ich fest, dass dem Commit fälschlicherweise eine Datei hinzugefügt wurde.
Wie kann ich eine Datei aus dem letzten Commit entfernen?
Ich denke, andere Antworten hier sind falsch, da es sich um eine Frage handelt, bei der die irrtümlich festgeschriebenen Dateien aus dem vorherigen Festschreiben wieder in den Staging-Bereich verschoben werden, ohne die an ihnen vorgenommenen Änderungen abzubrechen. Dies kann wie von Paritosh Singh vorgeschlagen erfolgen:
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, können Sie sogar dieselbe Festschreibungsnachricht wiederverwenden:
git commit -c ORIG_HEAD
git push
beschweren werden , wenn Sie Ihr früheres (falsches) Commit bereits vorangetrieben haben und jetzt versuchen , Ihr Repo zu reparieren Updates were rejected because the tip of your current branch is behind its remote counterpart.
. Wenn Sie sicher sind, dass Sie sie drücken möchten (z. B. Ihre Gabel), können Sie die -f
Option verwenden, um den Druck zu erzwingen, z git push origin master -f
. (Tun Sie dies nicht mit einem Upstream-Repo, von dem andere
git reset --soft HEAD^
ist meine häufigste Undo-Operation
git reset
, wollte aber einen Weg finden, um das bestehende Commit "an Ort und Stelle" zu beeinflussen. Ich habe gerade davon erfahren git commit -C
. Was ich also will, ist Ihr genaues Rezept mit einem weiteren Schritt, dem "New Commit Again" git commit -C [hash of original HEAD commit from first step]
.
ACHTUNG ! Wenn Sie nur eine Datei aus Ihrem vorherigen Commit entfernen und auf der Festplatte behalten möchten , lesen Sie die Antwort von juzzlin oben.
Wenn dies Ihr letztes 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, aber "zusammenführen" (nicht im Sinne des Zusammenführens zweier Zweige) dieses Festschreiben mit dem letzten Festschreiben.
Wie in den Kommentaren angegeben, entspricht die Verwendung git rm
hier der Verwendung des rm
Befehls selbst!
git rm --cached
, um die Dateien auf der Festplatte zu halten
rm
im git
Befehl ist zu tun , was rm
sich tut!
git commit --amend
weiterhin vorhanden und kann beispielsweise mit gefunden werden git reflog
. Es ist also nicht so schlimm, wie die anderen Kommentare vermuten lassen.
In allen vorhandenen Antworten geht es darum, die unerwünschten Dateien aus dem letzten Commit zu entfernen .
Wenn Sie unerwünschte Dateien aus einem alten Commit entfernen möchten (auch gepusht) und kein neues Commit erstellen möchten, was aufgrund der folgenden Aktion nicht erforderlich ist:
1.
Suchen Sie das Commit, dem die Datei entsprechen 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 Commits, 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 gemäß Ihren Einstellungen. Die Standardeinstellung ist vim.
Verschieben Sie das letzte Commit, das "unerwünschte Dateien entfernen" sein sollte, in die nächste Zeile des falschen Commits (in unserem Fall "35c23c2") und setzen Sie den Befehl wie folgt fixup
:
pick 35c23c2 the first commit
fixup 0d78b28 remove unwanted files
Sie sollten nach dem Speichern der Datei gut sein.
Beenden :
git push -f
Wenn Sie leider Konflikte bekommen, müssen Sie diese manuell lösen.
git rm --cached <file(s)>
.
--fixup=35c23c2
zum git commit
Befehl etwas vereinfacht werden . Dadurch wird das Commit automatisch als Korrektur des erforderlichen Commits eingerichtet, sodass Sie es nicht in der Rebase angeben müssen. Wenn Sie --autosquash
dem git rebase
Befehl hinzufügen , verschiebt git Ihr Commit automatisch an den richtigen Speicherort, sodass Sie in der interaktiven Rebase nichts tun müssen. Speichern Sie einfach das Ergebnis (was bedeutet, dass Sie nicht einmal markieren müssen) -i
. obwohl ich es trotzdem gerne benutze, um sicherzustellen, dass alles so aussieht, wie ich es erwartet habe).
Wie aus der akzeptierten Antwort hervorgeht, können Sie dies tun, indem Sie das gesamte Commit zurücksetzen. Dies ist jedoch ein ziemlich hartnäckiger Ansatz.
Eine sauberere Möglichkeit, dies zu tun, besteht darin, 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 bleibt unberührt.
Das git commit
wird dann festschreiben und den Index in das aktuelle Festschreiben quetschen.
Dies nimmt im Wesentlichen die Version der Datei, die im vorherigen Commit enthalten war, und fügt sie dem aktuellen Commit hinzu. Dies führt zu keiner Nettoveränderung, sodass die Datei effektiv aus dem Commit entfernt wird.
Wenn Sie die Änderungen nicht auf den Server übertragen haben, können Sie sie verwenden
git reset --soft HEAD~1
Alle Änderungen werden zurückgesetzt und auf ein Commit zurückgesetzt
Wenn Sie Ihre Änderungen übernommen haben, befolgen Sie die von @CharlesB beantworteten Schritte
Wenn Sie die Datei mit rm entfernen, wird sie gelöscht!
Sie fügen einem Commit in git immer etwas hinzu, anstatt es zu entfernen. In diesem Fall bringen Sie die Datei in den Zustand zurück, in dem sie sich vor dem ersten Commit befand (dies kann eine Löschaktion 'rm' sein, wenn die Datei neu ist) und dann erneut festschreiben und die Datei wird gehen.
So bringen 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 entfernt, wie es das OP verlangt hat.
git reset HEAD^ /path/to/file
Sie werden so etwas wie das Folgende sehen ...
Zu übernehmende Änderungen: (Verwenden Sie "git reset HEAD ...", um die Bühne zu verlassen.)
geändert: / path / to / file
Änderungen, die nicht für das Festschreiben bereitgestellt wurden: (Verwenden Sie "git add ...", um zu aktualisieren, was festgeschrieben wird.) (Verwenden Sie "git checkout - ...", um Änderungen im Arbeitsverzeichnis zu verwerfen.)
geändert: / path / to / file
Zu diesem Zeitpunkt können Sie die Datei beliebig bearbeiten, z. B. auf eine andere Version zurücksetzen.
Wenn Sie bereit sind, sich zu verpflichten:
git commit --amend -a
oder (wenn Sie einige andere Änderungen vorgenommen haben, die Sie noch nicht festlegen möchten)
git commit add /path/to/file
git commit --amend
Ich werde es Ihnen anhand eines Beispiels erklären.
Sei A, B, C 3 aufeinanderfolgende 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>
noop
zu edit [A_commit_ID]
odere [A_commit_ID]
Sie können es einfach versuchen.
git reset --soft HEAD~1
und erstellen Sie ein neues Commit.
Es gibt jedoch eine tolle Software "gitkraken". das macht es einfach mit git zu arbeiten.
git commit --amend
in Ihrem letzten Commit aktualisieren. und danach können Sie überprüfen, ob es tatsächlich mitgit log -1 --stat
git rm --cached <file_to_remove_from_commit_<commit_id>_which_added_file>
git commit -m "removed unwanted file from git"
Sie erhalten die lokale Datei noch. Wenn Sie die Datei auch nicht lokal haben möchten, können Sie die Option --cached überspringen.
Wenn sich alle Arbeiten in Ihrem lokalen Zweig befinden, müssen Sie die Datei in einem späteren Commit aufbewahren. Wenn Sie einen sauberen Verlauf haben möchten, könnte dies meiner Meinung nach einfacher 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>^
Anschließend können Sie die Rebase problemlos beenden, ohne sich an komplexere Befehle erinnern oder Nachrichten festschreiben oder so viel eingeben zu müssen.
Die Verwendung der Git-GUI kann das Entfernen einer Datei aus dem vorherigen Commit vereinfachen.
Angenommen, dies ist kein gemeinsam genutzter Zweig, und es macht Ihnen nichts aus, den Verlauf neu zu schreiben , dann führen Sie Folgendes aus:
git gui citool --amend
Sie können die versehentlich festgeschriebene Datei deaktivieren und dann auf "Festschreiben" klicken.
Die Datei wird aus dem Commit entfernt, aber auf der Festplatte gespeichert . Wenn Sie die Datei nach dem versehentlichen Hinzufügen deaktiviert haben, wird sie in Ihrer Liste der nicht verfolgten Dateien angezeigt (und wenn Sie die Datei nach dem versehentlichen Ändern deaktiviert haben, wird sie in Ihren Änderungen angezeigt, die nicht für die Festschreibungsliste bereitgestellt wurden).
sudo apt-get install git-gui
git rebase -i HEAD~4
Ihren Befehl verwendet und dann ausgeführt, um den Editor zu öffnen. Ein weiterer Hinweis: "Unstaging" finden Sie im Menü "Commit".
git reset --soft HEAD^
(unter Hinweis auf das Argument --soft), gefolgt von git commit -c ORIG_HEAD
(anstelle von --amend, das alles vermasselt).
Wenn Sie Ihr Commit beibehalten möchten (möglicherweise haben Sie bereits einige Zeit damit verbracht, eine detaillierte Commit-Nachricht zu schreiben, und diese nicht verlieren möchten) und die Datei nur aus dem Commit entfernen möchten, nicht jedoch vollständig aus dem Repository:
git checkout origin/<remote-branch> <filename>
git commit --amend
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'
Ich wollte nur die Top-Antwort ergänzen, da ich einen zusätzlichen Befehl ausführen musste:
git reset --soft HEAD^
git checkout origin/master <filepath>
Prost!
Etwas, das für mich funktioniert hat, aber immer noch 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
git reset --soft HEAD^
Wickelt Ihr Commit zurück und wenn Sie tippen git status
, erfahren Sie, was zu tun ist:
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
Ich denke, eine schnellere und einfachere Möglichkeit ist die Verwendung des interaktiven Git Rebase-Modus.
git rebase -i head~1
(oder Kopf ~ 4, wie weit du gehen willst)
und dann anstelle von "Auswählen" "Bearbeiten" verwenden. Mir war nicht klar, wie mächtig "Bearbeiten" ist.
https://www.youtube.com/watch?v=2dQosJaLN18
Ich hoffe, Sie finden es hilfreich.
Hatte das gleiche Problem, bei dem ich Änderungen in einem lokalen Zweig hatte, in dem ich nur eine Datei zurücksetzen wollte. Was für mich funktioniert hat war -
(In feature / target_branch unten habe ich alle meine Änderungen, einschließlich derjenigen, die ich für eine bestimmte Datei rückgängig machen wollte.)
( origin / feature / target_branch ist der Remote-Zweig, in den ich meine Änderungen übertragen möchte.)
( Feature / Staging ist mein temporärer Staging-Zweig, in dem ich alle gewünschten Änderungen mit Ausnahme der Änderung an dieser einen Datei vornehmen werde.)
Erstellen Sie einen lokalen Zweig aus meinem Ursprung / Feature / Ziel_Zweig - genannt Feature / Staging
Mein funktionierendes lokales Zweig- Feature / target_branch wurde mit dem Feature / Staging- Zweig zusammengeführt
Ausgechecktes Feature / Staging, dann git reset --soft ORIG_HEAD (Jetzt werden alle Änderungen am Feature / Staging 'inszeniert, aber 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_branch geändert
Der Rest der bereitgestellten Änderungen wurde festgeschrieben und an meinen Remote- Ursprung / feature / target_branch weitergeleitet
Wenn Sie diese Datei nicht mehr benötigen, können Sie dies tun
git rm file
git commit --amend
git push origin branch
Wenn Sie GitHub verwenden und das Commit noch nicht gepusht haben, löst GitHub Desktop dieses Problem auf einfache Weise:
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:
Es kann keine neue Sicherung erstellt werden. Eine vorherige Sicherung ist bereits in refs / original / Force vorhanden und überschreibt die Sicherung mit -f
Entfernen Sie einfach Refs-Backups auf Ihrem lokalen Repo
$ rm -rf .git/refs/original/refs
wenn du deine änderungen noch nicht auf git drückst
git reset --soft HEAD~1
Alle Änderungen werden zurückgesetzt und auf ein Commit zurückgesetzt
Wenn dies das letzte Commit ist, das Sie vorgenommen haben, und Sie die Datei aus dem lokalen und Remote-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, das ich anfangs in den Zweig verschoben habe.
git checkout origin/develop <path-to-file>
git add <path-to-file>
git commit -m "Message"
git push
Ich habe die aktuellen Dateien in einen anderen Ordner kopiert und dann alle nicht gepushten Änderungen entfernt, indem ich:
git reset --hard @{u}
Dann kopiere die Dinge zurück. Festschreiben, drücken.
Sie können einfach diesen Befehl verwenden:
git restore --staged <file>
Here is the step to remove files from Git Commit.
>git reset --soft HEAD^1(either commitid ) -- now files moved to the staging area.
>git rm --cached filename(it will removed the file from staging area)
>git commit -m 'meaningfull message'(Now commit the required files)
Keine der Antworten ist derzeit vernünftig. Klingt so, als ob genug Nachfrage besteht, dass eine echte Lösung vorgeschlagen werden sollte: https://github.com/git/git/blob/master/Documentation/SubmissionPatches
git --uncommit <Dateiname>
wäre nett. Ich verstehe, dass wir den Verlauf nicht ändern möchten, aber wenn ich lokal bin und versehentlich eine lokale "Hack" -Datei hinzugefügt habe und diese aus dem Commit entfernen möchte, wäre dies sehr hilfreich.
git reset filepath