Мне нужно применить изменения, внесенные в одну ветку, к другой ветке. Для этого я могу использовать вишневую кирку. Однако в моем случае я хочу применить изменения, которые актуальны только для одного файла, мне не нужно выбирать весь коммит. Как это сделать?
108
Ответы:
У вас есть разные варианты в зависимости от того, чего вы хотите достичь:
Если вы хотите, чтобы содержимое файла было таким же, как в целевой ветке, вы можете использовать
git checkout <branch> -- <filename>
. Однако это не будет «выделять» изменения, произошедшие за один коммит, а просто принимает результирующее состояние указанного файла. Поэтому, если вы добавили строку в коммит, но предыдущие коммиты изменились больше, и вы хотите добавить только эту строку без этих других изменений, то проверка - это не то, что вам нужно.В противном случае, если вы хотите применить патч, введенный в фиксации, только к одному файлу, у вас есть несколько вариантов. Вы можете запустить
git cherry-pick -n
, то есть без фиксации, отредактировать фиксацию (например, сбросить все файлы, используяgit reset -- .
и добавить только тот файл, который вы действительно хотите изменить, используяgit add <filename>
). Или вы можете создать разницу для файла и затем применить ее:источник
Создайте
patch file
и примените его.РЕДАКТИРОВАТЬ:
Поскольку вам нужно взять изменения из коммита, создайте патч следующим образом:
источник
git diff sha1
(илиgit diff branch
- то же самое, если ветвь указывает на тот же хэш) будет производить только различие текущего рабочего каталога по отношению к этому хешу, но не то, что изменяет коммит, введенный сам по себе.git checkout
с именем файла - правильный молоток для этого гвоздя. Оба эти варианта излишне сложны.checkout
это не сработает, так как это может включать другие нежелательные предыдущие изменения и может не содержать изменений, сделанных в текущей ветке.Еще одна удобная вещь - получить патч локально, а затем использовать:
Но это не вишенки.
источник
В Git все готово :)
Просто используйте
git checkout <sha> <path-to-file>
источник
это работает, если вы хотите, чтобы один файл из другой ветки был скопирован в текущую рабочую ветку
источник
Это то, что вы ищете:
sha1 не является обязательным
источник
Я обычно использую
git ls-tree
просто сделать:
Это напечатает все имена файлов, соответствующие вашему grep, и выдаст ключи SHA1 для файлов в фиксации.
Git show также можно использовать с файлами за пределами вашей ветки. использование
>
из вашей оболочки для передачи вывода в файл дает вам результат, который вы ищете.источник
Вы можете попробовать это сделать:
Например:
источник
перемещает файлы на стадию предварительной фиксации
удаляет из памяти
Теперь ваша ветка довольно чистая (возвращена к предыдущей фиксации)
источник