我有一个git repo,第二个repo是一个子模块。两个回购都有对应的分支,用于各种特性,这些特性通常非常直接地对应,例如,如果父回购在分支A上,子模块也将在分支A上。
在父级和子模块回购中,随着时间的推移,会添加更多的分支,有时我会将较旧的分支合并到较新的分支,例如,在两个回购中定期将分支A合并到分支B,而分支B也会得到不在A中的新提交。
当A子模块更新后,我将父回购的分支A合并为B时,就会出现问题。我想忽略这些更新(即,我总是想在合并期间丢弃子模块更新,否则父分支B可能会以子模块分支A结束,这是错误的)。
我发现了一些instructions关于如何在合并文件时始终使用“ours”,但它对于子模块似乎无效。下面是如何使用子模块重现问题:

# first command will update your ~/.gitconfig, you may want to undo it later
git config --global merge.ours.driver true

mkdir -p tmp/sub
cd tmp
git init
git commit --allow-empty -m "chore: Initial commit"
echo 'sub merge=ours' >> .gitattributes
git add .gitattributes
git commit -m 'chore: Preserve sub during merges'

mkdir sub
pushd sub
git init
git commit --allow-empty -m "sub: init"
popd
git submodule add ./sub
git commit -m 'add submodule'

git checkout -b demo-prod
pushd sub
echo prod > readme
git add readme
git commit -m 'add prod readme'
popd
git commit sub -m 'sub: add prod readme'

git checkout -
git submodule update
pushd sub
echo master > log
git add log
git commit -m 'add master log'
popd
git commit sub -m 'sub: add master log'

git checkout demo-prod
git merge -

预期的结果是自动合并,但实际的结果是合并冲突,因为“sub”在父回购的两个分支中都有新的提交。
在这种情况下,我怎样才能实现简单的合并呢?

最佳答案

与子模块的合并在t7405-submodule-merge.sh中进行了测试,它始终包含一个merge -s ours,它应该可以满足您的需要。
(2009年4月在commit f37ae35中添加测试,git v1.6.2.4)
2018年1月,v2.17.0-rc0,was discussed in Nov. 2017中的子模块this patchcommit 6c8647d的实际合并,但此处不需要它。
使用merge strategy-s ours”可能太多(因为它忽略了来自另一个分支的所有提交),但是合并递归策略选项可以帮助:git merge -X ours

关于git - 如何 merge 子模块并始终保留“我们的”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58006649/

10-13 07:29
查看更多