如果你有一个支持分支,用于修复错误和构建新版本。在主分支上,你也会频繁地构建新版本。每次构建新版本时,你都需要更改某个文件中的版本信息,提交该文件,创建标签并推送。现在从
support 分支合并到
master 分支将始终在包含版本信息的文件中发生冲突。
如果包含版本信息的文件
仅包含版本信息,则可以使用fcurella的答案。但是,如果它确实可能包含可合并的信息(例如pom.xml、gradle.properties、MANIFEST.MF等),则必须执行一些额外的操作。
让我们使用以下示例。
C---D*---E---F* support
/
A---B---G---H*---I master
带星标的提交仅包含由于版本更改而应在合并期间忽略的更改。
为了在不因版本构建而产生合并冲突的情况下将 support 合并到 master,您可以执行以下任一操作:
多次合并提交
git checkout master
git merge C
git merge D -s ours
git merge E
git merge F -s ours
通过使用
-s ours
参数,我们告诉git仅记录合并而不更改工作区。这类似于svn的
--record-only
选项。
上述操作将导致以下布局。
-------------C---D*---E---F* support
/ \ \ \ \
A---B---G---H*---I---J---K----L---M master
使用cherry-pick合并一个提交
git checkout master
git merge support -s ours --no-commit
git cherry-pick C E --no-commit
git commit -m 'merged support into master'
首先,我们开始合并,但仅记录我们正在合并,而不更改工作区且不进行合并提交。然后,我们挑选要合并的提交,同样不进行提交。最后,我们提交合并结果。
上述操作将产生以下布局。
C---D*---E---F* support
/ \
A---B---G---H*---I---J master
甚至可以自动化挑选。
git checkout master
git merge support -s ours --no-commit
for id in `git log support --reverse --not HEAD --format="%H [%an] %s" |
grep -v "bump version" |
sed "s/\(\w*\)\s.*/\1/g"`
do
git cherry-pick --no-commit $id
done
git commit -m 'merged support into master'