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

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

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

git pull origin that_other_branch

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

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

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


person Audrius Meskauskas    schedule 26.04.2013    source источник


Ответы (5)


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

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

Относительно команды git checkout:

  • <revision> -- название ветки, т.е. origin/master
  • <yourfilepath> не включает имя репозитория (которое можно получить, нажав кнопку copy path на странице файла на GitHub), т. е. README.md
person aleroot    schedule 26.04.2013
comment
Хэш-коды, требуемые ключом -m, можно вывести с помощью git branch -v . Потрясающий! - person Audrius Meskauskas; 30.04.2013
comment
Превосходно. Это помогало мне не раз. Чтобы уточнить, флаг -m, кажется, доволен хешем коммита, из которого вы хотите извлечь свой единственный файл. - person rd108; 15.11.2013
comment
Это сработало и для меня. Тем не менее, я запустил git log в своей удаленной ветке, чтобы найти реверсию: например. $ git log удаленный/происхождение/мастер - person Dan; 23.12.2013
comment
вы можете получить последний удаленный хэш от .git/refs/remotes/origin/master. - person Marcello Nuccio; 24.07.2014
comment
Git автоматически добавляет извлекаемый файл в индекс (в версии, которую я использую: 1.9.4.msysgit.1). Итак, третий шаг не нужен, но и не вредит. - person Dennis van der Schagt; 13.01.2015
comment
Можно ли вытащить конкретный файл, не вытягивая другие файлы? - person Nagappa L M; 13.05.2015
comment
@aleroot, что означает «ревизия»? - person Wakan Tanka; 01.12.2016
comment
Это просто перезаписывает файл, а не объединяет. Может раньше работало, а сейчас не работает - person wrangler; 04.12.2018
comment
@wrangler решение работает, как и ожидалось, и решает проблему ОП, поскольку он принял ответ ... Если у вас есть другие требования, кроме ОП, то было бы лучше задать конкретный вопрос, а не отрицать и плохо комментировать принятый ответ ... - person aleroot; 04.12.2018

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

git fetch {remote}
git checkout FETCH_HEAD -- {file}
person Chris    schedule 22.08.2014
comment
фатально: неверная ссылка: FETCH_HEAD - person Antony D'Andrea; 24.08.2017
comment
В этом ответе, возможно, отсутствует рабочий пример. Неясно, нужно ли совершать следующие действия. - person Dr_Zaszuś; 16.08.2018
comment
@Chris, нам нужен {remote}, если мы уже в Branch? Если да, то почему? - person Cloud Cho; 26.09.2019
comment
Не то же самое, что вытягивание, которое попытается выполнить слияние, поэтому мы хотим использовать вытягивание. - person JosephK; 29.01.2020

git checkout master -- myplugin.js

мастер = имя ветки

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

person Mawardy    schedule 26.06.2018
comment
и есть ли способ вернуться назад? - person liyuan; 25.03.2019
comment
не забудьте «git pull» перед этим;) - person matson kepson; 24.05.2019

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

git checkout origin/master -- {filename}
person Luke Flournoy    schedule 03.02.2019

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

# 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
person Community    schedule 08.07.2019
comment
Я пропустил строку git checkout, потому что она скрыта между комментариями. Кроме того, здесь написано git check, а не git checkout. - person trash80; 19.05.2021