Github程式碼fork之後,如何與原倉庫進行同步?

程式新視界發表於2021-06-02

前言

我們在使用GitHub時,看到好的專案或想給某個專案做貢獻,此時通常會將程式碼倉庫fork到自己的賬號下。如果在此期間,如果源倉庫的程式碼發生了變動,就需要與源倉庫程式碼進行同步。本篇文章就帶大家實操一下,如何實現這一操作。

配置專案的上游倉庫

首先需要大家將fork的倉庫程式碼clone到本地,後面的所有操作都是基於原生程式碼庫來進行操作的。比如,可以通過git clone先將fork的程式碼下載到本地:

git clone git@github.com:secbr/nacos.git
複製程式碼

後續的一步步操作,都是基於本地倉庫來進行操作。

進入到本地倉庫目錄

通過cd操作,進入到clone下來的本地倉庫根目錄:

cd /Users/apple/develop/nacos-request/nacos
複製程式碼

後續的操作無特殊說明,都是在這個本地倉庫的目錄下進行操作。

檢視遠端倉庫路徑

執行命令 git remote -v 檢視遠端倉庫的路徑:

appledeMacBook-Pro-2:nacos apple$ git remote -v
origin  https://github.com/secbr/nacos.git (fetch)
origin  https://github.com/secbr/nacos.git (push)
複製程式碼

如果只顯示2行內容,說明該專案還未設定upstream (中文叫:上游程式碼庫),一般情況下,設定好一次 upstream 後就無需重複設定。通過顯示遠端倉庫的路徑和clone時的路徑對照,會發現,此時遠端倉庫的路徑還是fork專案的路徑。

新增upstream路徑

執行命令 git remote add upstream xxx.git,把fork的源倉庫設定為 upstream 。這裡專案是從alibaba的nacos倉庫fork過來的,因此對應的upstream就是alibaba的源倉庫地址。

執行上述命令,在此執行git remote -v 檢查是否成功。

appledeMacBook-Pro-2:nacos apple$ git remote add upstream https://github.com/alibaba/nacos.git
appledeMacBook-Pro-2:nacos apple$ git remote -v
origin  https://github.com/secbr/nacos.git (fetch)
origin  https://github.com/secbr/nacos.git (push)
upstream        https://github.com/alibaba/nacos.git (fetch)
upstream        https://github.com/alibaba/nacos.git (push)
複製程式碼

通過上面的輸出可以看出,多了兩項upstream的地址,說明新增upstream成功。

檢查原生程式碼狀態

由於我們的例項是直接從倉庫clone下來的,本地還沒有修改程式碼。如果你的本地專案已經修改了一些程式碼,不確定是否提交了程式碼,就需要執行git status來檢查一下。

appledeMacBook-Pro-2:nacos apple$ git status
On branch develop
Your branch is up to date with 'origin/develop'.

nothing to commit, working tree clean
複製程式碼

上面顯示,本地沒有需要提交的(commit)的程式碼。如果本地有修改,需要先從本地倉庫推送到GitHub倉庫。然後,再執行一次 git status 檢查。

對應推送到GitHub倉庫的基本操作步驟如下:

git add -A 或者 git add filename
git commit -m "your note"
git push origin master
git status
複製程式碼

完成上面的基本操作之後,確認程式碼都已經提交,便可以開始執行源倉庫與本地倉庫的merge操作了。

抓取源倉庫的更新

經過上面步驟的準備之後,我們可以進行源倉庫的程式碼更新了。執行命令 git fetch upstream 抓取原倉庫的更新:

appledeMacBook-Pro-2:nacos apple$ git fetch upstream
remote: Enumerating objects: 2646, done.
remote: Counting objects: 100% (2593/2593), done.
remote: Compressing objects: 100% (1157/1157), done.
remote: Total 2646 (delta 731), reused 2404 (delta 682), pack-reused 53
Receiving objects: 100% (2646/2646), 1.67 MiB | 1.47 MiB/s, done.
Resolving deltas: 100% (734/734), completed with 37 local objects.
From https://github.com/alibaba/nacos
 * [new branch]          0.2.1                               -> upstream/0.2.1
 * [new branch]          0.2.2                               -> upstream/0.2.2
 * [new branch]          0.3.0                               -> upstream/0.3.0
//...省略一部分
複製程式碼

執行上述命令之後,上游倉庫的更新(commit)會本儲存為本地的分支,通常名稱為:upstream/BRANCHNAME。比如上面的upstream/0.3.0。

切換分支

完成了上游倉庫分支的拉取之後,先來核查一下本地倉庫當前處於哪個分支,也就是需要更新合併的分支。比如,這裡我需要將develop分支的內容更新到與上游倉庫程式碼一致。則先切換到develop分支:

appledeMacBook-Pro-2:nacos apple$ git checkout develop
Already on 'develop'
Your branch is up to date with 'origin/develop'.
複製程式碼

上面提示已經是develop分支了。

執行合併

執行命令 git merge upstream/develop 合併遠端的develop分支。比如你合併的可能是master,可根據需要將develop的名稱替換成對應的master。

appledeMacBook-Pro-2:nacos apple$ git merge upstream/develop
Removing test/src/test/java/com/alibaba/nacos/test/naming/DeregisterInstance_ITCase.java
// ...省略一部分
Removing naming/src/test/java/com/alibaba/nacos/naming/core/PushServiceTest.java
Auto-merging client/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.java
CONFLICT (content): Merge conflict in client/src/main/java/com/alibaba/nacos/client/naming/remote/http/NamingHttpClientProxy.java
Removing client/src/main/java/com/alibaba/nacos/client/naming/core/HostReactor.java
Removing .editorconfig
Automatic merge failed; fix conflicts and then commit the result.
複製程式碼

執行完上述命令之後,會發現上游程式碼指定分支的修改內容已經反映到原生程式碼了。

上傳程式碼到fork分支

執行完上一步的合併操作之後,往後還有一些後續處理,比如程式碼衝突。如果本地修改了內容,上游倉庫也修改了對應的程式碼,則可能會出現衝突。這時就需要對比程式碼進行修改。本人更習慣使用IDEA中視覺化的外掛進行程式碼衝突解決,你也可以選擇你喜歡的方式進行解決。

解決完衝突之後,就可以執行正常的程式碼add、commit和push操作了。這裡的一系列操作都是針對自己fork的倉庫的,對應操作例項如下:

appledeMacBook-Pro-2:nacos apple$ git add .
appledeMacBook-Pro-2:nacos apple$ git commit -m 'merge from nacos'
[develop 8601c1791] merge from nacos 
appledeMacBook-Pro-2:nacos apple$ git push
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 12 threads
Compressing objects: 100% (2/2), done.
Writing objects: 100% (2/2), 281 bytes | 281.00 KiB/s, done.
Total 2 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/secbr/nacos.git
   76a4dcbb1..8601c1791  develop -> develop
複製程式碼

上述操作,通過add、commit、push一系列操作,將源倉庫中的修改內容,提交到自己fork的分支當中了。此時再檢視自己fork的GitHub倉庫,發現程式碼已經更新。

小結

本篇文章介紹了當我們fork一個倉庫程式碼之後,如何將上游倉庫最新的程式碼與自己倉庫進行同步更新。如果你喜歡fork一些優秀的程式碼,需要在GitHub上為開源專案做貢獻,那麼這個基本的操作必須得了解一下。

博主簡介:《SpringBoot技術內幕》技術圖書作者,酷愛鑽研技術,寫技術乾貨文章。

公眾號:「程式新視界」,博主的公眾號,歡迎關注~

技術交流:請聯絡博主微訊號:zhuan2quan

相關文章