Удалить файл из списка, который будет зафиксирован - PullRequest
44 голосов
/ 25 августа 2010

У меня есть список измененных файлов в репозитории git.Есть один файл, который я не хочу записывать на данный момент.Могу ли я сделать:

git commit -a

Чтобы зафиксировать все файлы и затем каким-то образом удалить этот файл из текущего коммита?После такого удаления он все равно должен быть в списке незафиксированных файлов.

Ответы [ 9 ]

58 голосов
/ 25 августа 2010

Вы хотите сделать это:

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

Обязательно и делайте это с верхнего уровня репо; add -u добавляет изменения в текущий каталог (рекурсивно).

Ключевая строка указывает git сбросить версию заданного пути в индексе (промежуточная область для фиксации) в версию из HEAD (текущая извлеченная фиксация).

И заблаговременное предупреждение о проблеме для других, читающих это: add -u выполняет все модификации, но не добавляет неотслеживаемых файлов. Это то же самое, что делает commit -a. Если вы также хотите добавить неотслеживаемые файлы, используйте add ., чтобы рекурсивно добавить все .

37 голосов
/ 26 ноября 2012

git rm --cached удалит его из набора фиксации («не добавляя» его);это звучит как то, что вы хотите.

13 голосов
/ 19 ноября 2013

, если вы уже нажали свой коммит, тогда делать

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

AND Если вы не отправили изменения на сервер, вы можете использовать

git reset --soft HEAD~1
5 голосов
/ 12 июня 2013

использовать тайник;как это:

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

Если вы случайно зафиксировали файл и хотите переписать свою историю git, используйте:

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

и сквош к двум ведущимсовершает.Вы можете написать вспомогательный скрипт для выполнения любого из них, если у вас есть известный набор файлов, которые вы предпочитаете не фиксировать автоматически.

1 голос
/ 25 августа 2010

Возможно, вы также можете использовать stash для временного хранения ваших изменений в файле патча, а затем повторно применить его (после проверки, чтобы вернуться к старой версии).Это может быть связано с другой темой: Как мне извлечь один файл (или изменения в файл) из git stash? .

0 голосов
/ 15 февраля 2019

если вы сделали добавление git и еще ничего не добавили, вам просто нужно сделать это, чтобы удалить его из вашего коммита.

git reset HEAD <file>

0 голосов
/ 28 января 2019

Большинство этих ответов связаны с удалением файла из предварительной фиксации «области подготовки», но я часто нахожу здесь поиск после того, как уже зафиксировал, и хочу удалить некоторую конфиденциальную информацию из только что сделанного коммита.

Легко запоминающийся трюк для всех вас git commit --amend, как и я, вы можете:

  1. Удалить случайно зафиксированный файл.
  2. git add . для добавления удаления в «промежуточную область»
  3. git commit --amend для удаления файла из предыдущего коммита.

В сообщении о коммите вы заметите, что нежелательный файлсейчас отсутствует.Ура!(Фиксация SHA будет изменена, поэтому будьте осторожны, если вы уже перенесли свои изменения на пульт.)

0 голосов
/ 07 февраля 2018

Вы должны сбросить этот файл в исходное состояние и зафиксировать его снова, используя --amend.Это проще всего сделать с помощью git checkout HEAD^.

Подготовка демонстрации:

$ 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"

Состояние до:

$ 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(-)

Вот оно: восстановить предыдущую версию

$ git checkout HEAD^ file-b

совершить это:

$ 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(-)

Состояние после:

$ 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 голосов
/ 07 февраля 2018

Ответ:

git reset HEAD path/to/file
...