2015-08-20 3 views
0

Например, предположим, что у нас есть две ветви «master» и «alt». «Ведущая» ветвь берет «A», «B», «C» и «D», а ветвь «alt» совершает «A», «B», «D». Commit «D» представляет собой слияние с alt в master. Вот моя попытка рисования этих отношений:При объединении ветвей git никогда не использует коммиты между базой слияния и фиксацией слияния?

A <-- B <-- C <--- D \ / \---B'<--------/

Вопрос: Так как совершить A ясно слияние-баз B' и C, делает мерзавец вообще нужна информация, находящуюся в B (т.е. совершение между фиксацией слияния и базой слияния)? Если ответ отрицательный, существуют ли какие-либо особые случаи, когда да?

+0

Вот может быть, еще один способ выразить это: если вы использовали rebase для сквоша B и C вместе, может ли это изменить значение слияния? – Schwern

ответ

0

Git действительно нуждается в информации о B и C, как вы фраза его, так как эти коммиты может изменять одни и те же строки кода, как совершить B' делает, что привело бы к конфликту, который вы должны решить в слиянии совершить D.

+0

Извините, я неправильно сформулировал свой вопрос. Я не имею в виду 'B' и' C', я просто имею в виду 'B'. Не все ли данные, которые нужны git в 'C' и' A'? Как может понадобиться 'B'? – George

+1

Положите иначе: если 'B' изменяет те же строки кода, что и' B'', то эти строки кода будут либо (i) переопределены в 'C', либо (ii) будут отображаться в' C' * в любом случае * , Так разве нам НЕ нужна информация, найденная в 'B', чтобы сделать это слияние? – George

+0

Я думаю, вы смущены тем фактом, что информация содержится в фиксации. Каждая фиксация сохраняет только дельта родителя. То есть, только одна команда 'C' сама не содержит информацию из' B'. Вы можете легко проверить это, запустив 'git show C', который не показывает никаких изменений с' B'. Что, вероятно, смущает вас, так это то, что когда вы говорите «git checkout C», вы все равно получаете рабочее дерево, которое включает изменения с «B».Но это потому, что 'checkout' означает состояние дерева после применения' C', а не только 'C' (что в любом случае не имеет смысла). – sschuberth

1

Концепция «... совсем нужна информация, содержащаяся в B ...» не особо понятна. Но, возможно, понимая, что происходит под капотом в git merge поможет вам ответить на свой вопрос ...

Учитывая ваше описал дерево, и ваш описанный метод получения там (git checkout master; git merge alt - хотя вы должны знать, что это не вызывает alt также указывать на D, поэтому ваше утверждение о том, что содержит ошибку D, неверно, если вы не сделали что-то еще, чтобы повлиять на это), происходит то, что git merge находит A в качестве базы слияния. Затем он создает дельты между A и C (кончик предварительного слияния master) и между A и B' (кончик alt), а затем пытается скомбинировать эти две дельты и применить объединенную дельта к A - это новое состояние становится D. Если две ветви дельта не могут быть объединены чистой, тогда у вас есть конфликт - наиболее вероятная причина для этого состоит в том, что B' изменил некоторые строки, которые также были изменены либо в B, либо в C, но не таким же образом.

Так, строго говоря, нет, git не смотрит конкретно на фиксацию B во время процесса слияния; Однако, поскольку изменения, вносимые B присутствуют также в C (в той степени, что C не отменить их, во всяком случае), то «информация, найденная в B» является «используется» в некотором смысле ...

Смежные вопросы