0%

Git采用强制覆盖法合并代码提交

有这样一种场景:

我和同事A合作开发同一个功能模块。我们从 dev 分支分别 checkout 出一个自己的分支来进行开发,完成后再合并到 dev 分支上去进行测试。

可能出现的情况是,我们同时提交代码到 dev 分支上,然后出现了冲突的情况。将自己的分支合并到 dev 分支后,结果在执行 git push 的时候却提交不上去了:

1
2
3
4
5
6
7
8
➜ git push origin dev:dev
To ssh://github.com/example/demo_project
! [rejected] dev -> dev (non-fast-forward)
error: failed to push some refs to 'ssh://github.com/example/demo_project'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

错误信息中提示需要先执行 git pull 拉取最新代码,但执行后发现并没有代码被拉取下来。


遇到这种情况的时候,可以采用强制覆盖法来实现代码的合并提交。

例如我当前的开发分支为 test,测试分支 dev

  1. 拉取远端分支: git pull origin dev:dev

  2. 合并我的开发分支到本地 dev 分支:

1
2
git checkout dev
git merge test
  1. 然后将 dev 提交到远端结果报上面的错误

解决方法:

核心思路是:通过拉取远端的 origin/dev 分支强制覆盖本地的 dev 分支,然后再执行分支合并,最后将本地的 dev 分支提交到远端。

1
2
3
4
5
6
7
git checkout dev

git fetch --all

git reset --hard origin/dev # 这里 dev 要修改为对应的分支名

git pull

这样操作后,会将本地的 dev 分支拉取为远端的最新提交。

然后再执行合并的操作就不会出现冲突的情况了。

1
2
3
git merge test

git push origin dev:dev
如有疑问或需要技术讨论,请留言或发邮件到 service@itfanr.cc