2015-04-24 5 views
2

Как я могу сделать фиксацию вишни C4 и C5?Git диапазон вишневого выбора

GitTree

Я попытался git cherry-pick C4..C5, но я только получаю C4. Я думаю, что я действительно не понимаю, как работает этот диапазон.

ответ

2

TL; DR версия: C4^..C5

Если только команду лечит это специально (и git cherry-pick не делает), выражение диапазона означает «принять все коммиты определены/обнаружимого по имени правой стороны, за вычетом всех коммитов определены/можно найти по левому названию ». В этом случае C5 идентифицирует значения от 0 до 5 включительно, а C4 идентифицирует от 0 до 4 включительно. Вычитание второго набора коммитов из первого набора оставляет вас только C5.

Другой способ взглянуть на это состоит в том, что если коммиты связаны, вы получаете «полуоткрытый интервал», точно так же, как целые числа в (3, 7] равны 4 5 6 7.

Как и в случае полуоткрытого целочисленного интервала, обычный простой трюк - начать с одного шага назад. Поскольку (первый) родительский номер C4 равен C4^, C4^..C5 делает трюк, точно так же, как (2, 7] доставит вас 3 4 5 6 7.

(Это не удается, если нет родителя, то есть левая сторона является корневой фиксацией. В этом случае вам нужна какая-то альтернативная стратегия. Некоторые команды делают это проще, некоторые делают это сложнее, но на данный момент мы можем просто игнорировать проблема. :-))

+0

Большое спасибо вам ответить. Кажется, я понимаю, как это работает сейчас. C4 и C5 выполнены на ветке b1. Есть ли способ вишни - выбрать все фиксации, сделанные для ветки b1? – musium

+0

Обычно вы не хотите, чтобы все * совершалось с меткой ветки, недоступной от 'HEAD' (если вы делаете это, имеет смысл слить, возможно, с помощью' --no-ff', чтобы заставить истинное слияние). Однако, если вы этого хотите, вы можете использовать тот факт, что в 'A..B' нет требования, чтобы' A' был предком 'B'. Например, если 'b1' указывает на фиксацию' C5', и вы хотите, чтобы все коммиты оттуда вернулись к корню, минус любые фиксации уже на 'HEAD', тогда' HEAD..b1' делает трюк. – torek

1

В этом конкретном случае вам не нужно использовать диапазон.

Пример из man git-cherry-pick:

git cherry-pick master~4 master~2 
      Apply the changes introduced by the fifth and third last commits pointed to by master and create 2 new commits with these changes. 

Так что для вас:

git cherry-pick C4 C5 
+0

Большое спасибо за ваш ответ. Работает отлично, но я думаю, что в реальном мире мне нужно будет работать с диапазонами (потому что будет не более двух коммитов). – musium

+0

На самом деле, я когда-либо «вишневый», только когда перепутал. Вместо того, чтобы «вишневый выбор» на диапазонах, я бы предпочел «перебазировать», если это возможно. – Gauthier

+0

hmm .. Я не знаю, может ли мой сценарий реального мира быть выполнен с использованием rebase ... Я создаю новый вопрос, описывающий «целую» проблему, которую я пытаюсь решить. – musium