Мне нужно применить изменения, внесенные в одну ветку, в другую ветку. Я могу использовать набор вишни для этого. Тем не менее, в моем случае я хочу применить изменения, которые имеют отношение только к одному файлу, мне не нужно вишни выбирать целую фиксацию. Как это сделать?
Как вишня выбрать только изменения только для одного файла, а не для всего
Ответ 1
У вас есть разные варианты, основанные на том, чего вы хотите достичь:
Если вы хотите, чтобы содержимое файла было таким же, как на целевой ветке, вы можете использовать git checkout <branch> -- <filename>
. Это, однако, не будет "вишневым" выбором изменений, которые произошли в одном коммите, но просто возьмите полученное состояние указанного файла. Поэтому, если вы добавили строку в коммит, но предыдущие коммиты изменились больше, и вы хотите добавить эту строку без этих изменений, тогда проверка не является тем, что вы хотите.
В противном случае, если вы хотите применить патч, введенный в commit только к одному файлу, у вас есть несколько параметров. Вы можете запустить git cherry-pick -n
, т.е. Без его фиксации, отредактировать фиксацию (например, reset все файлы с помощью git reset -- .
и только добавить файл, который вы действительно хотите изменить, используя git add <filename>
). Или вы можете создать diff для файла и применить diff, а затем:
git diff <branch>^..<branch> -- <filename> | git apply
Ответ 2
Создайте patch file
и примените его.
git diff branchname -- filename > patchfile
git apply patchfile
EDIT:
Поскольку вам нужно принять изменения от фиксации, создайте патч следующим образом:
git show sha1 -- filename > patchfile
Ответ 3
Еще одна удобная задача - получить патч локально, а затем использовать:
git checkout {<name_of_branch>, commit SHA} <path to the file>
Это не черешня, хотя.
Ответ 4
Git есть все готово:)
Просто используйте
git checkout <sha> <path-to-file>
Ответ 5
В самом высоком ответе говорится, что git checkout <branch> -- <filename>
.
Однако этот подход будет работать, только если файл существует в текущей ветке.
Ответ 6
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension
это работает, если вы хотите, чтобы один файл из другой ветки был скопирован в текущую рабочую ветвь
Ответ 7
Это то, что вы ищете:
git checkout target-branch sha1 path/to/file
sha1 необязательно
Ответ 8
Я стараюсь использовать git ls-tree
просто выполните:
git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'
Это будет печатать все имена файлов, соответствующие вашему grep, и дает ключи SHA1 файлов в commit.
Git show можно также использовать для файлов вне вашего ветки.
используя >
из вашей оболочки для вывода вывода в файл, вы получите результат, который вы ищете.
Ответ 9
git reset HEAD~1
перемещает файлы на этап предварительной фиксации
git stash
удаляет из памяти
Теперь ваша ветка довольно чистая (вернулась к предыдущей фиксации)