git | 多人协作
当你从远程仓库克隆时,实际上Git自动把本地的master
分支和远程的master
分支对应起来了,并且,远程仓库的默认名称是origin
。
1.要查看远程库的信息 使用git remote
2.要查看远程库的详细信息 使用git remote –v
上面显示了可以抓取和推送的origin
的地址。如果没有推送权限,就看不到push
的地址。
推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
比如我现在的github上的readme.txt
文件内容如下:
本地是这样的:
这是本地的内容
现在我想把本地更新的readme.txt
代码推送到远程库中,使用命令如下:
$ git push origin master
【这是我出现的问题】
我在push的途中出现问题了,文件有修改冲突
后来在网上查看,修改了两者的冲突之后,用git push -f origin master
强制推送上去。(网上说的其他方法有用过,什么pull
之后fench
之类的,但是不起作用,目前看来直接强推反而起作用了。可能是自己实践不到位)
我们可以看到如上,推送成功,我们可以继续来截图github上的readme.txt
内容 如下:
可以看到推送成功了,如果我们现在要推送到其他分支,比如dev
分支上,我们还是那个命令
git push origin dev
但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?
1.master
分支是主分支,因此要时刻与远程同步;
2.dev
分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
3.bug
分支只用于在本地修复bug
,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug
;
4.feature
分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。
抓取分支
多人协作时,大家都会往master
和dev
分支上推送各自的修改。
现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key
添加到GitHub)或者同一台电脑的另一个目录下克隆,新建一个目录名字叫testgit2:
现在,你的小伙伴要在dev
分支上开发,就必须创建远程origin
的dev
分支到本地,于是他用这个命令创建本地dev
分支:
$ git checkout -b dev origin/dev
完整操作
这是还未push新改的dev分之前的内容
刚刚push之后远程dev分支的内容
小伙伴们已经向origin/dev
分支上推送了提交,而我在我的目录文件下也对同样的文件同个地方作了修改,也试图推送到远程库时,如下:
由上面可知:推送失败,因为我的小伙伴最新提交的和我试图推送的有冲突,解决的办法也很简单,上面已经提示我们,先用git pull
把最新的提交从origin/dev
抓下来,然后在本地合并,解决冲突,再推送。
git pull
也失败了,原因是没有指定本地dev
分支与远程origin/dev
分支的链接,根据提示,设置dev
和origin/dev
的链接:
$ git branch --set-upstream dev origin/dev
这张图是别人的
【这张图是别人的,因为我自己操作的时候,不知道怎么跳转到unix界面去了,导致无法同步了,我重新进去的时候提示我自己的dev
分支能够直接push
。。。(迷)然后我模拟testgit2那边push dev
分支,可能是由于设置过dev
链接的原因,直接pull
成功了,就是告诉有冲突】
上面两图都告知我们merge conflict
有冲突,需要手动解决,解决的方法和分支管理中的解决冲突完全一样。解决后,提交,再push
:
小结
因此,多人协作的工作模式通常是这样:
1.首先,可以试图用 git push origin branch-name
推送自己的修改;
2.如果推送失败,则因为远程分支比你的本地更新早(别人已经先push
上去过了),需要先用git pull
试图合并。
3.如果合并有冲突,则需要解决冲突,并在本地提交(也就是add
+commit
)。没有冲突或者解决掉冲突后,再用git push origin branch-name
推送就能成功!。
4.如果git pull
提示“no tracking information”
,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream branch-name origin/branch-name
。
这就是多人协作的工作模式,一旦熟悉了,就非常简单。
-查看远程库信息,使用git remote -v
;
-本地新建的分支如果不推送到远程,对其他人就是不可见的;
-从本地推送分支,使用git push origin branch-name
,如果推送失败,先用git pull
抓取远程的新提交;
-在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name
,本地和远程分支的名称最好一致;
-建立本地分支和远程分支的关联,使用git branch --set-upstream branch-name origin/branch-name
;
-从远程抓取分支,使用git pull
,如果有冲突,要先处理冲突。