Частично вишневый выбор фиксации с Git
Я работаю на 2 разных ветках: релиз и развитие.
Я заметил, что мне все еще нужно интегрировать некоторые изменения, которые были совершены в релиз ветку обратно в развитие филиала.
проблема в том, что мне не нужны все фиксации, только некоторые куски в определенных файлах, поэтому простой
git cherry-pick bc66559
не делает трюк.
когда я делаю а
git show bc66559
Я вижу разницу, но на самом деле не знаю хорошего способа применить это частично к моему текущему рабочему дереву.
5 ответов:
основная вещь, которую вы хотите здесь
git add -p
(-p
- это синоним--patch
). Это обеспечивает интерактивный способ проверки содержимого, позволяя вам решить, должен ли каждый кусок войти, и даже позволяет вручную редактировать патч, если это необходимо.чтобы использовать его в сочетании с cherry-pick:
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
может применяться больше, чем просто фиксация, которая может быть больше, чем вы хотите.)
Я знаю, что отвечаю на старый вопрос, но похоже, что есть новый способ сделать это с помощью интерактивной проверки:
git checkout -p bc66559
кредит могу ли я интерактивно выбрать куски из другого git commit?
предполагая, что изменения, которые вы хотите, находятся во главе ветви, из которой вы хотите внести изменения, используйте git checkout
для одного файла :
git checkout branch_that_has_the_changes_you_want path/to/file.rb
для нескольких файлов просто daisy chain:
git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
дом на Майк Монкевич ответ вы также можете указать один или несколько файлов для извлечения из поставляемого sha1/branch.
git checkout -p bc66559 -- path/to/file.java
Это позволит вам в интерактивном режиме выберите изменения, которые вы хотите применить к текущей версии файла.
если "частично вишневый сбор" означает "в файлах, выбирая некоторые изменения, но отбрасывая другие", это можно сделать, введя
git stash
:
- сделайте полный выбор вишни.
git reset HEAD^
преобразовать всю вишней совершить в неиндексированных изменений рабочей.- теперь
git stash save --patch
: интерактивно выберите нежелательный материал для тайника.- Git откатывает спрятанные изменения от вашей работы копировать.
git commit
- выбросить тайник нежелательных изменений:
git stash drop
.совет: если вы даете тайник нежелательных изменений имя:
git stash save --patch junk
тогда, если вы забудете сделать (7) сейчас, позже вы узнаете тайник для того, что это такое.