2011-10-18 6 views
5

У меня есть 2 ветви, скажем, ветка1 и ветвь2. В branch1 добавлено много новой функции, а branch2 - стабильной. Сегодня я хочу объединить только одну функцию из ветки1 в branch2. Итак, я просто запустил git cherry-pick <commit-for-feature1-in-branch1. Я полагаю, что должно произойти только изменение в <commit-for-featur1-in-branch1, которое будет объединено в branch2. Но я обнаружил, что есть другие изменения для других функций.Почему выбор из черешни выбирают более одного?

Я думал, что он получит разницу только для того, что указано commit, не так ли?

FYI, фиксация в ветке1 была объединена с другой ветвью развития, может ли это вызвать эту проблему?

Что-то не так?

Спасибо.

+2

Вы уверены, что указано обязательство не включать больше чем вы думали? – VonC

+0

Да, я попытался увидеть разницу этой фиксации: git diff revision^revision. это то, что мне нужно. – Rocky

ответ

3

Что делает git cherry-pick, так это требуется фиксация, которую вы укажете, и читаете разницу между ней и ее родителем. Это эффективно делает патч. Затем он применяет этот патч к вашей проверенной ветке.

В вашем случае коммит содержал дополнительные функции. Вы можете перепроверить, что сообщение фиксации соответствует тому, что вы думали, что эта функция была глядя на патч, что совершал бы генерировать с git log:

git log -p -1 <sha1-of-your-commit> 

-p рассказывает журнал, чтобы не только показать фиксации информации, как автор, дату и сообщение фиксации, но также включить патч (или разницу), который вводит фиксация. Опция -1 сообщает журналу git прекратить запись истории после 1 фиксации.

+0

Спасибо за ваш ответ. Я проверил журнал. Это именно то, что я хочу. Но после того, как я запустил git cherry-pick, он добавил дополнительные коды не в этом фиксации. И FYI, фиксация в ветке 1 была объединена с другой ветвью развития, может ли это вызвать эту проблему? – Rocky

+0

код был в вашем филиале. запустите 'git log -p -1' на ветке, на которой вы выбрали вишню, и посмотрите, что добавлено. Если лишних вещей нет, значит, он уже существует в этой ветке. Чтобы проверить, какая команда добавила кусок кода, 'git log -Ssometextfromafeature 'покажет, что добавил этот код. –

1

я также сталкивался с этим поведением ... Я отслеживал его вниз к следующему объяснению, но, возможно, кто-то уточнить это он больше:

  • Вы вишневый выбрать коммят, фиксацию содержит 1 изменить в 1 файл
  • Вы заметили, что не только изменения, содержащиеся в фиксации, но и больше изменений (в основном вокруг этого изменения включены)

Это происходит потому, что изменение фиксации зависит от предыдущего изменения. Таким образом, эта область кода была изменена несколько раз после того, как была создана целевая ветка, которую вы хотите создать.

Git возвращается в историю, пока источник выборки вишни не соответствует цели и не создает патч на основе этой ревизии. Вот почему могут появиться больше изменений ...

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