1. 程式人生 > >GitHub多人協作簡明教程

GitHub多人協作簡明教程

workspace 註冊頁面 personal clone ali amp inux 開發人員 使用

本文面向了解git的基本命令但是不熟悉如何使用GitHub進行多人協作開發項目的同學。

為簡單起見,這裏只設定有兩個開發人員,HuanianLiDaxiangLi。他們在GitHub上的地址為:

  • HuanianLi: https://github.com/huanianli # host developer
  • DaxiangLi: https://github.com/daxiangli # guest developer

HuanianLi將創建一個項目kaiba, 然後邀請DaxiangLi來一起開發。

1. 在GitHub上創建兩個帳號(HuanianLi

and DaxiangLi),(這裏以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 Li
     
4 [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 需要兩個不同的分支或是兩個不同的倉庫, 其工作原理大概是:

  1. 開發者在他們的本地倉庫中為某個功能創建一個專門的分支;
  2. 開發者將分支推送到公共的GitHub倉庫;
  3. 開發者用GitHub發起一個Pull Request;
  4. 其余的團隊成員審查代碼,討論並且做出修改;
  5. 項目維護者將這個功能並入官方的倉庫,然後關閉這個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多人協作簡明教程