-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
90 additions
and
118 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,12 @@ | ||
第 28 天:了解 GitHub 的 fork 与 pull request 版控流程 | ||
======================================================================== | ||
# 第 28 天:了解 GitHub 的 fork 与 pull request 版控流程 | ||
|
||
我们知道 Git 仓库并没有什么「权限控制」的概念,因为他是分散式的版本控制系统,当你执行 `git clone` 之后就会把整份拥有完整版本历史的仓库下载回来,接着你就可以在本地离线的进行开发与建立版本,最后再将变更推送到远端仓库。不过,如果我们只有一份远端仓库的话,这代表大家都有权限将变更推送到远端仓库。因此,GitHub 采用了 forks 与 pull request 的流程,让你可以做到基本的权限控制。 | ||
|
||
设定 GitHub 项目的权限控制 - 个人账号 | ||
------------------------------------- | ||
## 设定 GitHub 项目的权限控制 - 个人账号 | ||
|
||
在 GitHub 的个人账户下,并没有什么权限控制的机制,所以只要你授权特定人为协同开发人员 (Collaborators),他就能自由的 Push 与 Pull 项目原始码。 | ||
|
||
我以我之前在 GitHub 上建立的某个项目为例,项目网址:[https://github.com/doggy8088/DataDictionaryCreator](https://github.com/doggy8088/DataDictionaryCreator) | ||
我以我之前在 GitHub 上建立的某个项目为例,项目网址:<https://github.com/doggy8088/DataDictionaryCreator> | ||
|
||
![image](figures/28/01.png) | ||
|
||
|
@@ -26,11 +24,9 @@ | |
|
||
但由于你没办法设定更细的 Git 远端仓库权限,所以只要被指派的人,就能够存取完整的 Git 远端仓库,大家都能对任意分支进行推送 (Push)、拉取 (Pull) 或删除分支等动作,要是团队遇上天兵,那可能会是场灾难。 | ||
|
||
## 设定 GitHub 项目的权限控制 - 组织账号 | ||
|
||
设定 GitHub 项目的权限控制 - 组织账号 | ||
------------------------------------- | ||
|
||
在 GitHub 的组织账户下,就可以设定人员群组(Teams),你就可以在群组上设定更细的权限,其中包括三种权限: | ||
在 GitHub 的组织账户下,就可以设定人员群组 (Teams),你就可以在群组上设定更细的权限,其中包括三种权限: | ||
|
||
* Pull Only (唯读) | ||
* Push & Pull (可读可写) | ||
|
@@ -58,15 +54,13 @@ | |
|
||
![image](figures/28/12.png) | ||
|
||
|
||
使用 Fork 功能 | ||
--------------- | ||
## 使用 Fork 功能 | ||
|
||
英文的 Fork 字面翻译是「叉子」的意思,就好像你刀叉去把食物「叉」起来一样,直接把菜挪放到你自己的盘子里,我比喻的「菜」就是你要复制的 GitHub 项目,而「盘子」就是你的 GitHub 账号。 | ||
|
||
注:老外用刀叉比较多,如果 GitHub 是台湾发展的,这个单字可能会是 Chopsticks (筷子),哈! XD | ||
|
||
现在我们以 [https://github.com/doggy8088/DataDictionaryCreator](https://github.com/doggy8088/DataDictionaryCreator) 为例,这个项目,你当然没有「写入」权限,只有「唯读」而已。 | ||
现在我们以 <https://github.com/doggy8088/DataDictionaryCreator> 为例,这个项目,你当然没有「写入」权限,只有「唯读」而已。 | ||
|
||
我现在登入另外一个 GitHub 账号 ( `LearnGitForks` ),然后将该项目「叉」到这个账户自己 GitHub 账号下: | ||
|
||
|
@@ -84,57 +78,57 @@ | |
|
||
因为 Git 是个分布式版本控制系统,只要你有 fetch 的权限,基本上就可以抓到该版本库的完整版本变更历程。 | ||
|
||
## 使用 Fork 过的 Git 远端仓库 | ||
|
||
使用 Fork 过的 Git 远端仓库 | ||
------------------------------- | ||
|
||
在版本控制方面,使用上几乎跟用自己的 Git 远端仓库没什么两样,而且你也有完整的历史记录。请记得这份资料是从 [https://github.com/doggy8088/DataDictionaryCreator](https://github.com/doggy8088/DataDictionaryCreator) 复制过来的就好。 | ||
在版本控制方面,使用上几乎跟用自己的 Git 远端仓库没什么两样,而且你也有完整的历史记录。请记得这份资料是从 <https://github.com/doggy8088/DataDictionaryCreator> 复制过来的就好。 | ||
|
||
我们先取得远端仓库回来: | ||
|
||
C:\>git clone [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
Cloning into 'DataDictionaryCreator'... | ||
remote: Counting objects: 57, done. | ||
remote: Compressing objects: 100% (45/45), done. | ||
Receiving objects: 71% (41/57), 36.00 KiB | 42.00 KiB/s | ||
Receiving objects: 100% (57/57), 94.08 KiB | 42.00 KiB/s, done. | ||
Resolving deltas: 100% (12/12), done. | ||
``` | ||
C:\>git clone [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
Cloning into 'DataDictionaryCreator'... | ||
remote: Counting objects: 57, done. | ||
remote: Compressing objects: 100% (45/45), done. | ||
Receiving objects: 71% (41/57), 36.00 KiB | 42.00 KiB/s | ||
Receiving objects: 100% (57/57), 94.08 KiB | 42.00 KiB/s, done. | ||
Resolving deltas: 100% (12/12), done. | ||
C:\>cd DataDictionaryCreator | ||
C:\>cd DataDictionaryCreator | ||
C:\DataDictionaryCreator> | ||
C:\DataDictionaryCreator> | ||
``` | ||
|
||
然后我们建立起一个版本,然后把变更推送回去: | ||
|
||
C:\DataDictionaryCreator>echo TEST > test.md | ||
|
||
C:\DataDictionaryCreator>git add . | ||
``` | ||
C:\DataDictionaryCreator>echo TEST > test.md | ||
C:\DataDictionaryCreator>git commit -m "Add a test.md for test purpose" | ||
[master b2004b0] Add a test.md for test purpose | ||
1 file changed, 1 insertion(+) | ||
create mode 100644 test.md | ||
C:\DataDictionaryCreator>git add . | ||
C:\DataDictionaryCreator>git push | ||
Counting objects: 4, done. | ||
Delta compression using up to 8 threads. | ||
Compressing objects: 100% (2/2), done. | ||
Writing objects: 100% (3/3), 285 bytes | 0 bytes/s, done. | ||
Total 3 (delta 1), reused 0 (delta 0) | ||
To [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
c29aaab..b2004b0 master -> master | ||
C:\DataDictionaryCreator>git commit -m "Add a test.md for test purpose" | ||
[master b2004b0] Add a test.md for test purpose | ||
1 file changed, 1 insertion(+) | ||
create mode 100644 test.md | ||
C:\DataDictionaryCreator> | ||
C:\DataDictionaryCreator>git push | ||
Counting objects: 4, done. | ||
Delta compression using up to 8 threads. | ||
Compressing objects: 100% (2/2), done. | ||
Writing objects: 100% (3/3), 285 bytes | 0 bytes/s, done. | ||
Total 3 (delta 1), reused 0 (delta 0) | ||
To [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
c29aaab..b2004b0 master -> master | ||
C:\DataDictionaryCreator> | ||
``` | ||
|
||
使用 pull request 将变更合并回当初的 GitHub 项目 | ||
-------------------------------------------------- | ||
## 使用 pull request 将变更合并回当初的 GitHub 项目 | ||
|
||
刚刚我们用 `LearnGitForks` 身分,把项目从 `doggy8088` 这边 Fork 回来,然后用 `LearnGitForks` 的身分 `git clone` 回本地端,建立版本后再用 `git push` 推回 GitHub 的 `LearnGitForks` 下。 | ||
|
||
现在我们要把储存在 `LearnGitForks` 账号下的 `DataDictionaryCreator` 项目「合并」回 `doggy8088` 账号下的 `DataDictionaryCreator` 项目,这时因为是跨账号的,所以必须利用 `pull request` 才能把变更「合并」回去。 | ||
|
||
注:这里的 pull request 照字面翻译是「拉取要求」的意思,代表要以 `LearnGitForks` 的身分,请 `doggy8088` 把我的变更给拉回去 (`git pull`),但你不能强迫对方拉(`pull`),所以必须拜託(`request`)对方拉,所以才叫做 pull request。 | ||
注:这里的 pull request 照字面翻译是「拉取要求」的意思,代表要以 `LearnGitForks` 的身分,请 `doggy8088` 把我的变更给拉回去 (`git pull`),但你不能强迫对方拉 (`pull`),所以必须拜託 (`request`) 对方拉,所以才叫做 pull request。 | ||
|
||
这时,你要用 `LearnGitForks` 的身分,连到 `https://github.com/doggy8088/DataDictionaryCreator` 这一页,然后点选 **Pull Requests** 页签: | ||
|
||
|
@@ -160,12 +154,11 @@ | |
|
||
![image](figures/28/21.png) | ||
|
||
**注** Github for Mac;Github for Windows 已增加pull request功能 | ||
**注** Github for Mac;Github for Windows 已增加 pull request 功能 | ||
|
||
![image](figures/28/22.gif) | ||
|
||
接受 pull request 的要求,确认合并回自己的 GitHub 项目 | ||
------------------------------------------------------ | ||
## 接受 pull request 的要求,确认合并回自己的 GitHub 项目 | ||
|
||
最后一个步骤,则是让原作者 ( `doggy8088` ) 去看有谁传送了一个 pull request 给自己。 | ||
|
||
|
@@ -181,29 +174,22 @@ | |
|
||
![image](figures/28/25.png) | ||
|
||
|
||
今日小结 | ||
------- | ||
## 今日小结 | ||
|
||
做到这里,你应该大致能够了解为什么会有 fork 与 pull request 的存在,最主要的就是「权限」以及「版本库隔离」的需求。一个上千人的项目 (`Linux Kernel`),如果所有人都能存取主要的远端仓库,那不是很恐怖吗! | ||
|
||
不过在一般企业里,你不一定要这样做,毕竟操作的步骤确实繁琐了些。实际要怎么用,就要靠你自己判断了。 | ||
|
||
|
||
参考连结 | ||
------- | ||
## 参考连结 | ||
|
||
* [Fork A Repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo) | ||
* [Using Pull Requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) | ||
* [Fork a Repo, Compare Code, and Create a Pull Request](https://confluence.atlassian.com/bitbucketserver/forks-776639958.html) | ||
* [Forks and Pull Requests in GitHub](https://www.chronicle.com/blogs/profhacker/forks-and-pull-requests-in-github) | ||
|
||
--- | ||
|
||
------- | ||
* [回目录](README.md) | ||
* [前一天:通过分支在同一个远端仓库中进行版控](27.md) | ||
* [下一天:如何将 Subversion 项目汇入到 Git 仓库](29.md) | ||
|
||
------- | ||
|
||
|
||
--- |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,14 +1,12 @@ | ||
第 28 天:了解 GitHub 的 fork 與 pull request 版控流程 | ||
======================================================================== | ||
# 第 28 天:了解 GitHub 的 fork 與 pull request 版控流程 | ||
|
||
我們知道 Git 儲存庫並沒有什麼「權限控管」的概念,因為他是分散式的版本控管系統,當你執行 `git clone` 之後就會把整份擁有完整版本歷史的儲存庫下載回來,接著你就可以在本地離線的進行開發與建立版本,最後再將變更推送到遠端儲存庫。不過,如果我們只有一份遠端儲存庫的話,這代表大家都有權限將變更推送到遠端儲存庫。因此,GitHub 採用了 forks 與 pull request 的流程,讓你可以做到基本的權限控管。 | ||
|
||
設定 GitHub 專案的權限控管 - 個人帳號 | ||
------------------------------------- | ||
## 設定 GitHub 專案的權限控管 - 個人帳號 | ||
|
||
在 GitHub 的個人帳戶下,並沒有甚麼權限控管的機制,所以只要你授權特定人為協同開發人員 (Collaborators),他就能自由的 Push 與 Pull 專案原始碼。 | ||
|
||
我以我之前在 GitHub 上建立的某個專案為例,專案網址:[https://github.com/doggy8088/DataDictionaryCreator](https://github.com/doggy8088/DataDictionaryCreator) | ||
我以我之前在 GitHub 上建立的某個專案為例,專案網址:<https://github.com/doggy8088/DataDictionaryCreator> | ||
|
||
![image](figures/28/01.png) | ||
|
||
|
@@ -26,11 +24,9 @@ | |
|
||
但由於你沒辦法設定更細的 Git 遠端儲存庫權限,所以只要被指派的人,就能夠存取完整的 Git 遠端儲存庫,大家都能對任意分支進行推送 (Push)、拉取 (Pull) 或刪除分支等動作,要是團隊遇上天兵,那可能會是場災難。 | ||
|
||
## 設定 GitHub 專案的權限控管 - 組織帳號 | ||
|
||
設定 GitHub 專案的權限控管 - 組織帳號 | ||
------------------------------------- | ||
|
||
在 GitHub 的組織帳戶下,就可以設定人員群組(Teams),你就可以在群組上設定更細的權限,其中包括三種權限: | ||
在 GitHub 的組織帳戶下,就可以設定人員群組 (Teams),你就可以在群組上設定更細的權限,其中包括三種權限: | ||
|
||
* Pull Only (唯讀) | ||
* Push & Pull (可讀可寫) | ||
|
@@ -58,15 +54,13 @@ | |
|
||
![image](figures/28/12.png) | ||
|
||
|
||
使用 Fork 功能 | ||
--------------- | ||
## 使用 Fork 功能 | ||
|
||
英文的 Fork 字面翻譯是「叉子」的意思,就好像你刀叉去把食物「叉」起來一樣,直接把菜挪放到你自己的盤子裡,我比喻的「菜」就是你要複製的 GitHub 專案,而「盤子」就是你的 GitHub 帳號。 | ||
|
||
註:老外用刀叉比較多,如果 GitHub 是台灣發展的,這個單字可能會是 Chopsticks (筷子),哈! XD | ||
|
||
現在我們以 [https://github.com/doggy8088/DataDictionaryCreator](https://github.com/doggy8088/DataDictionaryCreator) 為例,這個專案,你當然沒有「寫入」權限,只有「唯讀」而已。 | ||
現在我們以 <https://github.com/doggy8088/DataDictionaryCreator> 為例,這個專案,你當然沒有「寫入」權限,只有「唯讀」而已。 | ||
|
||
我現在登入另外一個 GitHub 帳號 ( `LearnGitForks` ),然後將該專案「叉」到這個帳戶自己 GitHub 帳號下: | ||
|
||
|
@@ -84,57 +78,57 @@ | |
|
||
因為 Git 是個分散式版本控管系統,只要你有 fetch 的權限,基本上就可以抓到該版本庫的完整版本變更歷程。 | ||
|
||
## 使用 Fork 過的 Git 遠端儲存庫 | ||
|
||
使用 Fork 過的 Git 遠端儲存庫 | ||
------------------------------- | ||
|
||
在版本控管方面,使用上幾乎跟用自己的 Git 遠端儲存庫沒什麼兩樣,而且你也有完整的歷史紀錄。請記得這份資料是從 [https://github.com/doggy8088/DataDictionaryCreator](https://github.com/doggy8088/DataDictionaryCreator) 複製過來的就好。 | ||
在版本控管方面,使用上幾乎跟用自己的 Git 遠端儲存庫沒什麼兩樣,而且你也有完整的歷史紀錄。請記得這份資料是從 <https://github.com/doggy8088/DataDictionaryCreator> 複製過來的就好。 | ||
|
||
我們先取得遠端儲存庫回來: | ||
|
||
C:\>git clone [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
Cloning into 'DataDictionaryCreator'... | ||
remote: Counting objects: 57, done. | ||
remote: Compressing objects: 100% (45/45), done. | ||
Receiving objects: 71% (41/57), 36.00 KiB | 42.00 KiB/s | ||
Receiving objects: 100% (57/57), 94.08 KiB | 42.00 KiB/s, done. | ||
Resolving deltas: 100% (12/12), done. | ||
``` | ||
C:\>git clone [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
Cloning into 'DataDictionaryCreator'... | ||
remote: Counting objects: 57, done. | ||
remote: Compressing objects: 100% (45/45), done. | ||
Receiving objects: 71% (41/57), 36.00 KiB | 42.00 KiB/s | ||
Receiving objects: 100% (57/57), 94.08 KiB | 42.00 KiB/s, done. | ||
Resolving deltas: 100% (12/12), done. | ||
C:\>cd DataDictionaryCreator | ||
C:\>cd DataDictionaryCreator | ||
C:\DataDictionaryCreator> | ||
C:\DataDictionaryCreator> | ||
``` | ||
|
||
然後我們建立起一個版本,然後把變更推送回去: | ||
|
||
C:\DataDictionaryCreator>echo TEST > test.md | ||
|
||
C:\DataDictionaryCreator>git add . | ||
``` | ||
C:\DataDictionaryCreator>echo TEST > test.md | ||
C:\DataDictionaryCreator>git commit -m "Add a test.md for test purpose" | ||
[master b2004b0] Add a test.md for test purpose | ||
1 file changed, 1 insertion(+) | ||
create mode 100644 test.md | ||
C:\DataDictionaryCreator>git add . | ||
C:\DataDictionaryCreator>git push | ||
Counting objects: 4, done. | ||
Delta compression using up to 8 threads. | ||
Compressing objects: 100% (2/2), done. | ||
Writing objects: 100% (3/3), 285 bytes | 0 bytes/s, done. | ||
Total 3 (delta 1), reused 0 (delta 0) | ||
To [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
c29aaab..b2004b0 master -> master | ||
C:\DataDictionaryCreator>git commit -m "Add a test.md for test purpose" | ||
[master b2004b0] Add a test.md for test purpose | ||
1 file changed, 1 insertion(+) | ||
create mode 100644 test.md | ||
C:\DataDictionaryCreator> | ||
C:\DataDictionaryCreator>git push | ||
Counting objects: 4, done. | ||
Delta compression using up to 8 threads. | ||
Compressing objects: 100% (2/2), done. | ||
Writing objects: 100% (3/3), 285 bytes | 0 bytes/s, done. | ||
Total 3 (delta 1), reused 0 (delta 0) | ||
To [email protected]:LearnGitForks/DataDictionaryCreator.git | ||
c29aaab..b2004b0 master -> master | ||
C:\DataDictionaryCreator> | ||
``` | ||
|
||
使用 pull request 將變更合併回當初的 GitHub 專案 | ||
-------------------------------------------------- | ||
## 使用 pull request 將變更合併回當初的 GitHub 專案 | ||
|
||
剛剛我們用 `LearnGitForks` 身分,把專案從 `doggy8088` 這邊 Fork 回來,然後用 `LearnGitForks` 的身分 `git clone` 回本地端,建立版本後再用 `git push` 推回 GitHub 的 `LearnGitForks` 下。 | ||
|
||
現在我們要把儲存在 `LearnGitForks` 帳號下的 `DataDictionaryCreator` 專案「合併」回 `doggy8088` 帳號下的 `DataDictionaryCreator` 專案,這時因為是跨帳號的,所以必須利用 `pull request` 才能把變更「合併」回去。 | ||
|
||
註:這裡的 pull request 照字面翻譯是「拉取要求」的意思,代表要以 `LearnGitForks` 的身分,請 `doggy8088` 把我的變更給拉回去 (`git pull`),但你不能強迫對方拉(`pull`),所以必須拜託(`request`)對方拉,所以才叫做 pull request。 | ||
註:這裡的 pull request 照字面翻譯是「拉取要求」的意思,代表要以 `LearnGitForks` 的身分,請 `doggy8088` 把我的變更給拉回去 (`git pull`),但你不能強迫對方拉 (`pull`),所以必須拜託 (`request`) 對方拉,所以才叫做 pull request。 | ||
|
||
這時,你要用 `LearnGitForks` 的身分,連到 `https://github.com/doggy8088/DataDictionaryCreator` 這一頁,然後點選 **Pull Requests** 頁籤: | ||
|
||
|
@@ -160,12 +154,11 @@ | |
|
||
![image](figures/28/21.png) | ||
|
||
**註** Github for Mac;Github for Windows 已增加pull request功能 | ||
**註** Github for Mac;Github for Windows 已增加 pull request 功能 | ||
|
||
![image](figures/28/22.gif) | ||
|
||
接受 pull request 的要求,確認合併回自己的 GitHub 專案 | ||
------------------------------------------------------ | ||
## 接受 pull request 的要求,確認合併回自己的 GitHub 專案 | ||
|
||
最後一個步驟,則是讓原作者 ( `doggy8088` ) 去看有誰傳送了一個 pull request 給自己。 | ||
|
||
|
@@ -181,29 +174,22 @@ | |
|
||
![image](figures/28/25.png) | ||
|
||
|
||
今日小結 | ||
------- | ||
## 今日小結 | ||
|
||
做到這裡,你應該大致能夠了解為什麼會有 fork 與 pull request 的存在,最主要的就是「權限」以及「版本庫隔離」的需求。一個上千人的專案 (`Linux Kernel`),如果所有人都能存取主要的遠端儲存庫,那不是很恐怖嗎! | ||
|
||
不過在一般企業裡,你不一定要這樣做,畢竟操作的步驟確實繁瑣了些。實際要怎麼用,就要靠你自己判斷了。 | ||
|
||
|
||
參考連結 | ||
------- | ||
## 參考連結 | ||
|
||
* [Fork A Repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo) | ||
* [Using Pull Requests](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-pull-requests) | ||
* [Fork a Repo, Compare Code, and Create a Pull Request](https://confluence.atlassian.com/bitbucketserver/forks-776639958.html) | ||
* [Forks and Pull Requests in GitHub](https://www.chronicle.com/blogs/profhacker/forks-and-pull-requests-in-github) | ||
|
||
--- | ||
|
||
------- | ||
* [回目錄](README.md) | ||
* [前一天:透過分支在同一個遠端儲存庫中進行版控](27.md) | ||
* [下一天:如何將 Subversion 專案匯入到 Git 儲存庫](29.md) | ||
|
||
------- | ||
|
||
|
||
--- |