Удалить файл из фиксации
У меня есть список измененных файлов в репозитории git. Существует один файл, который я не хочу совершать на текущий момент. Могу я сделать:
git commit -a
Чтобы зафиксировать все файлы, а затем каким-то образом удалить этот файл из текущей фиксации? После такого удаления он все равно должен находиться в списке файлов с ограниченными правами.
Ответы
Ответ 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
, таких как я, это то, что вы можете:
- Удалить случайно зафиксированный файл.
-
git add.
добавить удаление в "область подготовки" -
git commit --amend
чтобы удалить файл из предыдущего коммита.
В сообщении о коммите вы заметите, что ненужный файл теперь отсутствует. Ура! (Фиксация SHA
будет изменена, поэтому будьте осторожны, если вы уже перенесли свои изменения на пульт.)