Скрипт для слияния 2 веток git автоматически? - PullRequest
8 голосов
/ 20 декабря 2011

В моем git-репозитории есть 2 ветки: осваивать и развивать. Мне нужен скрипт, который автоматически объединяет все изменения от разработки до мастера.

Я использовал Jenkins: плагин Git клонирует репозиторий, а затем запускается этот скрипт (переменная 'version' является параметром задания):

# merge
git checkout -b develop origin/develop
git checkout master
git merge -Xtheirs --squash develop -m "v${version}"

# commit
git commit -m "v${version}"

# tag
git tag v${version} -m "v${version}"

# push
git push origin v${version}

Я попробовал его в тестовом репозитории, и он не работает с:

git merge -Xtheirs развивать
CONFLICT (удалить / изменить): test.txt удален в разработке и изменен в HEAD. Версия HEAD файла test.txt оставлена ​​в дереве.
Автоматическое объединение не выполнено; исправить конфликты, а затем зафиксировать результат.

Как мне разрешить этот конфликт автоматически ? Я хочу, чтобы скрипт всегда добавлял / изменял / удалял файлы в соответствии с веткой'velop ', так как master никогда не затрагивался. ..

Ответы [ 2 ]

7 голосов
/ 20 декабря 2011

Стратегия слияния -X theirs работает только для разрешения конфликтующих фрагментов в файле.Документация для этих опций находится в справочной странице git-merge :

      ours
           This option forces conflicting hunks to be auto-resolved
           cleanly by favoring our version. Changes from the other tree
           that do not conflict with our side are reflected to the merge
           result.

           This should not be confused with the ours merge strategy, which
           does not even look at what the other tree contains at all. It
           discards everything the other tree did, declaring our history
           contains all that happened in it.

       theirs
           This is opposite of ours.

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

2 голосов
/ 18 января 2017

5 лет .... Но все еще актуально.

Вот мое решение: я удаляю основную ветку и создаю новую основную ветвь из ветви, из которой я хочу "объединить":

GIT_BRANCH_TO_MERGE_FROM=`git symbolic-ref HEAD | sed 's!refs\/heads\/!!'`
GIT_BRANCH_TO_MERGE_TO="master"

git checkout "${GIT_BRANCH_TO_MERGE_TO}"
git checkout "${GIT_BRANCH_TO_MERGE_FROM}"

# Delete TO branch
git branch -D "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to delete ${GIT_BRANCH_TO_MERGE_TO}"
git push origin :"${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} delete to origin"

# Create TO branch
git checkout -b "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to create local branch ${GIT_BRANCH_TO_MERGE_TO}"
git push origin "${GIT_BRANCH_TO_MERGE_TO}" || echo "Failed to push ${GIT_BRANCH_TO_MERGE_TO} to origin"
...