2015-04-02 2 views
0

Я проверил ветку, и я хочу объединить мастер. Филиал находится за мастером, так как мастер не был объединен с этой веткой через две недели, поэтому я хочу использовать все изменения от мастера.Git merge -X их не объединяет все изменения

я сделать следующее:

git merge -s recursive -X theirs master 

По большей части она сливается, но есть по крайней мере пару мест, где конфликты не из них.

Например, есть одна строка:

#import "VMVideo_Private.h" 

Это было взято из мастера в какой-то момент в течение последних двух недель, но так как эта отрасль не были объединены в последние две недели он все еще там в отрасли.

После слияния с использованием theirs он все еще там.

Кроме того, если я пытаюсь объединить вручную с помощью всего:

git merge master 

Данный конфликт не приходит вообще.

ответ

3

В рекурсивном стратегии слияния, -X theirs (или в этом отношении -X ours) просто означает, что в случае конфликтов он должен автоматически разрешить конфликт, выбирая «свою версию» (или «наша версия», с -X ours) ,

Если есть no конфликт, ваш -X выбор не входит в игру.

Например, предположим, что в исходной (общей версии слияния) файл foo.txt, строка 34, указан Rumplestiltskin. Предположим далее, что вы изменили это на George Clooney. И, наконец, предположим, что файл foo.txt был фактически изменен в master, но нигде рядом с строкой 34. Теперь вы просите git объединить свои (магистерские) изменения с вашими: он сохраняет ваши изменения, где Румплестильцкин становится Клуни, поскольку нет конфликта с их изменениями, где foo.txt теперь претендует на истинность вместо ложного. В результате слияние теперь делает претензии (которые, по его утверждению, истинными) о мистере Клуни, а не о сказочном персонаже.

(В некоторых случаях git - только что делает diff различных версий - будет решать, что изменения, которые вы и они сделали для некоторого кода (или текста), лучше всего представлены чем-то, что семантически совершенно бессмысленно Например, для кода C и Java он может ошибочно синхронизироваться на линиях, где нет ничего, кроме близкой скобки. Результирующие слияния могут быть смехотворными или трагически плохими. Иногда выбирая модифицированный алгоритм дифференциала, например, «терпение diff», может помочь. Иногда ничего не помогает.)

1

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

Предположим, что вы хотите объединить с мастера к текущей ветви дворняжка, после выполнения

git merge -s recursive -X theirs master 
git commit 

то делать (вы должны совершить первый):

git diff --ignore-space-at-eol cur..master | git apply 

Это просто сравнивает объединенные cur и мастер ветви, и diff будет поднят и appli как патч.

+0

Это, похоже, предназначено для повторной настройки 'cur', чтобы точно соответствовать' master'. Это не слияние, это clobber (a la 'git merge -s ours', который также является clobber, но в другом направлении). Если вы хотите, чтобы слияние слияния в направлении «их», это легко сделать в одном коммите, хотя требуется несколько команд git. – torek

+0

Нет. Это необходимо для настройки * cur * на **, содержащего ** все в * master *. – zsong

+0

Как бы вы отличали «содержать все» от «точно совпадают» (кроме конца строки белого пространства)? Например, предположим, что 'cur' имеет файл' new.txt', который не существует в 'master'. 'Git diff ... | git apply' будет * удалить * new.txt. Очевидно, я должен затем выполнить и зафиксировать результат применения, но как только я это сделаю, 'cur' теперь соответствует' master'. – torek

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