git checkout HEAD ~ 2 (пример) удаляет неотслеживаемые файлы, если они были добавлены с последним коммитом - PullRequest
1 голос
/ 13 сентября 2010

Я добавляю новые файлы (которые были представлены ранее как неотслеживаемые) и фиксирую их. Когда я проверяю до этого коммита, эти файлы удаляются. Они не должны.

Не имеет значения, перечисляет ли .gitignore эти файлы или нет (для этого нужно выполнить git add -f ...).

Ответы [ 4 ]

3 голосов
/ 13 сентября 2010

Они не должны быть [удалены].

Да, они должны.Коммиты являются историческими государствами.Вы проверяете состояние до того, как они были совершены, поэтому они не должны быть там.Представьте, что вы работаете над своим проектом через год.Половина файлов была переименована, есть десятки новых файлов, и по какой-либо причине вы решили проверить сегодняшнюю версию.Конечно, вы не хотели бы, чтобы все эти десятки файлов просто сидели и загромождали!Они не принадлежат там!(И, конечно, «неотслеживаемые файлы ... добавленные с последним коммитом» не имеют никакого смысла - если вы зафиксировали их, они теперь отслеживаются.)

Если файлы действительно должны Вы были в старом коммите, вероятно, что вы хотите сделать, это использовать интерактивный ребаз (git rebase -i <start commit> <branch>, дальнейшие инструкции предоставлены git), чтобы раздавить пару коммитов вместе.Возможно, вам придется изменить порядок коммитов, отодвинув коммит «добавить эти файлы» назад в историю, к которой он принадлежит.Или, если вы заметили это сразу после того, как забыли добавить файлы, просто добавьте их и используйте commit --amend для изменения предыдущего коммита вместо создания отдельного.

Наконец, если вы действительно получите этоустановить в истории таким образом (другие вытащили, так что вы не хотите перебазировать / изменить), вы можете проверить старый коммит, а затем извлечь файлы из нового коммита:

git checkout <old-commit>
git checkout <new-commit> file1 file2 dir1 dir2/file3 ...
2 голосов
/ 13 сентября 2010

Просто оформите HEAD снова, и вы получите эти файлы обратно.Git checkout HEAD ~ 2 возвращает каталог вашего хранилища обратно в статус отслеженный , который вы имели два коммита назад.Это вполне ожидаемое поведение.

0 голосов
/ 13 сентября 2010

Возможно, вы захотите git commit --amend добавить материал к предыдущему коммиту, который вы забыли.

0 голосов
/ 13 сентября 2010

Возможное решение, когда последний коммит содержит только дополнения к файлам:

$ git diff HEAD^ >diff
$ git checkout HEAD^
$ git apply diff

В это время ветка отсоединяется и содержит ранее не отслеживаемые файлы.Отныне возможны и согласованы дальнейшие извлечения в истории коммитов.

...