Я подозреваю, что вы здесь запутались, потому что это в корне запутанно. Что еще хуже, весь наш / их материал меняет роли (становится задом наперед), когда вы делаете ребазинг.
В конечном счете, во время git merge
, филиал «наш» относится к отрасли вы сливаясь в :
git checkout merge-into-ours
и ветвь "их" относится к (единственной) ветке, которую вы объединяете:
git merge from-theirs
и здесь «наши» и «чужих» имеет некоторый смысл, так как даже если «их», вероятно , ваш так или иначе, «их» не один ты на когда вы запускали git merge
.
Хотя использование фактического имени ветки может быть довольно классным, оно разваливается в более сложных случаях. Например, вместо вышеупомянутого вы можете сделать:
git checkout ours
git merge 1234567
где вы сливаетесь по необработанному коммит-идентификатору. Хуже, вы даже можете сделать это:
git checkout 7777777 # detach HEAD
git merge 1234567 # do a test merge
в этом случае нет ни одного названия филиалов , участвующего!
Я думаю, что это мало поможет, но на самом деле в gitrevisions
синтаксисе вы можете ссылаться на отдельный путь в индексе по номеру во время конфликтующего слияния
git show :1:README
git show :2:README
git show :3:README
Стадия № 1 является общим предком файлов, стадия № 2 - версия целевой ветви, а стадия № 3 - версия, с которой вы объединяетесь.
Причина, по которой понятия «наш» и «их» меняются местами, rebase
заключается в том, что ребаз работает, выполняя серию «вишенок», в анонимную ветвь (режим отсоединенного HEAD). Целевая ветвь - это анонимная ветвь, а ветвь слияния - это ваша исходная ветвь (pre-rebase): так что «--ours» означает, что анонимный ребаз строит, а «--theirs» означает «наша ветвь перебазируется» ,
Что касается записи gitattributes: она может иметь эффект: «наш» действительно означает «использовать этап # 2» внутри. Но, как вы заметили, в данный момент он на самом деле не на месте, поэтому он не должен иметь здесь никакого эффекта ... ну, если вы не скопируете его в рабочее дерево перед началом работы.
Кроме того, кстати, это относится ко всем нашим и их использованию, но некоторые находятся на уровне целого файла ( -s ours
для стратегии слияния; git checkout --ours
во время конфликта слияния), а некоторые - по частям ( -X ours
или -X theirs
во время -s recursive
слияния). Что, вероятно, не поможет ни с какой путаницей.
Я никогда не придумал лучшего названия для них. И: см . Ответ VonC на другой вопрос, где git mergetool
вводятся еще несколько имен для них, называя их «локальными» и «удаленными»!