Я подозреваю, что вы здесь запутались, потому что это в корне запутанно. Что еще хуже, весь наш / их материал меняет роли (становится задом наперед), когда вы делаете ребазинг.
В конечном счете, во время 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
вводятся еще несколько имен для них, называя их «локальными» и «удаленными»!
« Наши » в Git относятся к оригинальной рабочей ветке, которая имеет авторитетную / каноническую часть истории Git.
« Их » относится к версии , которая держит работу для того , чтобы быть нормированной (изменения , чтобы быть воспроизведено на текущую ветвь).
Это может показаться заменой людям, которые не знают, что перебазирование (например
git rebase
) фактически приостанавливает вашу работу (которая принадлежит им ), чтобы воспроизвести каноническую / основную историю, которая принадлежит нам , потому что мы перебираем нашу меняется как сторонняя работа.Документация для
git-checkout
была дополнительно разъяснена в Git> = 2.5.1 в соответствии сf303016
коммитом :Ибо
git-merge
это объяснить следующим образом:Более подробно, здесь объясняется, как их использовать:
Так что иногда это может сбивать с толку, например:
git pull origin master
где-Xours
наш местный,-Xtheirs
это их (удаленный) филиалgit pull origin master -r
где-Xours
их (удаленный),-Xtheirs
нашТаким образом, 2-й пример противоположен 1-му, потому что мы перемещаем нашу ветку поверх удаленной, поэтому наша отправная точка является удаленной, а наши изменения рассматриваются как внешние.
Похоже на
git merge
стратегии (-X ours
а-X theirs
).источник
git merge
, ноgit pull
иgit checkout
как пример. Если вы хотите использовать этот параметр сgit merge
, вы должны использовать-X ours
. Вы все еще можете использовать--ours
синтаксис дляgit checkout
. Я уточнил ответ еще больше.Я знаю, что на этот вопрос уже дан ответ, но эта проблема смущала меня так много раз, что я создал небольшой справочный сайт, чтобы помочь мне вспомнить: https://nitaym.github.io/ourstheirs/
Вот основы:
Слияния:
Если вы хотите выбрать версию в
master
:Если вы хотите выбрать версию в
feature
:Rebases:
Если вы хотите выбрать версию в
master
:Если вы хотите выбрать версию в
feature
:(Это для полных файлов, конечно)
источник
Так что, если вы находитесь на выпуске ветки / 2.5 и объединяете в нем функцию / новые кнопки ветки , то контент, найденный в выпуске / 2.5, - это то, к чему относится наш, и контент, найденный на функции / новые кнопки, - то, к чему они относятся к. Во время действия слияния это довольно просто.
Единственная проблема, к которой относится большинство людей - это случай перебазирования . Если вы сделаете повторную базу вместо обычного слияния, роли поменяются местами. Как это? Ну, это вызвано исключительно тем, как работает перебазировка. Подумайте о rebase, чтобы работать так:
Конечно, это не совсем то, что происходит, но это хорошая модель для меня. И если вы посмотрите на 2 и 3, вы поймете, почему роли поменялись местами. Начиная с 2, ваша текущая ветвь теперь является веткой с сервера без каких-либо изменений, так что это наша (ветвь, в которой вы находитесь). Внесенные вами изменения теперь относятся к другой ветви, отличной от вашей текущей ( BranchX ), и, таким образом, эти изменения (несмотря на то, что вы сделали изменения) принадлежат им (другая ветвь, используемая в вашем действии).
Это означает, что если вы объединяетесь и хотите, чтобы ваши изменения всегда побеждали, вы должны указать git всегда выбирать «наши», но если вы сделаете ребаз и хотите, чтобы все ваши изменения всегда побеждали, вы скажете git всегда выбирать «их».
источник
Я знаю, что это не объясняет смысла, но я сделал себе небольшое изображение, чтобы напомнить, какой использовать:
Надеюсь, поможет!
PS - Проверь также ссылку в ответе Нитья 🙂
источник
Я опубликую свою записку здесь, потому что я должен возвращаться сюда снова и снова.
СЦЕНАРИЙ 1. Обычный разработчик: вы - разработчик, который не может объединяться
master
и должен игратьfeature
только с ветками.Случай 1: хозяин - король Вы хотите обновить свою
feature
ветку (= rebase tomaster
), потому что онаmaster
содержит новые обновления зависимостей и вы хотите перезаписать свои скромные изменения.Случай 2: ты король. Вы хотите изменить свою
feature
ветку наmaster
изменения. Но вы сделали больше, чем ваши коллеги, и хотите использовать свои собственные изменения в приоритете.ВАЖНО: Как видите, нормальные разработчики должны предпочитать
rebase
и повторять это каждое утро, как упражнения / кофе.СЦЕНАРИЙ 2. Объединение сэнсэя: Вы являетесь руководителем группы и хотите объединить другие ветви и передать объединенный результат непосредственно мастеру.
master
это ветка, которую вы измените.Случай 1: мастер - это король. Вы хотите объединить стороннюю ветку, но
master
это приоритет.feature
это ветка, которую сделал ваш старший.Случай 2: новые изменения - король Когда ваш старший разработчик выпустил классную версию
feature
и вы хотите перезаписать старый s ** t вmaster
ветке.ПОМНИТЕ: Для того, чтобы помнить , в полночь , который один на выбор:
master
естьours
ВСЕГДА. Иtheirs
это,feature
что их сделали.источник
От
git checkout
использования:При разрешении конфликтов слияния вы можете сделать
git checkout --theirs some_file
иgit checkout --ours some_file
сбросить файл до текущей версии и входящих версий соответственно.Если вы сделали
git checkout --ours some_file
илиgit checkout --theirs some_file
хотите сбросить файл до трехсторонней версии файла слияния, вы можете это сделатьgit checkout --merge some_file
.источник