赞
踩
我们模拟一下使用git协同工作的场景。
假设原repo的owner是sphblood
贡献者是chunleili
我们首先模拟一次最简单的情况,也就是没有任何冲突的情况。
sphblood创建了一个repo,叫做learnPR,并且创建了一个文件叫做the first file made by sphblood
sphblood就是这个repo的所有者(owner)。只有他有权力对repo进行更改。(请记住这句话)
chunleili则是贡献者(contributor)。他希望给这个repo添加新功能。
所以他就先fork了一下这个repo
建立了一个自己的相同名字的repo(名字也可以不同)。
这个repo是属于chunleili的,chunleili具有这个repo的所有权,他可以任意更改这个repo。
于是他新增了一个文件
因为这个repo是属于他自己的,所以他想干嘛就干嘛。他还可以随意删除第一个文件(但是这种情况我们暂时先不说,我们先看最简单的情况)
在chunleili修改repo的时候,sphblood也没闲着,对原repo也进行了一些修改,增加了一个文件the second file made by sphblood
这个时候,chunleili会发现如下字样
This branch is 1 commit ahead, 1 commit behind sphblood:main.
也就是说,chunleili落后sphblood一个commit(即sphblood增加的那个文件:the second file made by sphblood)
同时超前sphblood一个commit(即chunleili自己增加的那个文件:the second file made by chunleili)
他要做的是:
首先,同步owner文件,直接点syn fork就好了
同步之后sphblood的第二个文件也被并入了forked repo当中。
这一步是把contributor增加的新内容提交给owner审核
然后点击Pull Request ->New Pull Request
再点击create pull request
输入附加的信息之后,就会创建一个PR
原owner会受到一个邮件通知:说有人发出了一个PR,请你去审核一下。
owner打开自己的repo,就会发现有一个open状态的PR
点开之后,owner可以选择允许把这个PR Merge到自己的repo中
然后留下一些消息后confirm即可
contributor收到一封邮件,说PR已经审核通过
这时候再去看PR界面,就会发现 1 closed, 0 open。
至此,我们就完成了一次完整的PR。
首先,什么情况下会发生冲突?
显然两者同时修改了一个文件,并且同时对某一行进行了修改的时候会发生。
具体来讲:
假设owner先建立了一个文件conflicts.txt
然后写入一行文字为
owner’s words
然后contributor fork了这个repo,并在自己forked repo中修改了这行文字为
contributor’s words
然后owner又再次修改了同一个文件,修改为:
owner’s words 222
这时候contributor想要PR,显然就发生了冲突。因为同时有两个人对同一个文件进行了修改(注意是同时,因为此时对于contributor做PR的那个时刻来说,既要接收owner的修改,又要接收contributor自己的修改。假如两者有先后顺序那就不会产生冲突了)。那么就需要对这两行之一进行取舍。解决冲突一般就是删掉contributor更改的部分,然后重新PR。
假设我扮演的是contributor (后面我们都扮演的是这个角色)
首先我在我自己fork的文件夹中对以下文件进行了修改
修改为了
我在我自己forked的repo中进行commit和push,这都是没问题的。
但是想要PR的时候,就出现问题了。
再点击sync fork的时候,github会叫你舍弃自己的那个commit。
开什么玩笑?决不能舍弃!因为你辛辛苦苦写的代码,绝对不能就这么扔了!只要把冲突的那几行修复过来,不就行了吗?
一种办法就是,在自己的forked repo之中解决冲突。
首先把原owner的repo fetch下来,然后把原owner的分支merge到自己的分支上去。
merge的时候会产生冲突。这时候解决冲突。此时冲突就解决了。
你可以直接push给原owner的repo,也可以先push到自己的repo,然后在github上手动点击PR.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。