← 上一章:與其它開發者的互動 - 使用 Pull Request(PR) 下一章:【狀況題】怎麼刪除遠端的分支? →


【狀況題】怎麼跟上當初 fork 專案的進度?

在上個章節「與其它開發者的互動 - 使用 Pull Request(PR)」介紹了如何發送 Pull Request(PR),但其它人也可能會發送 PR,當原作也收了別人的 PR 之後,該專案的進度就比在你自己帳號底下的進度還要前面了。如果你想要讓你帳號底下這個 Fork 過來的專案跟上原作專案目前的進度,GitHub 網站上目前並沒有提供方便的按鈕功能可以做這件事,但你可以透過以下兩種做法來達成這個目的:

第一招:砍掉重練

這招很簡單,就是把 Fork 過來的專案砍掉,再重新 Fork 一次,這樣保證就會是最新版本。不要笑,雖然這招感覺技術力很低,但這招很好用,完全不需要打任何程式碼或指令就可以完成。我也知道其實不少人會用這個方式在進行同步…

第二招:跟上游同步

比較有技術力一點的做法(其實也是比較正統的做法),就是把原作的專案設定成上游專案,Fetch 回來之後再自己手動合併。

第一步:設定原作的遠端節點

舉例來說,這是 Fork 過來的專案:

$ git remote -v
origin	https://github.com/eddiekao/dummy-git.git (fetch)
origin	https://github.com/eddiekao/dummy-git.git (push)

git remote 指令加上 -v 參數後可以看到更完整的資訊。從這裡可以看得出來目前這個專案只有設定一個遠端節點 origin。接下來我要幫它加上另一個遠端節點,這個遠端節點指的位置就是原作的專案:

$ git remote add dummy-kao https://github.com/kaochenlong/dummy-git.git

其實大部份的資料都會教你使用 upstream 做為原作遠端節點的名字,但為避免大家跟之前在「Push 上傳到 GitHub」章節介紹的 upstream 搞混,所以這裡我故意使用 dummy-kao 做為指向原作的遠端節點。這時候在這個專案應該就有 2 個遠端節點了,一個是原來的 origin,一個是原作的 dummy-kao

$ git remote -v
dummy-kao	https://github.com/kaochenlong/dummy-git.git (fetch)
dummy-kao	https://github.com/kaochenlong/dummy-git.git (push)
origin	https://github.com/eddiekao/dummy-git.git (fetch)
origin	https://github.com/eddiekao/dummy-git.git (push)

第二步:抓取原作專案的內容

接下來,就是使用 Fetch 指令來取得原作專案最新版的內容:

$ git fetch dummy-kao
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 4 (delta 1), reused 3 (delta 1), pack-reused 1
Unpacking objects: 100% (4/4), done.
From https://github.com/kaochenlong/dummy-git
 * [new branch]      features/mailer      -> dummy-kao/features/mailer
 * [new branch]      features/mailer-plus -> dummy-kao/features/mailer-plus
 * [new branch]      features/mailer_pro  -> dummy-kao/features/mailer_pro
 * [new branch]      features/member      -> dummy-kao/features/member
 * [new branch]      master               -> dummy-kao/master

如果忘了 Fetch 指令是做什麼的,請參閱「Pull 下載更新」章節介紹。還記得 Fetch 下來之後,在本地的遠端分支會往前移動嗎?如果想要跟上剛抓下來的這些進度的話,便是使用 Merge 指令(或是要用 Rebase 也可):

$ git merge dummy-kao/master
Updating ac341ae..689b015
Fast-forward
 contact.html | 2 ++
 1 file changed, 2 insertions(+)

這樣一來,你本機的進度就跟原作的是一樣了。

第三步:推回自己的專案

這個步驟要不要做就看你自己決定了,畢竟在你電腦上已經是最新版本了,如果你希望你在 GitHub 上那個 Fork 的專案也跟到最新版,只要推上去就行了:

$ git push origin master
Counting objects: 4, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 596 bytes | 596.00 KiB/s, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
To https://github.com/eddiekao/dummy-git.git
   ac341ae..689b015  master -> master

這樣一來,你電腦裡的專案,以及在 GitHub 上從原作那邊 Fork 過來的專案都會是最新進度了。


← 上一章:與其它開發者的互動 - 使用 Pull Request(PR) 下一章:【狀況題】怎麼刪除遠端的分支? →

Comments