GitHub多人協作簡明教程
本文面向了解git的基本命令但是不熟悉如何使用GitHub進行多人協作開發項目的同學。
為簡單起見,這裏只設定有兩個開發人員,HuanianLi 和 DaxiangLi。他們在GitHub上的地址為:
- HuanianLi: https://github.com/huanianli # host developer
- DaxiangLi: https://github.com/daxiangli # guest developer
HuanianLi將創建一個項目kaiba, 然後邀請DaxiangLi來一起開發。
1. 在GitHub上創建兩個帳號(HuanianLi
1.1 打開GitHub的主頁: https://github.com/
1.2 點擊右上角的Sign up
1.3 跳轉到註冊頁面後,開始Create your personal account,按照要求輸入Username, Email Address, Password, 例如:
1.4 點擊頁面下方的"Create an account"按鈕並按照後續提示完成註冊。
2. 在Linux桌面上創建兩個用戶(huanianli and daxiangli), (這裏以huanianli為例)
2.1 創建用戶huanianli
root@idorax:~# useradd -d /home/huanianli -m -s /bin/bash -c "Huanian Li" huanianli
2.2 對用戶huanianli的git進行設置 (這裏直接編輯文件~/.gitconfig)
huanianli@ThinkCentre:~$ vim ~/.gitconfig huanianli@ThinkCentre:~$ cat -n ~/.gitconfig 1 [user] 2 email = [email protected] 3 name = Huanian Li4 [core] 5 editor = vim 6 [push] 7 default = matching huanianli@ThinkCentre:~$ huanianli@ThinkCentre:~$ git config -l user.email=[email protected] user.name=Huanian Li core.editor=vim push.default=matching huanianli@ThinkCentre:~$
2.3 在huanianli的HOME目錄下創建一個工作空間workspace
huanianli@ThinkCentre:~$ cd ~ huanianli@ThinkCentre:~$ mkdir workspace huanianli@ThinkCentre:~$ ls workspace huanianli@ThinkCentre:~$
3. (Host Developer) HuanianLi在GitHub上創建一個項目kaiba
3.1 登錄HuanianLi的GitHub空間,打開頁面Repositories, e.g.
https://github.com/HuanianLi?tab=repositories
點擊頁面右邊的New按鈕, 進入創建一個新的代碼倉庫的頁面。
點擊"Create repository"完成創建。
3.2 進入HuanianLi的Linux桌面,clone在3.1創建的項目kaiba
huanianli@ThinkCentre:~$ cd workspace huanianli@ThinkCentre:~/workspace$ git clone https://github.com/HuanianLi/kaiba.git Cloning into ‘kaiba‘... warning: You appear to have cloned an empty repository. Checking connectivity... done. huanianli@ThinkCentre:~/workspace$ ls kaiba huanianli@ThinkCentre:~/workspace$ cd kaiba huanianli@ThinkCentre:~/workspace/kaiba$ vi README.md huanianli@ThinkCentre:~/workspace/kaiba$ cat -n README.md 1 kaiba: A sandbox project of Kaiba huanianli@ThinkCentre:~/workspace/kaiba$ huanianli@ThinkCentre:~/workspace/kaiba$ git add README.md huanianli@ThinkCentre:~/workspace/kaiba$ huanianli@ThinkCentre:~/workspace/kaiba$ git commit -m "Initialize the project by adding README.md" [master (root-commit) c0bd2ed] Initialize the project by adding README.md 1 file changed, 1 insertion(+) create mode 100644 README.md huanianli@ThinkCentre:~/workspace/kaiba$ huanianli@ThinkCentre:~/workspace/kaiba$ git log commit c0bd2ed35e10180209726199af422a63a007355f Author: Huanian Li <[email protected]> Date: Wed Jul 25 16:21:43 2018 +0800 Initialize the project by adding README.md huanianli@ThinkCentre:~/workspace/kaiba$ huanianli@ThinkCentre:~/workspace/kaiba$ git branch * master huanianli@ThinkCentre:~/workspace/kaiba$ huanianli@ThinkCentre:~/workspace/kaiba$ git push -u origin master Username for ‘https://github.com‘: HuanianLi Password for ‘https://[email protected]‘: Counting objects: 3, done. Writing objects: 100% (3/3), 273 bytes | 0 bytes/s, done. Total 3 (delta 0), reused 0 (delta 0) To https://github.com/HuanianLi/kaiba.git * [new branch] master -> master Branch master set up to track remote branch master from origin. huanianli@ThinkCentre:~/workspace/kaiba$
在上面的操作中,關鍵的步驟是:
- clone
git clone https://github.com/HuanianLi/kaiba.git
- push
git push -u origin master
註意: 因為是第一次push, ‘-u’ 是必須的。
3.3 一旦完成git push之後,我們就可以瀏覽GitHub上的項目了
4. (Guest Developer) DaxiangLi登錄他的GitHub, 然後進入(Host Developer) HuanianLi的GitHub空間,fork項目kaiba
4.1 DaxiangLi登錄他的GitHub
4.2 進入(Host Developer) HuanianLi的GitHub空間, 點開項目kaiba
註意: 目前的 Fork 為0。
4.3 fork項目kaiba, 直接點Fork按鈕
Fork 結束後, DaxiangLi的GitHub裏就有了項目kaiba
5. (Guest Developer)DaxiangLi貢獻代碼給項目kaiba
5.1 DaxiangLi在他的Linux桌面上clone代碼
daxiangli@ThinkPad:~/workspace$ git clone https://github.com/DaxiangLi/kaiba.git Cloning into ‘kaiba‘... remote: Counting objects: 3, done. remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done. Checking connectivity... done.
兩個問題:
- DaxiangLi 能直接clone HuanianLi的GitHub裏的代碼嗎? A: 能。
- DaxiangLi 能直接clone HuanianLi的GitHub裏的代碼,然後做修改後push回去嗎? A: 不能。
5.2 DaxiangLi新建一個開發分支
daxiangli@ThinkPad:~/workspace/kaiba$ git checkout -b dev Switched to a new branch ‘dev‘
其中, git checkout -b dev 等同於
1 git branch dev 2 git checkout dev
5.3 把HuanianLi的項目添加到DaxiangLi的遠程倉庫
daxiangli@ThinkPad:~/workspace/kaiba$ git remote add upstream https://github.com/HuanianLi/kaiba.git
5.4 將HuanianLi的分支取下來
daxiangli@ThinkPad:~/workspace/kaiba$ git remote update Fetching origin Fetching upstream From https://github.com/HuanianLi/kaiba * [new branch] master -> upstream/master
5.5 將HuanianLi的master分支更新到本地
daxiangli@ThinkPad:~/workspace/kaiba$ git fetch upstream master From https://github.com/HuanianLi/kaiba * branch master -> FETCH_HEAD
5.6 合並HuanianLi的分支到本地(註意:這一步在第一次其實不需要)
daxiangli@ThinkPad:~/workspace/kaiba$ git rebase upstream/master Current branch dev is up to date.
5.7 DaxiangLi添加一個文件並提交commit
daxiangli@ThinkPad:~/workspace/kaiba$ git add foo.py daxiangli@ThinkPad:~/workspace/kaiba$ git commit -m "DaxiangLi: Add foo.py" daxiangli@ThinkPad:~/workspace/kaiba$ git push -u origin dev
5.8 進入DaxiangLi的GitHub, 提交一個PR
Q: 什麽是PR?
A: PR是Pull Request的縮寫,是開發者使用GitHub進行協作的利器。簡單來說,Pull Request是一種機制,讓開發者告訴項目成員一個功能已經完成。一旦feature分支開發完畢,開發者使用GitHub賬號提交一個Pull Request。它告訴所有參與者,他們需要審查代碼,並將代碼並入master分支。Pull Request不只是一個通知,還是一個專註於某個提議功能的討論版面。Pull Request 需要兩個不同的分支或是兩個不同的倉庫, 其工作原理大概是:
- 開發者在他們的本地倉庫中為某個功能創建一個專門的分支;
- 開發者將分支推送到公共的GitHub倉庫;
- 開發者用GitHub發起一個Pull Request;
- 其余的團隊成員審查代碼,討論並且做出修改;
- 項目維護者將這個功能並入官方的倉庫,然後關閉這個Pull Request。
現在點擊Compare & pull request按鈕,就創建一個PR,
點頁面下方的"Create pull request"按鈕即可。 生成的PR看起來是這樣的:
6. (Host Developer) HuanianLi 查看PR並Merge
6.1 HuanianLi查看PR
HuanianLi可能在PR中加入comment, 要求DaxiangLi做相應的修改。 這裏為簡單起見,直接Review通過。
6.2 Huanli 點Merge pull request
到此為止,DaxiangLi成功地給HuanianLi貢獻了一次代碼!! 當然,這次貢獻過程異常簡單,因為未涉及到沖突解決。接下來將介紹更復雜的情況,這才是重點:-)
7. HuanianLi 查看kaiba並刪除無用的commit
7.1 使用git pull更新本地空間
huanianli@ThinkCentre:~/workspace/kaiba$ git pull remote: Counting objects: 4, done. remote: Compressing objects: 100% (4/4), done. remote: Total 4 (delta 0), reused 3 (delta 0), pack-reused 0 Unpacking objects: 100% (4/4), done. From https://github.com/HuanianLi/kaiba c0bd2ed..b8a0b63 master -> origin/master Updating c0bd2ed..b8a0b63 Fast-forward foo.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 foo.py
註意: 在頂端的commit不是我們想要的,需要把它移除掉。
commit b8a0b63d8b18f8466e79284ed6022340ca5a43a8 Merge: c0bd2ed 640f6f6 Author: Huanian Li <41667254[email protected]> Date: Wed Jul 25 18:55:02 2018 +0800 Merge pull request #1 from DaxiangLi/dev DaxiangLi: Add foo.py
7.2 使用git rebase -i移除不需要的commit
huanianli@ThinkCentre:~/workspace/kaiba$ git rebase -i c0bd2ed35e10180209726199af422a63a007355f
Successfully rebased and updated refs/heads/master.
在彈出的交互界面中不做任何修改,直接保存退出即可。
7.3 使用git push --force強制更新遠端的master分支
huanianli@ThinkCentre:~/workspace/kaiba$ git push --force Username for ‘https://github.com‘: HuanianLi Password for ‘https://[email protected]‘: Total 0 (delta 0), reused 0 (delta 0) To https://github.com/HuanianLi/kaiba.git + b8a0b63...640f6f6 master -> master (forced update)
這下清爽啦!!
。。。TBD .....
參考資料:
- Git教程
- A successful Git branching model
- 怎樣在github上協同開發
- GitHub實現多人協同提交代碼並且權限分組管理
GitHub多人協作簡明教程