【问题标题】:Script to merge 2 git branches automatically?自动合并 2 个 git 分支的脚本?
【发布时间】:2012-01-24 06:40:13
【问题描述】:

我的 git 存储库有 2 个分支:master 和 develop。我想要一个能够自动合并从开发到主控的所有更改的脚本。

我使用 Jenkins:Git 插件克隆存储库,然后运行此脚本(“版本”变量是作业参数):

# 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 合并 -Xtheirs 开发
CONFLICT (delete/modify):test.txt 在开发中被删除,在 HEAD 中被修改。 test.txt 的版本 HEAD 留在树中。
自动合并失败;修复冲突,然后提交结果。

我如何自动解决这个冲突?我希望脚本始终根据“开发”分支添加/修改/删除文件,因为 master 从未被触及反正...

【问题讨论】:

  • 您说“主人永远不会被感动”,但您还是会遇到冲突?如果它真的从不碰,一个简单的git merge --ff-only origin/develop 就足够了。
  • 如果你想用origin/develop 版本替换 主版本而不记录合并提交,为什么还要麻烦merge --nosquash?只使用git checkout master && git reset origin/develop && git reset --soft HEAD@{1} 或类似的东西不是更干净吗?

标签: git merge branch jenkins branching-and-merging


【解决方案1】:

-X theirs 合并策略仅适用于解决文件中的冲突块。这些选项的文档位于the git-merge man page:

      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.

在这种情况下,一个分支删除了文件,而另一个分支修改了它,这与两个进行了不同修改的分支之间的简单冲突大块截然不同。

【讨论】:

  • 有没有办法让 git 自动选择“删除文件”,如果其中一个已删除?
【解决方案2】:

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"

【讨论】:

    猜你喜欢
    • 2015-07-19
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2016-02-06
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    相关资源
    最近更新 更多