Git的一大优点就是可以整合全世界的开发人员,当然在公司内部,使用Git多是作为版本管理工具,作为团队内协作并行开发的工作,而Git的另外一个极为大的应用,便是跨团队协作,一种可能的情形是单位内的代码在开发某项功能时,对于某个问题并不擅长,因此此时可以求助于网络上的众多开发人员,但把项目托关于开源服务器上之后,又不能让陌生的开发者随意提交,因此在开发人员提交之后,需要有一个审核的过程,这便是fork-pull requet-merge的工作流程。
1, GitHub账户 yanchenmochen
2, GitHub账户 yanchenxiaosa
首先第三方账户要fork一份现有库的代码。
退出当前账号,使用不在团队内的github账户登录github。输入拷贝的网址,选择Fork
点击Fork,弹出如下界面,表示正在拷贝项目
之后弹出的界面为:
注意:箭头指示的地方表示yanchenxiaosa现在是当前项目的所有者,而该项目是由yanchenmochen/huashan 使用fork操作生成的。下方表明了fork的来源。
至此Fork项目完成
由于git clone是读操作,因此不需要输入用户名和密码进行验证。
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east
$ git clone https://github.com/yanchenxiaosa/huashan.git
Cloning into 'huashan'...
remote: Counting objects: 9, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 9 (delta 0), reused 9 (delta 0), pack-reused 0
Unpacking objects: 100% (9/9), done.
yanchenxiaosa账户克隆了自己的一般代码,由于该项目从yanchenmochen/huashan fork而来,因此完全一样的。直接使用git clone,yanchenxiaosa即可获取一套本地库代码。
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ vim huashanjianfa.txt
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ ls
apple.txt huashanjianfa.txt
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: huashanjianfa.txt
no changes added to commit (use "git add" and/or "git commit -a")
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git add huashanjianfa.txt
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD ..." to unstage)
modified: huashanjianfa.txt
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git commit -m "kuihua"
[master 2df164d] kuihua
1 file changed, 1 insertion(+)
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git remote -v
origin https://github.com/yanchenxiaosa/huashan.git (fetch)
origin https://github.com/yanchenxiaosa/huashan.git (push)
上述的代码片段表示yanchenxiaosa在自己的开发机环境提交了一份代码。
推送到远端之前,需要在本地项目配置自己的用户名和邮箱信息,这里使用git config命令,不加—global表示这个配置仅在当前项目生效。
注意:上述yanchenxiaosa账户在自己的电脑上开发,修改,commit表名该fork的项目为自己独有的,与原来的项目是完全并行的。
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git config user.name yanchenxiaosa
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git config user.name [email protected]
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ cat .git/config
[core]
repositoryformatversion = 0
filemode = false
bare = false
logallrefupdates = true
symlinks = false
ignorecase = true
[remote "origin"]
url = https://github.com/yanchenxiaosa/huashan.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = [email protected]
此时把yanchenxiaosa的这次提交推送到远端
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 426 bytes | 426.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/yanchenxiaosa/huashan.git
! [remote rejected] master -> master (permission denied)
error: failed to push some refs to 'https://github.com/yanchenxiaosa/huashan.git'
报错原因是因为win8系统的凭据管理器自动保存了之前github账户yanchenmochen的用户名和密码信息,使用Win+r –>控制面板->用户账户和家庭安全->凭据管理器中删去为github网站保存的凭据。
注意:由于自己是在一个电脑上模拟fork,pull request等完整的过程,因此会存在凭据管理器自动保存某个git hub凭据的问题。
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 426 bytes | 426.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/yanchenxiaosa/huashan.git
! [remote rejected] master -> master (permission denied)
error: failed to push some refs to 'https://github.com/yanchenxiaosa/huashan.git'
尴尬,刚才删去的是Web凭据,好像应该删去Windows 凭据,删掉再次运行。
$ git push origin master
正常弹出登录界面,输入yanchenxiaosa的用户名和密码:
全恒@Lenovo-PC MINGW64 /d/Git/huashan_east/huashan (master)
$ git push origin master
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 8 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 426 bytes | 213.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/yanchenxiaosa/huashan.git
299ac0b..2df164d master -> master
再观察凭据管理器,重新产生了一个凭据
而以yanchenxiaosa账户登录github,可以看到这次新的提交:
fork的含义是fork别人的项目为自己所有,相当于你克隆了一份一模一样的项目,但项目的所属人为自己,因此之后自己可以随意的进行修改,提交,fork之前的提交与原有项目保持一致,而之后的提交自己可以自由发挥。
Fork
本地修改,然后推送到远程
Pull request
审核。
进入,可以看到直接跳转到了yanchenmochen/huashan项目了
可以看到点击Create pull request会弹出如下界面,表示创建pull-request已经成功了。
此时使用yanchenmochen账户登录github,进入yanchenmochen/huashan项目,可以看到Pull request数字为1,点击进去
点击进去
项目所属人对团队外提交的代码提出质疑
yanchenmochen对yanchenxiaosa提交的代码发出疑问,从这里看,github也是个聊天的地方。使用yanchenxiaosa再次登陆即可看到聊天记录。
再次以yanchenmochen的账户登录,可以看到信息。其中Merge pull request表示merge操作。
点击Merge pull request。
出现结果:
再次删掉凭据,进入huashan目录,此时yanchenmochen开发环境本地库并没有这次yanchenxiaosa所做的提交。
$ git pull origin master
remote: Counting objects: 7, done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 7 (delta 0), reused 6 (delta 0), pack-reused 0
Unpacking objects: 100% (7/7), done.
From https://github.com/yanchenmochen/huashan
* branch master -> FETCH_HEAD
299ac0b..e272901 master -> origin/master
Updating 299ac0b..e272901
Fast-forward
apple.txt | 3 ++-
huashanjianfa.txt | 1 +
2 files changed, 3 insertions(+), 1 deletion(-)
全恒@Lenovo-PC MINGW64 /d/Git/huashanlunjian (master)
$ cat apple.txt
This an apple
edited by yanchenxiaosa
至此,整个跨团队协作的流程走完。
使用Git进行团队内开发或者团队外协作开发,熟悉开发过程的流程,了解基本过程,对于熟练使用Git非常有必要。
本文档参考尚硅谷Git&GitHub教程