Как получить только один файл из другого ветки
Я использую 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>
Надеюсь, это поможет вам.
Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.