如何处理 gitlab fork pull request 冲突

gitlab提供了git的一个ui界面,但是在处理冲突方面表现的不好,一些复杂场景还需要通过命令行来解决。本文所述即是一例,解决过程记录如下。

问题背景

repo A :http://ip:port/share/adminApi.git

repo B: http://ip:port/esb_dept/adminApi.git

B是从Afork出来的。在实际软件开发过程中,A是框架工程,B是由A派生而出的一个实际项目。

现在A发生了更新,需要将A的变动合并到B中。

正常情况下,通过gitlab,在repo A中新建合并请求到B即可,但由于repo B中有工程师修改了框架代码,导致产生冲突,合并失败。

解决步骤

  • 在本地 B 项目根目录,查看可用的远程仓库。默认情况下,只会有repo B

    1
    2
    3
    [web@localhost esbadminapi]$ git remote -v
    origin http://ip:port/esb_dept/adminApi.git (fetch)
    origin http://ip:port/esb_dept/adminApi.git (push)
  • repo A 添加进来。此时再执行git remote -v应该出现2个仓库

    1
    2
    3
    4
    5
    6
    [web@localhost esbadminapi]$ git remote add upstream http://ip:port/share/adminApi.git
    [web@localhost esbadminapi]$ git remote -v
    origin http://ip:port/esb_dept/adminApi.git (fetch)
    origin http://ip:port/esb_dept/adminApi.git (push)
    upstream http://ip:port/share/adminApi.git (fetch)
    upstream http://ip:port/share/adminApi.git (push)
  • repo A的内容pull到本地

    1
    2
    3
    4
    5
    [web@localhost esbadminapi]$ git fetch upstream
    remote: Counting objects: 76, done.
    remote: Compressing objects: 100% (61/61), done.
    remote: Total 76 (delta 34), reused 1 (delta 0)
    展开对象中: 100% (76/76), 完成.
  • 尝试将repo A 合并到 本地仓库。不出意外的出现冲突

    1
    2
    3
    4
    5
    [web@localhost esbadminapi]$ git merge upstream/master
    自动合并 src/main/resources/properties4mssql2008.sample
    冲突(内容):合并冲突于 src/main/resources/properties4mssql2008.sample
    自动合并 src/main/java/com/winning/adminapi/Application.java
    自动合并失败,修正冲突然后提交修正的结果。
  • IDEA中,根据提示的冲突文件,去处理冲突。IDEA会将冲突的代码段标识出来。

  • 处理完成后,再次执行git merge upstream/master,完成合并。

END