GIT - как слить ветки? - PullRequest
       13

GIT - как слить ветки?

5 голосов
/ 16 марта 2011

Мы решили использовать GIT в нашей компании, но теперь возникла проблема. У нас есть несколько филиалов с различными функциями.Теперь нам нужно слить эти ветви и передать их Мастеру.Как нам это сделать с автозаменой - у нас есть branch-a, branch-b, branch-c - нам нужно получить их все в Master, но в случае повторных файлов ветвь-b должна быть Major, а branch-c - minor.

Upd:

branch-a:
-file1
-file2
-file3
-file4

branch-b:
-file1
-file5
-file6

branch-c:
-file1
-file2
-file7
-file8

нам нужно в результате:

Master:
-file1 (from b)
-file2 (from a)
-file3 (from a)
-file4 (from a)
-file5 (from b)
-file6 (from b)
-file7 (from c)
-file8 (from c)

Ответы [ 3 ]

11 голосов
/ 16 марта 2011

Выполнить слияние осьминога и не фиксировать '--no-commit'.От мастера

git merge --no-commit branch-a branch-b branch-c

разрешите любые конфликты, затем, если хотите, возьмите конкретную версию файла и подтвердите:

git checkout branch-b -- file3

повторите для других конкретных файлов.1008 *

Так будет работать ваш пользовательский рабочий процесс.

Надеюсь, это поможет.

2 голосов
/ 16 марта 2011

Я не проверял это, но это может делать то, что вы хотите:

git checkout master
git merge -s recursive -X theirs branch-c
git merge -s recursive -X theirs branch-a
git merge -s recursive -X theirs branch-b

Это использует стратегию слияния recursive, но говорит, что если при объединении возникают конфликты, всегдаразрешите их в пользу ветви, которую вы объединяете с текущей веткой.Чтобы найти документацию по этому вопросу, обратитесь к разделу о стратегии рекурсивного слияния на странице руководства git merge и опциям ours и theirs этой стратегии.

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

git merge --no-commit branch-c

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

comm -1 -2 <(git ls-tree -r --name-only master|sort) <(git ls-tree -r --name-only branch-c|sort) > common.txt

... и затем выбрать версию branch-c для каждого с помощью:

xargs -n 1 git checkout branch-c -- < common.txt

... а затем фиксируя с git commit как обычно.

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

0 голосов
/ 19 июля 2016

копия файла - простая альтернатива

Один из способов сделать это - оформить ветку master. В отдельных репозиториях извлекайте второстепенные и основные файлы веток. Скопируйте второстепенные файлы, а затем основные файлы, чтобы основные файлы перезаписывали второстепенные файлы. Затем зафиксируйте результат.

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

Возможно, это не лучший способ сделать что-то для вашего конкретного случая. Просто рассматривайте это как дополнительный инструмент в вашем наборе инструментов. Конечно, если слияние - это то, что вы хотите сделать, а не просто перезаписать, то git по-прежнему остается инструментом, который используется вместе с mergetool, таким как kdiff3.

...