pre*_*ion 5 git branch branching-and-merging git-branch
我正在使用git开发我的第一个项目,并遇到了一个问题.
repo包含一个客户端/服务器应用程序.我有一个'主'和'测试'分支,意图是master总是与部署的相同.
我的问题在代码库中存在3-4个存储服务器URL的位置.我想在'test'分支中更改它,但不在'master'分支中.问题是,当我想要合并回'master'时,git想把这个改变放在'master'中.
我可以做一个选择性合并并合并所有提交但有问题,但这对于每一次合并来说都是单调乏味的.最好的方法是什么?
我从来没有在任何 SCM中遇到过这个问题,所以也许我只是说这一切都错了.
您希望合并该更改,因为实际上并未合并,但在历史记录中将其标记为如此。这样您就知道从哪里获得后续更改。
有几种方法可以做到这一点。一是
git checkout master
git merge -s ours --no-ff testing
git checkout testing
git merge -s ours --no-ff master
Run Code Online (Sandbox Code Playgroud)
或者
git checkout master
git merge testing --no-commit --no-ff
git checkout HEAD -- .
git submodule update # this is optional and only needed if you have submodules
git add -A
git commit
git checkout testing
git merge master --no-commit --no-ff
git checkout HEAD -- .
git submodule update # this is optional and only needed if you have submodules
git add -A
git commmit
Run Code Online (Sandbox Code Playgroud)
现在您有 2 个具有不同配置的分支,但这些提交位于重要的merge-base.
现在您需要编写类似这样的脚本来进行特殊合并,这实际上是底层的变基——这是忽略之前发生的事情的唯一方法:
git checkout master
git merge --no-ff -s ours testing
git checkout -b temp testing
git rebase -s recursive -Xtheirs master # these are the conflicts we care about
git reset --soft HEAD@{2}
git add -A
git submodule update
git commit --amend -C HEAD@{2}
git push . +HEAD:master
git checkout master
git branch -d temp
Run Code Online (Sandbox Code Playgroud)
这只是重新调整分支测试中 master 上没有的内容,并使其看起来像合并。因为它将其存储为合并,所以您随后可以针对要发布到 master 的其他分支运行此操作。因此,您可以用 s 分隔所有这些命令&&,用参数替换测试,用第二个参数变量掌握并为其别名:
git config alias.smart-merge '...'
Run Code Online (Sandbox Code Playgroud)
这样您就可以像这样发布更改:
git smart-merge testing master
git smart-merge feature2 master
Run Code Online (Sandbox Code Playgroud)
这应该为您提供测试和功能2,无论这两个功能在哪个点可能已经合并在历史中。
还要考虑启用 rerere,因为脚本预计不会发生冲突。因此,如果您确实想发布,可以先定期进行变基,记录冲突解决方案。现在,您可以更改脚本以利用这些优势,而不会因冲突而中断。
Rebase 冲突解决可能会很痛苦。但在这种情况下不行,因为我们只使用 master 来发布。其他分支操作仍然通过常规合并或变基完成。
- 或者 -
重要的是涂抹干净的脚本。查看 progit.org/book 中的 git 属性章节。
希望这有帮助。