Все о проверке файлов или каталогов в git
1. Как извлечь один или несколько файлов или каталогов из другой ветки или зафиксировать хэш в текущей извлеченной ветке:
# check out all files in <paths> from branch <branch_name>
git checkout <branch_name> -- <paths>
Источник: http://nicolasgallagher.com/git-checkout-specific-files-from-another-branch/.
См. Также man git checkout.
Примеры:
# Check out "somefile.c" from branch `my_branch`
git checkout my_branch -- somefile.c
# Check out these 4 files from `my_branch`
git checkout my_branch -- file1.h file1.cpp mydir/file2.h mydir/file2.cpp
# Check out ALL files from my_branch which are in
# directory "path/to/dir"
git checkout my_branch -- path/to/dir
Если вы не укажете branch_name, автоматически предполагается, что это HEAD, который является вашей самой последней фиксацией ветки, выбранной в данный момент. Таким образом, вы также можете просто проверить файл somefile.c и перезаписать любые локальные незафиксированные изменения:
# Check out "somefile.c" from `HEAD`, to overwrite any local, uncommitted
# changes
git checkout -- somefile.c
# Or check out a whole folder from `HEAD`:
git checkout -- some_directory
2. Дальше: как извлечь любой файл из любой ветки или зафиксировать хэш в любое место на вашем компьютере (ОЧЕНЬ ПОЛЕЗНО!):
# General form
git show my_branch_or_commit_hash:my_file.cpp > any/path/my_file.cpp
# Example: check out `main.cpp` from 3 commits ago in your currently-checked-out
# branch (3 commits prior to `HEAD`, or `HEAD~3`) into a temporary directory
mkdir ../temp
git show HEAD~3:main.cpp > ../temp/main_old.cpp
Источник, из которого я это узнал: ответ @Jakub Narębski на: git-checkout старая версия файла под новым именем
3. Что делать, если вы находитесь в процессе внесения изменений git merge, git cherry-pick, git rebase или git revert?
Что ж, в таком случае вам лучше сделать так:
# Keep `--theirs` for all conflicts within this file
git checkout --theirs -- path/to/some/file
# OR: keep `--ours` for all conflicts within this file
git checkout --ours -- path/to/some/file
OR:
# Keep `--theirs` for all conflicts within files inside this dir
git checkout --theirs -- path/to/some/dir
# OR: keep `--ours` for all conflicts within files inside this dir
git checkout --ours -- path/to/some/dir
НЕ заполняйте обычную checkout форму в предыдущем разделе перед этим, если только вы этого не хотите. См. раздел ПРЕДУПРЕЖДЕНИЕ ПРЕДУПРЕЖДЕНИЕ ПРЕДУПРЕЖДЕНИЕ в моем ответе здесь: Кто такие мы и кто они согласно Git ?.
РАБОТА С path does not have our version или path does not have their version ОШИБКАМИ:
Если вы когда-нибудь увидите такие ошибки:
error: path 'path/to/some/dir/file1.cpp' does not have our version
# OR
error: path 'path/to/some/dir/file1.cpp' does not have their version
... при выполнении приведенных выше команд вам просто нужно сначала git rm эти файлы, а затем снова попробовать команду git checkout --ours или git checkout --theirs. См. Мой ответ здесь для подробного объяснения этих команд, включая форму для автоматического поиска и удаления этих файлов с ошибками: git checkout - часы, когда спецификация файла включает удаленный файл.
4. Что делать, если вы хотите сбросить определенный файл или каталог, чтобы он точно соответствовал состоянию этого файла или каталога в другой фиксации или ветке?
В этом случае git checkout my_branch -- some_file_or_dir НЕ достаточно, потому что если у вас есть файлы в указанном каталоге, которые существуют в вашей текущей ветке или фиксации, но НЕ существуют в my_branch, тогда вы хотите, чтобы они были удалены локально, но git checkout НЕ удаляет какие-либо файлы, которые существуют локально, но не в указанной фиксации, а только перезаписывает файлы локально их версиями из указанной фиксации. Итак, чтобы также удалить файлы локально, которых там не должно быть, чтобы то, что у вас получилось локально, было точной копией того, что у вас есть на my_branch, вы должен сделать следующее:
git reset my_branch -- path/to/some/file_or_dir
git checkout-index -fa
git clean -fd
git commit -m "hard reset path/to/some/file_or_dir to its state \
as it was at my_branch"
Подробнее см. Мой собственный ответ здесь: Почему git не может выполнять аппаратный / программный сброс по пути?.
Смотрите также:
- Я показываю еще несколько примеров
git checkout в своем ответе здесь: Кто такие мы и кто они согласно Git?.
- [мой ответ на Как выполнить сброс --soft или --hard git по пути] Почему git не может выполнять аппаратный / программный сброс по пути?
- git-checkout более старая версия файл под новым именем
- [мой ответ] git checkout - часы, когда спецификация файла включает удаленный файл
- [мой ответ] Как с помощью git сбросить рабочее дерево (состояние локальной файловой системы) до состояния индекса (поэтапные файлы)?
person
Gabriel Staples
schedule
11.12.2020
masterможет отличаться отexperiment, например. может содержать изменения, слитые из других веток, которые будут потеряны при копировании файла. P.S. с другой стороны, он не хочет объединяться, но, насколько я знаю, терминgit mergeпредназначен только для ветки, а не для конкретного файла, поэтому здесь нет противоречия. - person Alexei Martianov   schedule 11.04.2019