前段时间使用gitlab管理项目,遇到这样的问题,我fork了项目组长建立的项目,其中:
组长项目地址:http://192.168.1.1:8000/LOL/demaxiya.git 或者 git@192.168.1.1:LOL/demaxiya.git。
我的项目地址:http://192.168.1.1:8000/OW/demaxiya.git 或者git@192.168.1.1:LOL/demaxiya.git。
显然这是在服务器上的远程仓库,主分支都是master,使用git clone到本地,做了一部分开发后提交更新到我的远程仓库,然后组长要求我将更新合并到他的项目中,谁知出现了conflict问题,原因是组长也在自己的仓库上提交了更新,必须解决冲突之后才能发出合并请求。同步fork主要参考https://gaohaoyang.github.io/2015/04/12/Syncing-a-fork/,大致跟该同学写的一样,但是我自己又加了处理冲突的过程。
一、同步fork
先查看远程仓库git remote -v,发现只有我自己的,其中origin是地址别名,可随意根据git remote add 地址 命令随意命名
origin git@192.168.1.1:OW/demaxiya.git (fetch)
origin git@192.168.1.1:OW/demaxiya.git (push)
添加组长的仓库,也是我要时刻同步的上游仓库,同样适用命令:
git remote add upstream http://192.168.1.1:8000/LOL/demaxiya.git
从组长仓库fetch分支和提交点,git会自动生成upstream/master
如果现在不在主分支master上使用git checkout master
切换回来,然后执行:
git fetch upstream
这里就会在本地新建一个文件夹upstream,组长的master位于其下。然后使用git merge upstream/master命令,该命令是本地master和该master合并,这时冲突就产生了,显然我们俩各自更改了同一个文件。需要手动同步这个文件。
二、解决冲突
一点点去代码里找不同很麻烦,这里有个很好用的第三方文本比较合并工具meld,事实上Mac自带很多merge tool我会乱说(比如opendiff tortoisemerge emerge vimdiff),可以集成在git里使用,如果你是Linux系统:
$ opt-get install meld
如果你跟我一样是MacOS系统,那就顺便介绍另外一个软件包快速安装工具homebrew,d打开Mac终端,输入如下命令:
/usr/bin/ruby -e "$(curl -fsSL http://raw.githubusercontent.com/Homebrew/install/master/install)"
使用 git config --global merge.tool meld
使它作为git的默认合并工具
remote: Counting objects: 11, done.
63Git Tutorials
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From git.server.com:project
* branch
master -> upstream/master
Auto-merging src/wow.c
CONFLICT (content): Merge conflict in src/wow.c
Automatic merge failed; fix conflicts and then commit the result.
执行git status
命令发现哪些文件做了修改,发现wow1.java和wow2.java有冲突。
$ git mergetool
This message is displayed because 'merge.tool' is not configured.
See 'git mergetool --tool-help' or 'git help config' for more details.
'git mergetool' will now attempt to use one of the following tools:
meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
Merging:
src/wow1.java
src/wow2.java
Normal merge conflict for 'src/wow1.java':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (meld):
//在这里按回车键开始在meld的帮助下解决冲突
Normal merge conflict for 'src/wow2.java':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (meld):
//同上
再次执行git merge upstream/master
获得成功,当然还没有完事,这只是在本地冲突解决了,还得更新到组长的远程master上不是,由于组长的master的权限是protected,因此直接git push
肯定不行,我是登录到项目的gitlab中,使用merge requests发出我的master和他的master合并请求,然后他看到之后觉得没问题接受就行了。
附表是常用的git命令:
以上命令参考http://blog.youkuaiyun.com/wangbaochu/article/details/49470453