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?
git
git-commit
Lolly
quelle
quelle
git reset filepath
Antworten:
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:
oder
Setzen Sie dann die unerwünschten Dateien zurück, um sie vom Commit auszuschließen:
Jetzt erneut festschreiben, können Sie sogar dieselbe Festschreibungsnachricht wiederverwenden:
quelle
git push
beschweren werden , wenn Sie Ihr früheres (falsches) Commit bereits vorangetrieben haben und jetzt versuchen , Ihr Repo zu reparierenUpdates 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, zgit push origin master -f
. (Tun Sie dies nicht mit einem Upstream-Repo, von dem anderegit reset --soft HEAD^
ist meine häufigste Undo-Operationgit reset
, wollte aber einen Weg finden, um das bestehende Commit "an Ort und Stelle" zu beeinflussen. Ich habe gerade davon erfahrengit 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 desrm
Befehls selbst!quelle
git rm --cached
, um die Dateien auf der Festplatte zu haltenrm
imgit
Befehl ist zu tun , wasrm
sich tut!git commit --amend
weiterhin vorhanden und kann beispielsweise mit gefunden werdengit 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.
Sie können dies mehrmals tun, wenn Sie viele Dateien entfernen möchten.
2.
3.
Suchen Sie die commit_id des Commits, zu dem die Dateien versehentlich hinzugefügt wurden. Sagen wir hier "35c23c2"
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
:Sie sollten nach dem Speichern der Datei gut sein.
Beenden :
Wenn Sie leider Konflikte bekommen, müssen Sie diese manuell lösen.
quelle
git rm --cached <file(s)>
.--fixup=35c23c2
zumgit 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
demgit 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.
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.
quelle
Wenn Sie die Änderungen nicht auf den Server übertragen haben, können Sie sie verwenden
Alle Änderungen werden zurückgesetzt und auf ein Commit zurückgesetzt
Wenn Sie Ihre Änderungen übernommen haben, befolgen Sie die von @CharlesB beantworteten Schritte
quelle
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:
oder um es in den Zustand am entfernten HEAD zurückzusetzen:
Ä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!).
quelle
quelle
Im Folgenden wird nur die von Ihnen beabsichtigte Datei entfernt, wie es das OP verlangt hat.
Sie werden so etwas wie das Folgende sehen ...
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:
oder (wenn Sie einige andere Änderungen vorgenommen haben, die Sie noch nicht festlegen möchten)
quelle
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.
quelle
noop
zuedit [A_commit_ID]
odere [A_commit_ID]
Sie können es einfach versuchen.
und erstellen Sie ein neues Commit.
Es gibt jedoch eine tolle Software "gitkraken". das macht es einfach mit git zu arbeiten.
quelle
git commit --amend
in Ihrem letzten Commit aktualisieren. und danach können Sie überprüfen, ob es tatsächlich mitgit log -1 --stat
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:
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.
quelle
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:
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).
quelle
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 vongit 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:
quelle
Führen Sie eine Sequenz der folgenden Befehle aus:
quelle
Ich wollte nur die Top-Antwort ergänzen, da ich einen zusätzlichen Befehl ausführen musste:
Prost!
quelle
Etwas, das für mich funktioniert hat, aber immer noch der Meinung ist, dass es eine bessere Lösung geben sollte:
Lassen Sie einfach die Änderung, die Sie verwerfen möchten, im anderen Commit und überprüfen Sie andere
quelle
git reset --soft HEAD^
Wickelt Ihr Commit zurück und wenn Sie tippengit status
, erfahren Sie, was zu tun ist:quelle
Ich denke, eine schnellere und einfachere Möglichkeit ist die Verwendung des interaktiven Git Rebase-Modus.
(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.
quelle
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
quelle
Wenn Sie diese Datei nicht mehr benötigen, können Sie dies tun
quelle
Wenn Sie GitHub verwenden und das Commit noch nicht gepusht haben, löst GitHub Desktop dieses Problem auf einfache Weise:
quelle
Wenn Sie Dateien aus früheren Commits entfernen möchten, verwenden Sie Filter
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
quelle
wenn du deine änderungen noch nicht auf git drückst
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:
oder noch besser:
zuerst zurücksetzen
Setzen Sie die unerwünschte Datei zurück
erneut festschreiben
quelle
Dies funktioniert für mich, um die Datei aus dem Bit-Bucket-Repo zu entfernen, das ich anfangs in den Zweig verschoben habe.
quelle
Ich habe die aktuellen Dateien in einen anderen Ordner kopiert und dann alle nicht gepushten Änderungen entfernt, indem ich:
Dann kopiere die Dinge zurück. Festschreiben, drücken.
quelle
Sie können einfach diesen Befehl verwenden:
quelle
quelle
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
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.
quelle