избегайте повторных коммитов, когда cherry-pick от master до ответвления, а затем слияния с ответвления обратно до master - PullRequest
4 голосов
/ 21 декабря 2011

У меня есть две ветви в git, master / и 1.7 /. Я вернул некоторые исправления из master / в 1.7 /, используя cherry-pick. (Я не использую слияние, потому что мне нужны только некоторые изменения.):

$ git checkout 1.7
$ git cherry-pick -x <initial commit SHA>..<master change 2 SHA>

Позже я объединяю 1.7 / обратно в master /, потому что я хочу, чтобы все изменения, внесенные в 1.7 / (кроме темы cherry-picks), были объединены обратно в основную линию:

$ git checkout master
$ git merge 1.7

Моя проблема заключается в том, что это повторно фиксирует вишневые кирки (первоначально от master /) в master / снова:

$ git log --oneline
8ecfe22 Merge branch '1.7'
fe3a60d master change 2 (cherry picked from commit f5cca9296e45d5965a552c45551157ba
9c25f53 master change 1 (cherry picked from commit 8fae2a68a356f5b89faa8629b9a23b23
f5cca92 master change 2
8fae2a6 master change 1
ffa10bf initial commit

В моем реальном хранилище это даже вызывало конфликты слияния.

Итак, мой вопрос, могу ли я избежать этого (и если да, то как)?

Полный список команд для воспроизведения этого поведения:

$ git init
<create Dialog.js file>
$ git add Dialog.js
$ git commit -am "initial commit"
$ git branch 1.7

<edit Dialog.js file>
$ git commit -am "master change 1"
<edit Dialog.js file>
$ git commit -am "master change 2"
$ git log

$ git checkout 1.7
$ git cherry-pick -x <initial commit SHA>..<master change 2 SHA>

$ git checkout master
$ git merge 1.7
$ git log

1 Ответ

2 голосов
/ 21 декабря 2011

Когда вы выбираете «черри», если вы не используете опцию ускоренной перемотки -ff, вы создаете новые коммиты, а когда вы объединяетесь, git должен сливаться в эти коммиты, даже если они могут быть фактически неактивными.

Rebase может помочь вам здесь, вместо слияния:

git rebase master 1.7

, а затем слить ветку (если необходимо).

Cherry-pick лучше всего использовать, когда выхотите получить небольшие изменения от ветки, которую вы в противном случае отбрасываете.Ваш рабочий процесс должен основываться на слиянии или перебазировании в зависимости от ситуации.

...