Чи можна витягнути лише один файл у 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


23
Хеш-коди, необхідні комутатору -m, можуть бути надруковані гіткою git -v. Дивовижно!
Audrius Meskauskas

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ś

@Chris нам потрібен {віддалений}, якщо ми вже у відділенні? Якщо так, то чому?
Хмара Чо

2
Не те саме, що тягне, що спробує злиття, саме тому ми хочемо використовувати тяг.
ДжозефК


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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.