Частично вишневый выбор фиксации с Git


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

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

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

git cherry-pick bc66559

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

когда я делаю а

git show bc66559

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

5 440

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:

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

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