Ядро вещь , которую вы собираетесь хотите здесь git add -p
( -p
это синоним --patch
). Это обеспечивает интерактивный способ регистрации контента, позволяя вам решить, должен ли каждый ханк входить, и даже позволяет вам вручную редактировать патч, если это необходимо.
Чтобы использовать его в сочетании с вишней:
git cherry-pick -n <commit> # get your patch, but don't commit (-n = --no-commit)
git reset # unstage the changes from the cherry-picked commit
git add -p # make all your choices (add the changes you do want)
git commit # make the commit!
(Спасибо Тиму Хенигану за напоминание о том, что у git-cherry-pick есть опция --no-commit, и спасибо Феликсу Рабу за то, что он указал, что вам нужно выполнить сброс! Если вы хотите оставить некоторые вещи вне коммита Вы можете использовать git reset <path>...
для удаления только эти файлы.)
Конечно, вы можете указать конкретные пути, add -p
если это необходимо. Если вы начинаете с патчем вы могли бы заменить cherry-pick
с apply
.
Если вы действительно хотите git cherry-pick -p <commit>
(эта опция не существует), вы можете использовать
git checkout -p <commit>
Это будет отличать текущий коммит от указанного вами коммита и позволит вам применять фрагменты из этого дифференцирования индивидуально. Эта опция может быть более полезной, если коммит, который вы извлекаете, имеет конфликты слияния в части коммита, в которой вы не заинтересованы. (Обратите внимание, однако, что он checkout
отличается от cherry-pick
: checkout
пытается полностью применить <commit>
содержимое, cherry-pick
применяет разность указанный коммит от его родителя. Это означает, что checkout
может применить больше, чем просто коммит, который может быть больше, чем вы хотите.)
cherry-pick -n
очевидно , не оставил изменения поэтапно - соглашение определенно таково, что--no-commit
опции останавливаются непосредственно перед фиксацией, то есть со всеми стадиями изменений. Я добавлю сброс в ответ.git checkout -p <F>
они не просто получают изменения от F, но и объединяют ABCDEF и позволяют вам разобраться, какую часть вы хотите , Сравнивать это с некоторыми изменениями в F - это боль. С другой стороны,git cherry-pick -n <F>
вы получаете только изменения от F - и если некоторые из этих изменений конфликтуют, он услужливо говорит вам, чтобы вы могли понять, как правильно объединить.git reset
удалял подготовленные файлы иadd -p
просто говорил «нечего добавить».Я знаю, что отвечаю на старый вопрос, но похоже, что есть новый способ сделать это с интерактивной проверкой:
Кредит Можно ли в интерактивном режиме выбирать фрагменты из другого git commit?
источник
Предполагая, что необходимые изменения находятся во главе ветки, из которой вы хотите внести изменения, используйте git checkout
для одного файла:
для нескольких файлов просто цепочка:
источник
Опираясь на ответ Майка Монкевича, вы также можете указать один или несколько файлов для извлечения из предоставленной ветки sha1 /.
Это позволит вам в интерактивном режиме выбрать изменения, которые вы хотите применить к вашей текущей версии файла.
источник
Если вы хотите указать список файлов в командной строке и выполнить все это одной атомарной командой, попробуйте:
git apply --3way <(git show -- list-of-files)
--3way
: Если патч не применяется корректно, Git создаст конфликт слияния, чтобы вы могли его запуститьgit mergetool
. Пропуск--3way
заставит Git отказаться от патчей, которые не применяются чисто.источник
Если «частично вишня» означает «в файлах, выбирая некоторые изменения, но отбрасывая другие», это можно сделать, введя
git stash
:git reset HEAD^
преобразовать весь выбранный вишней коммит в непроцессированные рабочие изменения.git stash save --patch
: интерактивно выберите нежелательный материал для хранения.git commit
git stash drop
.Совет: если вы дадите имя хранилищу нежелательных изменений:
git stash save --patch junk
тогда, если вы забудете сделать (6) сейчас, позже вы узнаете, что это за хранилище.источник
Используйте,
git format-patch
чтобы выделить часть коммита, который вам нужен, иgit am
применить его к другой ветке.источник