2015年8月27日 星期四

在 gitlab 上更新 fork 出來的專案

在 GitLab 的介面上,可以透過 Fork 的功能,把別人的專案建立一個 fork 到自己的帳號底下
例如原始專案的網址是 http://gitlab/userA/project,fork 出來的專案網址會是 http://gitlab/userB/project。
不過原始專案會由原始專案的專案成員繼續更新,而自己 fork 下來的專案則會停在執行 fork 當時的狀況
如果想要跟著原始專案一起更新的話,需要額外做一點小撇步 [1]。


主要更新的方法是參考 [1],大概的概念是說,在自己的本機電腦上,把兩個專案都拉進來,在本地端做合併
合併之後送回自己的 origin(也就是自己建立的 fork),這樣就能達到 fork 的專案也同步更新的目的了。

這裡轉載 [1] 的回應中使用的指令如下:
$ cd github-services
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream

# then: (like "git pull" which is fetch + merge)
$ git merge upstream/master master

# or, better, replay your local work on top of the fetched branch
# like a "git pull --rebase"
$ git rebase upstream/master

簡單描述一下,假設專案名字叫做 github-services,先從 git shell 進入專案的資料夾
然後對這個專案增加一個遠端的 repository,名稱設定為 "upstream"
原本因為專案是從自己的 fork 複製下來的,所以預設會有一個名為 "origin" 的 repository,是指向 gitlab 上自己的 fork
這個指令做完後,遠端 repository 會變成兩個。
接著執行 fetch 指令,下載 upsstream 這個 repository 下來。
然後有兩種選擇,一種是用 merge 指令、另一種是 rebase 指令,其中回答的網友 VonC 是比較建議 rebase。
執行 rebase 會合併 upstream 與本地的 master
合併如果沒有衝突的話,合併結束就可以直接透過 git push 指令送回自己的 fork,以完成 fork 的更新了。

PS. 如果要 rebase 時有衝突,它會提示要一一解決衝突後才能完成 rebase 的動作。

簡要來說,以 rebase 的狀況,實際需要執行的是以下三個指令:
$ git remote add upstream git://github.com/pjhyett/github-services.git
$ git fetch upstream
$ git rebase upstream/master

之後如果在本地的專案沒有重建,因為上述的指令已經建立過 upstream 這個遠端 repository 了
以後還想要再同步一次專案的話,只需要做後面兩個步驟即可:
$ git fetch upstream
$ git rebase upstream/master

參考資料:
  1. Pull new updates from original Github repository into forked Github repository
  2. 連猴子都能懂的 Git 入門指南:7. 使用 rebase 合併

沒有留言: