Зачем использовать "git merge -s ours"?

Я понимаю, что стратегия слияния "наш" (слышать кавычки вокруг слияния?) на самом деле не использует никаких коммитов из другой ветки.

Стратегия "наш" иногда упоминается как "сохранение другой истории". Но он записывает историю как "прикладную". Weird. Есть ли случаи, когда я хочу этого поведения?

В качестве альтернативы вы можете просто импортировать другую ветку и позволить ее историю там, где она принадлежит.

Обратите внимание, что я спрашиваю о стратегии "-s ours", а не опции "-X ours" для "-s recursive" (что отличается тем, что оно применяет те коммиты, которые не конфликтуют).

Ответ 1

Одно использование - "пропустить" фиксацию, сделанную на ветке обслуживания, которая не предназначена для возврата в вашу основную/магистральную ветвь разработки. См. Предыдущий вопрос для примера: git - пропускать определенные коммиты при слиянии

Ответ 2

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

Например, мой вариант использования:

У вас есть ветвь master и dev, и по какой-то причине вы не обновили свою основную ветку за несколько недель, и ваша попытка слияния ветки dev с master теперь приводит к конфликтам слиянием. Что вы можете захотеть сделать, это перезаписать ветвь мастера с текущим состоянием ветки dev, поэтому приведите их как в синхронизацию.

В этом случае вы можете сделать следующее, используя шаги, описанные другим пользователем SO в другом SO-ответе здесь. Но, пожалуйста, см. мою предупреждающую записку ниже.

git checkout dev
git merge -s ours master
git checkout master
git merge dev

Стоит коротко отметить: в конце этого мой мастер был в курсе моего дева, но dev показал 4 коммитов, которые нужно нажать на пульт, что странно. Должно быть 0, чтобы нажать, поскольку я просто хотел обновить мастер. Тем не менее, код казался прекрасным. Просто стоит отметить, поскольку я никогда не использовал git merge -s ours сам до этого, поэтому им не было 100% от его использования.

Я также нашел другой ответ, используя ours, который может быть полезен людям: fooobar.com/questions/3394/...

Ответ 3

Я использую это псевдо-слияние в дополнительной ветке, используемой для отслеживания других ветвей, в том числе заброшенных. Эта дополнительная ветвь на самом деле имеет только один файл (называемый branches-list), который содержит текстовый список активных и неактивных ветвей, но в важных точках (в основном ветки и в конце ветки) либо слияние, либо отказаться) ветки развития объединяются (с "-s ours" ) в эту ветвь.

Вот недавний снимок экрана наш проект:

screenshot

Таким образом, я, наконец, разветвлялся elo-test от мастера, а затем из этого я разветвленный stroke-transform-example для моего здесь (и ответ - это должно было быть два разных фиксации). В каждой такой точке ветвления и, что более важно, в каждой точке, когда ветка заканчивается без ее объединения с какой-либо другой ветвью (что произойдет с stroke-transform-example при следующем очистке), теперь я объединю эту ветвь с -s ours к мета-ветки branches.

Затем я могу позже удалить ветки без использования, не теряя их истории, поэтому вывод git branch -a всегда довольно мал. Если я когда-нибудь захочу оглянуться на то, что я сделал, я с легкостью найду их.

(Я думаю, что это не совсем то, для чего этот вариант сделан, но он работает довольно хорошо.)

Ответ 4

Другое использование - это альтернатива силовому нажатию, которое не приводит к изменениям без быстрого перехода для других.

например. вы хотите вернуть входящую (глупую) фиксацию, но вы не хотите делать git push -f, потому что тогда вы потратите следующие полчаса, направляя своего клиента, восстановив его, и вы хотите более короткую альтернативу

git checkout -b temp remote/origin
git revert HEAD
git push temp:origin
git checkout master
git merge origin/master

поэтому вы просто выполняете

git merge -s ours origin/master

Ответ 5

Одно использование для этого - это подготовка к другому слиянию.

Предположим, что у вас есть какие-то изменения в нисходящем потоке, которые вы хотите объединить с новой версией восходящего потока, но новая версия восходящего потока не является потомком git старой восходящей версии (возможно, потому что старая версия восходящего потока была устойчивой ветвью, были расставлены с багажником, возможно, потому, что предыдущие версии были фактически результатом инструмента импорта).

Что вы можете сделать, это.

  • Ознакомьтесь с новой версией выше.
  • "psuedomerge" старая версия вверх.
  • Объедините новую версию ниже.

Таким образом, ваши локальные изменения будут объединены, но git не будет пытаться объединить старые восходящие изменения, поскольку считает, что они уже объединены.

Ответ 6

Короче говоря: общий предок.

Деталь

Всякий раз, когда вы делаете слияние, git найдет общего предка текущей ветки и ветки, которая будет объединена. Затем git сливает коммиты после общего предка из другой ветки в текущую ветку.

git merge -s ours полностью игнорирует любой контент из другой ветки. Это просто создание нового общего предка.

изменяет диапазон фиксации, который будет объединен для будущих слияний.

Вот пример использования в главе "Расширенное объединение" из книги Pro Git

Например, допустим, что вы разветкились от ветки release и проделали с ней некоторую работу, которую в какой-то момент вы захотите объединить с веткой master. Тем временем некоторое исправление в master должно быть перенесено в вашу ветку release. Вы можете объединить ветку с исправлением ошибок в ветку release, а также merge -s ours ту же ветку с вашей веткой master (даже если исправление уже есть), поэтому, когда вы позже снова объедините ветку release, нет конфликты с исправлением.

В этом примере git merge -s ours используется для пропуска коммитов, связанных с коммитами с исправлениями ошибок, объединенными в ветке release.