Я использую git и работаю над веткой master. Эта ветка имеет файл с именем app.js
.
У меня есть experiment
ветка, в которой я сделал кучу изменений и кучу коммитов. Теперь я хочу , чтобы объединить все изменения , сделанные только app.js
из experiment
в master
отрасли.
Как я могу это сделать?
Еще раз не хочу слияния. Я просто хочу перенести все изменения app.js
из experiment
ветки в master
ветку.
git
git-checkout
Ник Вандербильт
источник
источник
master
может отличатьсяexperiment
, например, может содержать изменения, объединенные из других ветвей, которые будут потеряны в файле, просто скопированном. PS С другой стороны, он не хочет сливаться, но, насколько я знаю,git merge
термин относится только к ветке, а не к конкретному файлу, поэтому здесь нет противоречий.Ответы:
Смотрите также git, как отменить изменения одного файла?
Обновление августа 2019 года, Git 2.23
С новыми командами
git switch
иgit restore
командами это будет:По умолчанию восстанавливается только рабочее дерево.
Если вы также хотите обновить индекс (то есть восстановить содержимое файла и добавить его в индекс одной командой):
Как отмечает в комментариях Якуб Наребски :
тоже работает, за исключением того, что, как подробно описано в вопросе SO « Как извлечь отдельный файл из определенной ревизии в Git? », вам нужно использовать полный путь из корневого каталога репозитория.
Отсюда путь / к / app.js, который использовал Якуб в своем примере.
Как Морозный упоминает в комментарии:
Но для
git checkout
илиgit show
вы можете ссылаться на любую ревизию, которую хотите, как показано в вопросе SO « git checkout revision of the file in git gui »:будет то же самое, если $ FILENAME - это полный путь к версионному файлу.
$REVISION
может быть как показано вgit rev-parse
:и так далее.
Schmijos добавляет в комментариях :
источник
experiment:./app.js
. (Вам не нужно указывать полный путь.) Я узнал об этом благодаря очень полезному сообщению об ошибке, которое git дал мне: «Вы имели в виду« mybranch: full / path / to / my / file.xsl aka »mybranch: ./file.xsl?» Да, я сделал! Я не думаю, что когда-либо был в восторге от фатальной ошибки.git restore -s new-feature path/to/app.js
Все намного проще, используйте для этого git checkout.
Предположим,
you're on master
ветвь, чтобы получитьapp.js from new-feature
ветку:Это принесет вам содержимое нужного файла. Вы можете, как всегда, использовать часть sha1 вместо имени новой ветки, чтобы получить файл, который был в этом конкретном коммите.
Примечание :
new-feature
должен быть локальный филиал, а не удаленный.источник
git checkout origin/source_branch path/to/file
потому что, если вы не обновили исходную ветку вашего локального репозитория, вы можете получить старую версию файла ... Спросите меня, откуда я знаю. ;)Пример:
Это не будет работать, если в названии вашей ветки есть точка.
источник
Дополнительно к ответам VonC и chhh.
или
источник
--
) между именем ветви и путями необязательной? Только для того, чтобы пути, начинающиеся с тире, не рассматривались как опции / переключатели?--
Необязательно, но более полезно избегать конфликтов с именами веток. Например,git checkout -- foo
означает «извлечь файл foo из HEAD» (т. Е. Перезаписать локальные изменения в foo , т. Е. Подмножествоgit reset --hard
), ноgit checkout foo
может означать это или «давайте перейдем к ветви foo ».Или, если вы хотите, чтобы все файлы из другой ветки:
источник
.
имеет огромное значение: вместо того, чтобы перемещаться в другую ветку, он копирует все файлы оттуда, оставляя вас в текущей. Вы получаете содержимое из другой ветки, не заходя в нее.Просмотрите файл на github и вытащите его оттуда
Это прагматичный подход, который не отвечает непосредственно на ФП, но некоторые нашли его полезным:
Если соответствующая ветка находится на GitHub, то вы можете перейти к нужной ветке и файлу с помощью любого из множества инструментов, которые предлагает GitHub, затем нажать «Raw», чтобы просмотреть простой текст, и (необязательно) скопировать и вставить текст как желательно.
Мне нравится этот подход, потому что он позволяет вам просмотреть удаленный файл целиком, прежде чем перетащить его на локальный компьютер.
источник
Если вы хотите файл из определенного коммита (любой ветви), скажем 06f8251f
git checkout 06f8251f path_to_file
например, в windows:
git checkout 06f8251f C: \ A \ B \ C \ D \ file.h
источник
Другой способ - создать патч с отличиями и применить его, например, в основной ветке. Допустим, последний коммит перед тем, как вы начали работать с app.js, был 00000aaaaa, а коммит, связанный с нужной версией, - 00000bbbbb
Вы запускаете это на ветке эксперимента:
Это создаст файл со всеми различиями между этими двумя коммитами для app.js, который вы можете применить где угодно. Вы можете хранить этот файл в любом месте за пределами проекта
Затем в мастере вы просто запускаете:
Теперь вы увидите изменения в проектах, как будто вы сделали их вручную.
источник
Надеюсь, что это поможет вам. Пожалуйста, дайте мне знать, если у вас есть какие-либо вопросы.
источник