Можно ли вытащить только один файл в Git?

177

Я работаю над веткой Git, в которой есть несколько неработающих тестов, и я хотел бы вытащить (объединить изменения, а не просто перезаписать) эти тесты из другой ветки, в которой они уже исправлены.

Я знаю, что могу сделать

git pull origin that_other_branch

но это попытается объединить множество других файлов, для этого я еще не готов.

Можно ли вытащить и объединить только указанный файл (и не все) из этой другой ветки?

Это не дубликат Git pull-запроса только для одного файла, так как все ответы на этот вопрос - как вернуть локально измененный файл в версию репозитория, не меняя ветвей.

Аудрюс Мескаускас
источник
7
Я полагаю, что ни одна из записей на этой странице не дает ответа на вопрос. Вопрос подразумевает получение только одного файла с удаленного сервера, не получение всех файлов и локальную проверку только одного. Таким образом, вопрос должен быть переделан или выбранный ответ не отмечен как решение вопроса.
mljrg

Ответы:

153

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

git fetch
git checkout -m <revision> <yourfilepath>
git add <yourfilepath>
git commit

Относительно git checkoutкоманды: <revision> - имя ветки, т.е. origin/master <yourfilepath>не включает имя хранилища (которое вы можете получить, нажав copy pathкнопку на странице файла на GitHub), т.е.README.md

aleroot
источник
23
Хеш-коды, требуемые ключом -m, могут быть напечатаны с помощью git branch -v. Потрясающие!
Аудрюс Мескаускас
2
Превосходно. Это помогло мне не раз. Для пояснения, флаг -m, кажется, доволен хэшем коммита, из которого вы хотите извлечь свой единственный файл.
rd108
1
Это сработало и для меня. Тем не менее, я запустил git log в моей удаленной ветке, чтобы найти реверсию: например, $ git log remotes / origin / master
Dan
6
Можно ли вытащить определенный файл, не вытягивая другие файлы?
чувствую себя хорошо и программирую
3
@aleroot что означает <revision>?
Вакан Танка
240

Вот немного более простой метод, который я только придумал, исследуя это:

git fetch {remote}
git checkout FETCH_HEAD -- {file}
Крис
источник
4
роковая: недействительная ссылка: FETCH_HEAD
Антоний Д'Андреа
4
Этот ответ, возможно, не хватает рабочего примера. Неясно, нужно ли совершать следующее.
Dr_Zaszuś
@ Крис, нам нужен {удаленный}, если мы уже в филиале? Если да, то почему?
Облако Чо
2
Это не то же самое, что pull, который попытается выполнить слияние, поэтому мы хотим использовать pull.
JosephK
22
git checkout master -- myplugin.js

мастер = название филиала

myplugin.js = имя файла

Mawardy
источник
и есть ли способ вернуться обратно?
Liyuan
1
не забывайте «дерьмо тянуть» раньше;)
Мэтсон Кепсон
16

Ответ @ Mawardy работал для меня, но мои изменения были на пульте, поэтому мне пришлось указать происхождение

git checkout origin/master -- {filename}
Люк Флурной
источник
2

Да, вот процесс:

# Navigate to a directory and initiate a local repository
git init        

# Add remote repository to be tracked for changes:   
git remote add origin https://github.com/username/repository_name.git

# Track all changes made on above remote repository
# This will show files on remote repository not available on local repository
git fetch

# Add file present in staging area for checkout
git check origin/master -m /path/to/file
# NOTE: /path/to/file is a relative path from repository_name
git add /path/to/file

# Verify track of file(s) being committed to local repository
git status

# Commit to local repository
git commit -m "commit message"

# You may perform a final check of the staging area again with git status

источник