使用github的主要目的肯定是為了多人可以進行協(xié)作開發(fā)舒岸,這一部分首先簡單介紹一下git協(xié)作開發(fā)的基礎,下一部分再來深入探討基于分支開發(fā)的模式坪它。
設置協(xié)同開發(fā)人員
在這里我們分別使用兩個用戶來模擬整個開發(fā)的流程骤竹,此處使用ynkonghao和kh121兩個用戶來進行模擬。
首先使用kh121創(chuàng)建一個項目p1往毡,創(chuàng)建時選擇初始化操作蒙揣。創(chuàng)建完畢之后需要做的第一步是把協(xié)作的開發(fā)人員加入到項目中,選擇settings
之后選擇Collaborators
添加合作者开瞭,將ynkonghao這個用戶添加進去
添加完成之后懒震,提示需要等待對方進行驗證。
如果對方打開了通知提醒就會在頁面上有一個提醒的消息惩阶,如果沒有打開通知提醒挎狸,就需要等待郵件提醒
此時選擇接受邀請之后,就可以開始進行協(xié)同開發(fā)断楷。
協(xié)同開發(fā)的基本流程
首先分別用兩個用戶clone網(wǎng)絡中的項目锨匆,首先使用kh121用戶在項目中添加一些內(nèi)容,之后完成提交。
##從遠程工廠克隆p1項目
[root@localhost test]# git clone https://github.com/kh121/p1
Cloning into 'p1'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
[root@localhost test]# cd p1
##創(chuàng)建一個文件夾恐锣,添加一些文件
[root@localhost p1]# mkdir kh121
[root@localhost p1]# cd kh121
[root@localhost kh121]# echo a > a.txt
[root@localhost kh121]# cd ..
##提交版本
[root@localhost p1]# git add .
[root@localhost p1]# git commit -m "kh121 first commit"
[master 829fff8] kh121 first commit
1 file changed, 1 insertion(+)
create mode 100644 kh121/a.txt
##推送到服務器端
[root@localhost p1]# git push
此時查詢一下github上的信息茅主,發(fā)現(xiàn)已經(jīng)完成了一次提交
接著使用另外一個用戶ynkonghao進行一些修改之后提交,注意此時遠程的版本已經(jīng)修改土榴,而ynkonghao這個用戶的本地版本依然沒有獲取到遠程版本的信息诀姚。
E:/study/git_2016/11/p1>git push origin master
To github.com:kh121/p1
! [rejected] master -> master (fetch first)
error: failed to push some refs to 'git@github.com:kh121/p1'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
提示提交失敗,因為遠程的版本和我們自己的版本不一樣玷禽,所以在提交之前需要進行pull操作赫段,先完成本地版本和遠程版本的同步。
E:\study\git_2016\11\p1>git pull ##同步遠程版本
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
From github.com:kh121/p1
17de85d..829fff8 master -> origin/master
Merge made by the 'recursive' strategy.
kh121/a.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 kh121/a.txt
E:\study\git_2016\11\p1>git lg ##通過log可以發(fā)現(xiàn)會下載遠程版本矢赁,并且合并到自己的版本中糯笙,而且遠程的版本是有kh121提交的
* 60d9083 - (HEAD -> master) Merge branch 'master' of github.com:kh121/p1 (4 seconds ago) <ynkonghao>
|\
| * 829fff8 - (origin/master, origin/HEAD) kh121 first commit (23 hours ago) <Your Name>
* | fc0c200 - ynkonghao first commit (23 hours ago) <ynkonghao>
|/
* 17de85d - Initial commit (23 hours ago) <kh121>
執(zhí)行了git pull
之后會從github上下載遠程的版本下來,之后和本地的分支進行合并撩银,接著再通過push
就可以完成提交给涕。
E:\study\git_2016\11\p1>git push origin master
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 672 bytes | 0 bytes/s, done.
Total 7 (delta 0), reused 0 (delta 0)
To github.com:kh121/p1
829fff8..60d9083 master -> master
此時另外一個用戶如果希望提交他的版本,同樣也需要進行pull操作额获,所以在實際的應用中够庙,我們每一次push操作都需要先進行pull,從遠程倉庫把數(shù)據(jù)拉取下來抄邀。這個操作其實和svn類似耘眨,在commit之前需要進行update。同樣也無法避免沖突問題撤摸。
遠程協(xié)作的沖突問題
原則上每個用戶都應該只負責自己的模板毅桃,這樣盡可能避免沖突,但在實際的開發(fā)中依然無法完全避免沖突准夷,接下來演示一下沖突的情況,首先讓兩個用戶的版本都同步
目前兩個用戶的版本完全一致莺掠,此時在kh121用戶中衫嵌,修改common文件夾中的文件內(nèi)容。
[root@localhost p1]# cd common
[root@localhost common]# ls
a.txt
[root@localhost common]# echo aaa >> a.txt ##添加一些內(nèi)容到a.txt中
[root@localhost common]# cd ..
[root@localhost p1]# git add .
[root@localhost p1]# git commit -m "common update by kh121"
[master b374a56] common update by kh121
1 file changed, 1 insertion(+)
[root@localhost p1]# git push origin maste
此時讓ynkonghao的文件夾同樣也修改common中的a.txt彻秆,然后進行pull楔绞,這里故意讓a.txt的相同位置進行了修改,所以就會出現(xiàn)沖突
E:\study\git_2016\11\p1\common>echo aa >> a.txt
E:\study\git_2016\11\p1\common>more a.txt ###在相同的位置進行了修改
a
aa
###完成了提交操作
E:\study\git_2016\11\p1\common>cd ..
E:\study\git_2016\11\p1>git add .
E:\study\git_2016\11\p1>git commit -m "update common by ynkonghao"
[master 46bde5f] update common by ynkonghao
2 files changed, 2 insertions(+)
create mode 100644 a.txt
create mode 100644 common/a.txt
###進行了pull操作之后唇兑,發(fā)現(xiàn)了沖突
E:\study\git_2016\11\p1>git pull
Auto-merging common/a.txt
CONFLICT (add/add): Merge conflict in common/a.txt
Automatic merge failed; fix conflicts and then commit the result.
E:\study\git_2016\11\p1>cd common
###顯示了aa這兩個字符是在本地的header版本中編寫的酒朵,而aaa是在id為b374xx的版本中編寫的。
E:\study\git_2016\11\p1\common>more a.txt
a
<<<<<<< HEAD
aa
=======
aaa
>>>>>>> b374a565af1a1287394a2e079ae2e0708719e168
這種沖突問題就得由開發(fā)人員手動解決扎附,整個流程和svn基本類似蔫耽,如果僅僅只是按照上述的開發(fā)進行版本管理,在一個容易協(xié)調(diào)的團隊中是沒有問題的留夜,但是如果在互聯(lián)網(wǎng)中就會感覺版本稍微有些混亂匙铡,此時利用好分支模型就比較的重要图甜,下一部分將會詳細講解基于分支模型的開發(fā)。
這部分的內(nèi)容講解了如何進行協(xié)作開發(fā)鳖眼,并且分析了協(xié)作開發(fā)的流程黑毅,整個流程和svn類似,都是在push之前進行pull操作钦讳。