wake-up-neo.net

Entfernen Sie eine Datei aus der Liste, die festgeschrieben werden soll

Ich habe eine Liste der geänderten Dateien in git Repository. Es gibt eine Datei, die ich für den aktuellen Moment nicht festlegen möchte. Kann ich tun:

git commit -a

Alle Dateien festschreiben und diese Datei dann irgendwie aus dem aktuellen Festschreiben entfernen? Nach dem Entfernen sollte es immer noch in der Liste der nicht festgeschriebenen Dateien stehen.

41
Max Frai

Sie möchten das tun:

git add -u
git reset HEAD path/to/file
git commit

Seien Sie sicher und tun Sie dies von der obersten Ebene des Repos. add -u fügt Änderungen im aktuellen Verzeichnis hinzu (rekursiv).

Die Schlüsselzeile weist git an, die Version des angegebenen Pfads im Index (den Bereitstellungsbereich für das Festschreiben) auf die Version von HEAD (das derzeit ausgecheckte Festschreiben) zurückzusetzen.

Und eine Vorwarnung vor einem gotcha für andere, die dies lesen: add -u führt alle Änderungen durch, fügt jedoch nicht aufgespürte Dateien hinzu. Dies ist dasselbe wie commit -a. Wenn Sie auch nicht protokollierte Dateien hinzufügen möchten, verwenden Sie add ., um alles rekursiv hinzuzufügen.

58
Cascabel

git rm --cached wird es aus dem Festschreibungssatz entfernen ("nicht hinzufügen"); das klingt wie du willst.

38
DavidR

wenn Sie Ihr Commit schon gepusht haben. tun

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

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

git reset --soft HEAD~1
12
Ashish Sajwan

Verwende Versteck; so was:

git add .
git reset Files/I/Want/To/Keep
git stash --keep-index
git commit -a -m "Done!"
git stash pop

Wenn Sie aus Versehen eine Datei festschreiben und Ihren Git-Verlauf neu schreiben möchten, verwenden Sie:

git reset HEAD~1 path/to/file
git commit -a -m "rollback"
git rebase -i HEAD~2

und Squash zu den beiden führenden Commits. Sie können ein Hilfsskript schreiben, um eines dieser beiden Programme auszuführen, wenn Sie über bekannte Dateien verfügen, die Sie nicht automatisch festschreiben möchten.

5
Doug

Möglicherweise können Sie Stash auch verwenden, um Ihre Änderungen temporär in einer Patch-Datei zu speichern und anschließend erneut anzuwenden (nach einem Checkout, um zur alten Version zurückzukehren). Dies könnte sich auf dieses andere Thema beziehen: Wie extrahiere ich eine einzelne Datei (oder Änderungen an einer Datei) aus einem Git-Stash? .

1
ThR37

Antworten:

git reset HEAD path/to/file
0

wenn Sie ein Git-Add hinzugefügt haben und noch nichts verschoben haben, müssen Sie dies nur tun, um es von Ihrem Commit abzuheben.

git reset HEAD <file> 

0
David

Sie müssen diese Datei in den ursprünglichen Zustand zurücksetzen und sie mit --amend erneut festschreiben. Dies geschieht am einfachsten mit git checkout HEAD^.

Demo vorbereiten:

$ git init
$ date >file-a
$ date >file-b
$ git add .
$ git commit -m "Initial commit"
$ date >file-a
$ date >file-b
$ git commit -a -m "the change which should only be file-a"

Zustand vor:

$ git show --stat
commit 4aa38f84e04d40a1cb40a5207ccd1a3cb3a4a317 (HEAD -> master)
Date:   Wed Feb 7 17:24:45 2018 +0100

    the change which should only be file-a

 file-a | 2 +-
 file-b | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

Hier kommt es: Stellen Sie die vorherige Version wieder her

$ git checkout HEAD^ file-b

begehen Sie es:

$ git commit --amend file-b
[master 9ef8b8b] the change which should only be file-a
 Date: Wed Feb 7 17:24:45 2018 +0100
 1 file changed, 1 insertion(+), 1 deletion(-)

Zustand nach:

$ git show --stat
commit 9ef8b8bab224c4d117f515fc9537255941b75885 (HEAD -> master)
Date:   Wed Feb 7 17:24:45 2018 +0100

    the change which should only be file-a

 file-a | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
0
Daniel Alder

Die meisten dieser Antworten zirkulieren um das Entfernen einer Datei aus dem "Staging-Bereich" vor dem Festschreiben, aber ich schaue oft hierher, nachdem ich bereits zugesagt habe, und möchte einige sensible Informationen aus dem soeben festgelegten Festschreiben entfernen.

Ein einfacher Trick für euch alle, git commit --amend Leute wie ich, ist, dass man:

  1. Löschen Sie die versehentlich festgeschriebene Datei.
  2. git add ., um die Löschung zum "Bereitstellungsbereich" hinzuzufügen
  3. git commit --amend, um die Datei aus dem vorherigen Commit zu entfernen.

In der Festschreibungsnachricht werden Sie feststellen, dass die unerwünschte Datei jetzt fehlt. Hurra! (Commit SHA hat sich geändert. Seien Sie also vorsichtig, wenn Sie Ihre Änderungen bereits an die Fernbedienung gesendet haben.)

0
Breedly