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



一、做點貢獻

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

1. Fork該倉庫

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

image-20220606054302891

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

image-20220606054543313

2. Clone程式碼並修改

然後把這個倉庫clone下來

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

我新建了一個Student類

image-20220606061553375

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

然後將修改提交

git add .

git commit -m 'add student'

git push origin master

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

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

4. 提交pull requests

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

image-20220606061958093

點擊上圖的pull requests按鈕,可以看到自動做了配置

image-20220606062106874

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

點擊create pull request按鈕:

image-20220606062306787

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

5. 源倉庫審核pull requests

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

image-20220606062421689

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

image-20220606062810735

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

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

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

還是pull requests。

image-20220602075033283

默認是向原倉庫提交修改請求

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

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

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

image-20220602095127386

此時會變成這樣

image-20220602094949393

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

image-20220602095322677

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

image-20220602095519344

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

image-20220602095655148

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

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

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

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

1. 如何Clone指定的標籤

這裡我指定了標籤 v1.0

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

image-20220602070738857

切換到對應的文件夾

cd git-learn

2. 我要添加註釋

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

修改一個文件,例如添加了一個注釋

image-20220602071500974

準備提交修改

image-20220602071742458

提示detached HEAD

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

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

git switch -c tag-v1.0

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

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

image-20220602072106796

按提示操作:

image-20220602072219589

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

image-20220602074549946

3. 程式碼如何更新版本

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

3.1 一次失敗的嘗試

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

image-20220606065110508

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

3.2 通過upstream獲取更新合併

查看現有的remote地址

git remote -v

添加源倉庫地址到upstream

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

再次查看remote地址列表

git remote -v

image-20220606063911591

獲取upstream的數據

git fetch upstream

image-20220606064126658

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

也可以獲取指定的tag

git fetch upstream tag v3.0

合併分支

git merge v3.0

image-20220606064603225

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

Tags: