Как вишня выбрать только изменения только для одного файла, а не для всего

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

Ответ 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

удаляет из памяти

Теперь ваша ветка довольно чистая (вернулась к предыдущей фиксации)