Подтвердить что ты не робот

Удалить файл из фиксации

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

git commit -a

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

git rm --cached удалит его из набора фиксации ( "un-add" it); это похоже на то, что вы хотите.

Ответ 3

если вы уже нажали свою фиксацию. сделать

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

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

git reset --soft HEAD~1

Ответ 4

Используйте stash; например:

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

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

Ответ 5

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

Ответ 6

Ответ:

git reset HEAD path/to/file

Ответ 7

Вы должны сбросить этот файл в исходное состояние и зафиксировать его снова, используя --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(-)

Ответ 8

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

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

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

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