Как получить только один файл из другого ветки

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

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

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

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

Ответ 1

git checkout master               # first get back to master
git checkout experiment -- app.js # then copy the version of app.js 
                                  # from branch "experiment"

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


Обновление августа 2019 г., Git 2.23: с новыми командами git switch и git restore, которые будут выглядеть так:

git switch master
git restore -s experiment -- app.js

По умолчанию восстанавливается только рабочее дерево.
Если вы также хотите обновить индекс (то есть восстановить содержимое файла и добавить его в индекс одной командой):

git restore -s experiment --staged --worktree -- app.js
# shorter:
git restore -s experiment -WS -- app.js

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

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

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

Frosty упоминает в комментарии:

вы получите только самое последнее состояние 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:

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

и так далее.

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

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

git checkout stash -- app.js

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

Ответ 2

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

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

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

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

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

Ответ 3

Дополнительно к ответам 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

Ответ 4

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

Или, если вы хотите, чтобы все файлы из другой ветки:

git checkout <branch name> -- .

Ответ 6

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

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

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

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

Ответ 7

Если вы хотите файл из определенного коммита (любой ветки), скажем 06f8251f

git checkout 06f8251f path_to_file

например, в windows:

git checkout 06f8251f C:\A\B\C\D\file.h

Ответ 8

git checkout master               -go to the master branch first
git checkout <your-branch> -- <your-file> --copy your file data from your branch.

git show <your-branch>:path/to/<your-file> 

Надеюсь, это поможет вам. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.