Как получить только один файл из другой ветки - PullRequest
1064 голосов
/ 02 марта 2010

Я использую git и работаю над веткой master. В этой ветке есть файл с именем app.js.

У меня есть ветка experiment, в которой я сделал кучу изменений и множество коммитов. Теперь я хочу перенести все изменения, сделанные только в app.js из experiment в master ветку.

Как мне это сделать?

Еще раз, я не хочу слияния. Я просто хочу перенести все изменения в app.js из ветви experiment в master ветви.

Ответы [ 6 ]

1348 голосов
/ 02 марта 2010
git checkout master               # first get back to master
git checkout experiment -- app.js # then copy the version of app.js 
                                  # from branch "experiment"

См. Также git, как отменить изменения одного файла?

Как Якуб Наребски упоминает в комментариях:

git show experiment:path/to/app.js > path/to/app.js

тоже работает, за исключением того, что, как подробно описано в вопросе SO " Как получить один файл из определенной ревизии в Git? ", вам нужно использовать полный путь из корневого каталога репозитория .
Отсюда путь / к / app.js, который использовал Якуб в своем примере.

Как Морозный упоминает в комментарии:

вы получите только самое последнее состояние app.js

Но для git checkout или git show вы можете ссылаться на любую ревизию, которую хотите, как показано в вопросе SO " git checkout revision файла в git gui ":

$ git show $REVISION:$FILENAME
$ git checkout $REVISION -- $FILENAME

будет таким же, если $ FILENAME является полным путем версионного файла.

$REVISION может быть таким, как показано в git rev-parse:

experiment@{yesterday}:app.js # app.js as it was yesterday 
experiment^:app.js            # app.js on the first commit parent
experiment@{2}:app.js         # app.js two commits ago

и т. Д.

schmijos добавляет в комментариях :

Вы также можете сделать это из тайника:

git checkout stash -- app.js

Это очень полезно, если вы работаете над двумя ветками и не хотите коммитить.

300 голосов
/ 05 апреля 2012

Все намного проще, используйте для этого git checkout.

Предположим, что you're on master ветвь, чтобы получить app.js from new-feature ветвь do:

git checkout new-feature path/to/app.js

// note that there is no leading slash in the path!

Это принесет вам содержимое нужного файла. Вы можете, как всегда, использовать часть sha1 вместо new-feature имя ветви , чтобы получить файл таким, каким он был конкретный коммит.

30 голосов
/ 08 декабря 2015

В дополнение к ответам VonC и chhh.

git show experiment:path/to/relative/app.js > app.js
# If your current working directory is relative than just use
git show experiment:app.js > app.js

или

git checkout experiment -- app.js
17 голосов
/ 11 мая 2018
git checkout branch_name file_name

Пример:

git checkout master App.java

Это не будет работать, если в имени вашего филиала есть точка.

git checkout "fix.june" alive.html
error: pathspec 'fix.june' did not match any file(s) known to git.
5 голосов
/ 02 февраля 2017

Или, если вам нужны все файлы из другой ветки:

git checkout <branch name> -- .
4 голосов
/ 07 апреля 2019

Просмотрите файл на github и вытащите его оттуда

Это прагматичный подход, который напрямую не отвечает ОП, но некоторые нашли его полезным:

Если соответствующая ветка находится на GitHub, вы можете перейти к нужной ветке и файлу с помощью любого из множества инструментов, которые предлагает GitHub, затем нажать «Raw», чтобы просмотреть простой текст, и (необязательно) скопировать и вставить текст по желанию.

Мне нравится этот подход, потому что он позволяет вам полностью просмотреть удаленный файл, прежде чем перетаскивать его на локальный компьютер.

...