GitHub中Fork來的倉庫如何進行雙向更新

2022-07-20 09:02:34


一、做點貢獻

想對別人的某個倉庫「做點貢獻」怎麼辦?

1. Fork該倉庫

首先Fork該倉庫,本文以git-learn這個倉庫為例

這樣自己的賬號下就會出現這樣一個倉庫

2. Clone程式碼並修改

然後把這個倉庫clone下來

git clone https://github.com/FlyLolo/git-learn.git

我新建了一個Student類

3. 提交修改到自己的倉庫

然後將修改提交

git add .

git commit -m 'add student'

git push origin master

這樣會將修改提交到自己賬號下的git-learn倉庫

那麼如何將修改提交到源倉庫呢?

4. 提交pull requests

如果想將修改提交到源倉庫,需要進行pull requests

點選上圖的pull requests按鈕,可以看到自動做了設定

圖中紅框部分顯示了提交修改的方向,即從自己賬號倉庫的main分支提交到源倉庫的main分支。

點選create pull request按鈕:

點選下面的按鈕提交就可。

5. 源倉庫稽核pull requests

此時源倉庫的作者在源倉庫的pull requests頁面就會看到如下的Merge pull請求

可以對該請求做相應的處理

比如點選Merge pull request同意將修改合併。

二、Fork過來的倉庫如何更新

當一個倉庫被Fork過來之後,它是不會隨著源倉庫更新的,那麼如果想同步源倉庫的更新過來如何操作呢?

還是pull requests。

預設是向原倉庫提交修改請求

[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-q1L0ByGC-1654552184213)(git-tag-update.assets/image-20220602094759603.png)]

我們現在不一樣,想用原倉庫更新fork過來的倉庫

首先修改左側的,改成自己的倉庫

此時會變成這樣

點選圖中的藍字「 compare across forks」,可以看到箭頭兩邊都是自己的倉庫

更改右側的倉庫,最終結果如下圖

已經找到了更新,點選右上角的create pull request 按鈕

更新即可,這樣就完成了main分支的更新。

三、 如何獲取並更新指定Tag

看一下如何通過Fork方式滿足的我原始碼閱讀需求。

首先我想閱讀的是指定版本的原始碼,例如tomcat的10.0.21版本,這需要我去clone它的tag 10.0.21,這樣才能保證版本一致。

1. 如何Clone指定的標籤

這裡我指定了標籤 v1.0

git clone -b v1.0 https://github.com/FlyLolo/git-learn.git

切換到對應的資料夾

cd git-learn

2. 我要新增註釋

我想對部分程式碼進行註釋,並提交到自己的倉庫。(源倉庫估計不會接收這樣的修改請求,自己看就行了)

修改一個檔案,例如新增了一個註釋

準備提交修改

提示detached HEAD

如果是在IDEA中也會提示失敗

其實clone的時候已經有提示,見第一幅圖的紅框提示。需建立並切換到一個新的分支。我將其命名為tag-v1.0

git switch -c tag-v1.0

[外連圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-aIHXykxD-1654552184220)(git-tag-update.assets/image-20220602071921679.png)]

push的時候如果未指定分支會有如下提示:

按提示操作:

提交成功。網頁檢視一下,已經有了新建的分支:

3. 程式碼如何更新版本

如果此時源倉庫更新了v2.0甚至v3.0版本,而我這裡還是v1.0的程式碼怎麼辦?

3.1 一次失敗的嘗試

首先,我想到了第二節的反向pull request, 機智如我

做了如上圖設定,右側選擇了源倉庫的tag v3.0 ,如願的識別出了差異,但此時才發現原來的create pullrequest按鈕沒有了,嘗試失敗。

3.2 通過upstream獲取更新合併

檢視現有的remote地址

git remote -v

新增源倉庫地址到upstream

git remote add upstream https://github.com/Test-2022/git-learn.git

再次檢視remote地址列表

git remote -v

獲取upstream的資料

git fetch upstream

可以看到獲取到了源倉庫的各個分支和tag。

也可以獲取指定的tag

git fetch upstream tag v3.0

合併分支

git merge v3.0

如果像這樣出現合併衝突,自行解決衝突即可。