Chinaunix

标题: github使用经验? [打印本页]

作者: _nosay    时间: 2016-08-10 10:02
标题: github使用经验?
情景:
我在github创建一个仓库,并向master分支提交了一份代码,对这份代码感兴趣的人都可以对它进行优化或更深入的开发。

疑问:
1. 只需一个副分支就够了吗?
假设A、B同时开始对该副分支修改,A一天后将自己修改的代码提交到该副分支,B两天后提交时,怎么保证不影响A的提交,更甚至A、B对同一处修改完全相反的情况,应该怎么处理?
还是说为每个有兴趣参与的人创建一个branch,它们只能向自己的branch提交?

2. 怎么限制其他人直接往master分支提交?
作者: _nosay    时间: 2016-08-10 10:44
本帖最后由 _nosay 于 2016-08-10 10:49 编辑

http://www.w2bc.com/Article/76608
http://www.tuicool.com/articles/f2i22iY
http://blog.csdn.net/qq_26296197/article/details/51482336
作者: karma303    时间: 2016-08-10 13:50
本帖最后由 karma303 于 2016-08-11 10:00 编辑

帮顶,我对github也是存在学习障碍。
作者: _nosay    时间: 2016-08-10 14:11
回复 3# karma303

哈哈,Github上关于代码团队协作方式有很多种,有些方式是需要付费使用的,有种免费的是让别人把你的建的仓库fork到他自己的github,然后把修改后的代码pull给你,你再根据情况进行合并。
作者: 剑魂箫心    时间: 2016-08-10 15:35
除非你把他们加入GitHub仓库的collaborator,不然他们没有权限直接向你的仓库提交代码。
比如我想参与你的开发,(这里的情形时你只有master分支,简单点)我首先fork你的项目,这样我就有了一份副本仓库,我clone我自己的副本副本到本地,然后做一些开发,push到我自己的副本仓库里,然后创建一个pull request提交给你,你可以进行code review,如果你觉得我的代码写的可以,你就merge到你的仓库里。
过了一段时间老王又给你贡献了代码,你合并进去了,现在你的仓库比我的新,我还想继续开发的话就再次进入pull request的页面比对出你的仓库和我的仓库的差异,为我自己创建一个pull request,然后合并到我自己的仓库里,这样我的仓库又和你的同步了。我再pull一下我的仓库到本地,继续开发,push上去,创建一个pull request提交给你,你又接受了。
又过了一段时间我又提交了,这次老王慢了,他在我之后,你发现老王的代码跟现在的代码有冲突,于是你否决了老王的pull request。
再过一段时间我和老王又提交了,还是我在前,你又发现了老王有冲突,你觉得总是否决老王有点过意不去,于是你手动解决冲突后把老王的代码也合并进去了。
作者: _nosay    时间: 2016-08-10 15:52
本帖最后由 _nosay 于 2016-08-10 15:57 编辑

回复 5# 剑魂箫心

噢,生动。

还有些疑问:
1. 老王是隔壁的吗?
2. 你和老王同时fork了同一个版本的仓库,都做了很多修改,你比老王先提交,哪怕只先1秒,老王提交时就会出现冲突吧?
3. 如果你和老王确实同一时刻提交,有类似写代码中“锁”的东西吗?用于保证不可能出现同时提交的情况。

作者: 剑魂箫心    时间: 2016-08-10 15:57
本帖最后由 剑魂箫心 于 2016-08-10 16:07 编辑

回复 6# _nosay


老王就在隔壁→_→
提交冲突是这么发生的:
比如原始代码有一行: a=1
我和老王同时clone下来,我的修改是a=2,他的修改是a=3;
你把我的commit合并了,git就知道把代码从a=1改成a=2;
你再去合并老王的修改,git对老王的修改进行解读发现他是从a=1改成a=3,但是现在的代码是a=2啊,于是git 就不知道到底咋办了。于是提示你手动解决冲突

  1. <<<<<<< HEAD
  2. a=2
  3. =======
  4. Creating a new branch is quick AND simple.
  5. a=3
  6. >>>>>>> laowang
复制代码
你可以手一动保留一行删掉另一行。
冲突解决!

我给找了个教程,你看看就懂了:http://www.liaoxuefeng.com/wiki/ ... b570f2cc3c0d1dcf000
作者: 剑魂箫心    时间: 2016-08-10 16:08
新的回复包含链接,需要审核,稍等会儿吧~
作者: 剑魂箫心    时间: 2016-08-10 16:19
本帖最后由 剑魂箫心 于 2016-08-10 16:27 编辑

回复 6# _nosay


隔壁的老王→_→

merge冲突是这么发生的:
例如原始代码有一行: a=1
我和老王同时clone下来,我的修改是a=2,他的修改是a=3;
你把我的commit合并了,git就知道从a=1改成a=2;
你再去合并老王的修改,git对老王的修改进行解读发现他是从a=1改成a=3,但是现在的代码是a=2啊,于是git 就不知道到底咋办了。于是提示你手动解决冲突

  1. <<<<<<< HEAD
  2. a=2
  3. =======
  4. a=3
  5. >>>>>>> laowang
复制代码
你可以手一动保留一行删掉另一行。
冲突解决!
如果是在GitHub合并pull request时出现冲突,可以在网页上直接编辑解决。如果是本地两个分支之间的冲突,git会自动打开文本编辑器让你解决。冲突发生后的提示格式和上面的一样。
(参考链接去掉了,如果需要参考可以百度一下廖雪峰的git教程)

如果是push内容过多,需要耗时很长,那么这段期间内其他人也push的话......我没试过......git应该会保证不出现问题
作者: _nosay    时间: 2016-08-10 16:33
本帖最后由 _nosay 于 2016-08-10 16:42 编辑

回复 8# 剑魂箫心

噢,我之前误解冲突了,我以为修改基于的版本,和github上最新的版本不同,就会冲突。

那现在考虑更具体的情况:
你和老王fork的版本都是1,原作者先合并了你的提交,版本变成2,这时老王也要提交他的修改。

1. 如果老王和你修改的文件不同,那肯定不会冲突吧?那么github要能分析自老王基于的版本1后,他所修改的文件没有变过是吧?
2. 如果老王和你修改的是同一个文件:
          a=1
          b=2
          c=3
   1> 你:“a=1”→“a=2”,老王:“a=1”→“a=3”,你已经说过了,这样会产生冲突;
   2> 你:“a=1”→“a=2”,老王:“b=2”→“b=1”,即修改的不是同一行,并且老王修改“b=2”时,它仍然在第二行,这样会冲突吗?
   3> 你:删除“a=1”,老王:“b=2”→“b=1”,这时“b=2”已经跑到第一行了,会冲突吗?
作者: 剑魂箫心    时间: 2016-08-10 16:51
本帖最后由 剑魂箫心 于 2016-08-10 16:51 编辑

1、是的,没有交集就不会冲突,互不干涉
2、我没太看明白什么意思,修改不同行应该是互不影响的
3、会冲突
判断冲突的标准是这样的:初始,master和dev分支都指向commit1,我在master分支上修改,提交了我的commit2,老王在dev分支上修改,提交了他的commit2,自此,两个分支分道扬镳,这两个commit2是并列关系,如果这两者修改了同一行还修改的不一样,那就会冲突。如果修改的互不相关则这两个分支可以合并,比如我在master上将dev合并过来,则生成了新的commit3,这是个合并的节点。



作者: _nosay    时间: 2016-08-10 17:48
回复 11# 剑魂箫心

哦,这样呀。我的疑问主要集中在不同的人修改同一文件,哪些情况属于冲突的问题,有些特殊情况估计要经过验证才有感觉,知道它怎么处理这些情况,以后用的就会更顺利。

1. 假设文件内容:
行号 内容
1   a=1
2   b=2
3   c=3

如果删除“a=1”,最新的就变成这样:
行号 内容
1   b=2
2   c=3

老王要修改第二行“b=2”为“b=1”,会由于现在第二行不是“b=1”冲突吗?

2. 如果由于当前的“c=3”产生冲突,再假设文件内容:
行号 内容
1   a=1
2   b=2
3   b=2

如果删除“a=1”,最新的就变成这样:
行号 内容
1   b=2
2   b=2

这种情况,老王会不会把第二个“b=2”修改为“b=1”,而不是第一个?
作者: 剑魂箫心    时间: 2016-08-10 18:39
1、首先,当我修改后,老王那边还是三行,所以你设计的情况并不存在。你说的这情况是我修改后更新到主仓库,老王又pull了,然后修改并push。这种情况肯定没有冲突。
2、这。。。c=3是怎么来的。。。如果你觉得文字很难描述,不放建一个仓库试试,印象更深刻(^_^)。
作者: _nosay    时间: 2016-08-10 19:17
回复 13# 剑魂箫心

好的,感谢你
作者: zt_debug    时间: 2016-08-12 22:07
推荐一个学习git的工具:【网址】 learngitbranching.js.org
作者: _nosay    时间: 2016-08-13 13:40
回复 15# zt_debug


   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2