Частично вишневый коммит с Git - PullRequest
470 голосов
/ 06 октября 2009

Я работаю в 2 разных ветках: релиз и разработка .

Я заметил, что мне все еще нужно интегрировать некоторые изменения, внесенные в ветку release , обратно в ветку development .

Проблема в том, что мне не нужны все коммиты, только некоторые фрагменты в определенных файлах, поэтому просто

git cherry-pick bc66559

не делает трюк.

Когда я делаю

git show bc66559

Я вижу разницу, но не знаю, как правильно применить ее частично к моему текущему рабочему дереву.

Ответы [ 5 ]

735 голосов
/ 06 октября 2009

Главное, что вам здесь нужно, это 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 может применить больше, чем просто этот коммит, который может быть больше, чем вы хотите.)

69 голосов
/ 29 июня 2013

Я знаю, что отвечаю на старый вопрос, но похоже, что есть новый способ сделать это с интерактивной проверкой:

git checkout -p bc66559

Кредит Могу ли я в интерактивном режиме выбирать фрагменты из другого комита git?

36 голосов
/ 01 февраля 2010

Предполагая, что необходимые изменения находятся во главе ветки, из которой вы хотите внести изменения, используйте git checkout

для одного файла:

git checkout branch_that_has_the_changes_you_want path/to/file.rb

для нескольких файлов просто последовательная цепочка:

git checkout branch_that_has_the_changes_you_want path/to/file.rb path/to/other_file.rb
14 голосов
/ 24 октября 2014

Опираясь на Mike Monkiewicz answer вы также можете указать один или несколько файлов для извлечения из предоставленной ветки sha1 /.

git checkout -p bc66559 -- path/to/file.java 

Это позволит вам в интерактивном режиме выбрать изменения, которые вы хотите применить к вашей текущей версии файла.

0 голосов
/ 14 мая 2014

Если «отчасти вишневый сбор» означает «в файлах выбрать некоторые изменения, но отбросить другие», это можно сделать, введя git stash:

  1. Сделай полный вишневый кирку.
  2. git reset HEAD^, чтобы преобразовать весь выбранный вишневый коммит в неустановленные рабочие изменения.
  3. Сейчас git stash save --patch: интерактивный выбор нежелательного материала для хранения.
  4. Git откатывает сохраненные изменения из вашей рабочей копии.
  5. git commit
  6. Выбросить тайник нежелательных изменений: git stash drop.

Подсказка: если вы дадите имя тайнику нежелательных изменений: git stash save --patch junk, тогда, если вы забудете сделать (6) сейчас, позже вы узнаете, что это такое.

...