выбор вишни
Верно ли, что F' = (F-B) + Z?
Нет, это также внесет изменения, внесенные в C, D и E.
git-cherry-pick
работает, изолируя уникальные изменения в коммите, которые будут отобраны (например, F-E в этом примере, игнорируя дополнительных предков, включая базу слияния), и применяя их к цели.
Это делается не с помощью патч-приложения, а с использованием трехстороннего алгоритма слияния: родитель выбранной фиксации будет использоваться в качестве общего предка, а выбранная фиксация будет одной стороной слияния. , с целью в качестве другой стороны. Результатом этого являются изменения, которые были включены в выбранный коммит и в цель.
Например, если E является родителем коммита, который нужно выбрать, и его содержимое (действующее как общий предок):
Line 1
Line 2
Line 3
Line 4
Line 5
Например, если F — это коммит, который нужно выбрать, и его содержимое:
Line 1
Line 2
Line Three
Line 4
Line 5
И цель вишневого выбора Z:
LINE 1
Line 2
Line 3
Line 4
Line 5!
Затем результаты трехстороннего слияния (с аннотациями о том, откуда взялась каждая строка):
LINE 1
Line 2
Line Three
Line 4
Line 5!
возвращаться
Верно ли, что D' = G - D?
Да грубо говоря. Изменения, которые были уникальными для D, были удалены из G. Как и git-cherry-pick
, git-revert
реализовано с использованием трехстороннего слияния, хотя на этот раз фиксация для возврата рассматривается как общий предок, одна сторона — текущая фиксация, а другая — родительская фиксация для возврата.
Это будет означать, что если строка между фиксацией для возврата и текущей фиксацией идентична, вместо нее будет выбрана строка из ее родителя.
Если содержимое D, коммит для возврата действует как общий предок, и его содержимое:
Line 1
Line 2
Line THREE
Line 4
Line FIVE
И содержимое C (родителя D):
Line 1
Line 2
Line 3
Line 4
Line 5
И содержимое G было изменено дальше, и его содержимое таково:
Line One
Line 2
Line THREE
Line 4
Line FIVE
Тогда результаты трехстороннего слияния будут такими:
Line One
Line 2
Line 3
Line 4
Line 5
Это результат использования уникальных строк в родительском C и целевом G.
Объединить коммиты
Как отмечает torek (ниже), поскольку оба этих механизма включают использование родительской фиксации, они ломаются, когда есть более одного родительского коммита. (То есть рассматриваемая фиксация является слиянием и имеет несколько родителей.) В этом случае вам нужно будет указать git какой родитель учитывать (используя флаг -m
).
Конфликты
Конечно, любой из этих механизмов может вызывать конфликты. Например, если текущий конфликт был дальше изменен, вам придется разрешать конфликты. Например, если в примере с откатом (выше) последующая фиксация также изменила строку 5, то G на самом деле была такой:
Line One
Line 2
Line THREE
Line 4
LINE FIVE!
Тогда был бы конфликт. Рабочий каталог (объединенный файл) будет:
Line One
Line 2
Line 3
Line 4
<<<<<<<
LINE FIVE!
=======
Line 5
>>>>>>>
И вам нужно будет решить, хотите ли вы исходное изменение (Line 5
) или новейшее изменение (LINE FIVE!
).
person
Edward Thomson
schedule
03.01.2016