【问题标题】:Always ignore a certain commit on merge in git在 git 中合并时总是忽略某个提交
【发布时间】:2011-09-15 05:10:53
【问题描述】:

我正在使用 git 进行我的第一个项目,但遇到了问题。

repo 包含一个客户端/服务器应用程序。我有一个“master”和“test”分支,目的是 master 始终与部署的相同。

我的问题是代码库中有 3-4 个位置存储了服务器 URL。我想在“测试”分支中更改它,而不是在“主”分支中。当然,问题是每当我想合并回“master”时,git 都想把这个更改放在“master”中。

我可以进行选择性合并并合并所有提交,但有问题的提交除外,但这对于每次合并似乎都很乏味。最好的方法是什么?

我在任何 SCM 中从来没有遇到过这个问题,所以也许我只是把这一切都搞错了。

【问题讨论】:

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


【解决方案1】:

您希望将该更改合并为实际未合并,但将其标记为历史记录。这样您就可以知道从何处获得后续更改。

有几种方法可以做到这一点。一个是

git checkout master
git merge -s ours --no-ff testing
git checkout testing
git merge -s ours --no-ff master

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

现在您有 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

这只是在分支测试中重新设置您在 master 上没有的东西,并使其看起来像一个合并。因为它将它存储为一个合并,所以您可以随后针对您想要发布到 master 的其他分支运行它。所以你可以用&&s 分隔所有这些命令,用一个参数替换测试,用第二个参数变量主控并将它的别名:

git config alias.smart-merge '...'

这样您就可以像这样发布更改:

git smart-merge testing master
git smart-merge feature2 master

这应该给你测试和特性2,不管这两个可能已经在历史中合并了。

还可以考虑启用 rerere,因为脚本不会发生冲突。因此,如果您确实想发布,您可以先进行常规变基,记录冲突解决方案。现在,您可以更改脚本以利用这些优势,而不会因冲突而中断。

Rebase 冲突解决可能会很痛苦。但不是在这种情况下,因为我们只使用 master 来发布。其他分支操作仍然通过常规合并或变基来完成。

-- 或者--

重要的是涂抹干净的脚本。查看 progit.org/book 中的 git 属性章节。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    git cherry-pick 将允许您这样做(尽管您需要选择要合并的提交(并确保您不会忘记任何提交)

    另一种方法是您可以git revert 更改 URL 的提交,合并到 master,然后将其放回您的 master 分支。

    另一种方法是执行git commit --no-commit,然后在提交之前更改文件git add

    另一种可能避免“忘记”它的方法是将这种配置(URL 等)放入单独的文件中,并将该文件添加到 .gitignore...

    我不认为其中任何一个真的很优雅,但它会起作用......

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 2012-01-21
      • 2016-10-10
      • 2017-11-18
      • 1970-01-01
      相关资源
      最近更新 更多