Skip to content

Commit

Permalink
修正有問題的連結
Browse files Browse the repository at this point in the history
  • Loading branch information
doggy8088 committed Nov 18, 2023
1 parent 6f8bf1d commit fd39171
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 118 deletions.
104 changes: 45 additions & 59 deletions zh-cn/28.md
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)

Expand All @@ -26,11 +24,9 @@

但由于你没办法设定更细的 Git 远端仓库权限,所以只要被指派的人,就能够存取完整的 Git 远端仓库,大家都能对任意分支进行推送 (Push)、拉取 (Pull) 或删除分支等动作,要是团队遇上天兵,那可能会是场灾难。

## 设定 GitHub 项目的权限控制 - 组织账号

设定 GitHub 项目的权限控制 - 组织账号
-------------------------------------

在 GitHub 的组织账户下,就可以设定人员群组(Teams),你就可以在群组上设定更细的权限,其中包括三种权限:
在 GitHub 的组织账户下,就可以设定人员群组 (Teams),你就可以在群组上设定更细的权限,其中包括三种权限:

* Pull Only (唯读)
* Push & Pull (可读可写)
Expand Down Expand Up @@ -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 账号下:

Expand All @@ -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** 页签:

Expand All @@ -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 给自己。

Expand All @@ -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)

-------


---
104 changes: 45 additions & 59 deletions zh-tw/28.md
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)

Expand All @@ -26,11 +24,9 @@

但由於你沒辦法設定更細的 Git 遠端儲存庫權限,所以只要被指派的人,就能夠存取完整的 Git 遠端儲存庫,大家都能對任意分支進行推送 (Push)、拉取 (Pull) 或刪除分支等動作,要是團隊遇上天兵,那可能會是場災難。

## 設定 GitHub 專案的權限控管 - 組織帳號

設定 GitHub 專案的權限控管 - 組織帳號
-------------------------------------

在 GitHub 的組織帳戶下,就可以設定人員群組(Teams),你就可以在群組上設定更細的權限,其中包括三種權限:
在 GitHub 的組織帳戶下,就可以設定人員群組 (Teams),你就可以在群組上設定更細的權限,其中包括三種權限:

* Pull Only (唯讀)
* Push & Pull (可讀可寫)
Expand Down Expand Up @@ -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 帳號下:

Expand All @@ -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** 頁籤:

Expand All @@ -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 給自己。

Expand All @@ -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)

-------


---

0 comments on commit fd39171

Please sign in to comment.