原文:Keeping GitHub Forks in Syncgit
做者:beejjorgensen 發表時間:2018/1/13github
譯者:陳 昌茂 發表時間:2018/8/29bash
(轉載請註明出處)fetch
不少時候,你在 GitHub 上 Fork
了某個上游項目,還但願同步原項目做者在此後所作的變動。ui
雖然用戶很早就提交了 功能提議,但GitHub 到目前爲止還不支持在 Web 界面上的同步操做。遺憾的是,可能之後也不會。spa
這很正常。本文經過命令界面操做,幾條命令能夠就解決項目同步的問題。日誌
爲方便行文,咱們將項目的三個別名介紹以下:code
origin
:表明遠程項目,即 GitHub Fork
項目(克隆自上游項目,即 upstream
)local
表明本地項目,即電腦上的本地項目(克隆自遠程項目)upstream
:表明上游項目,即被 Fork
的 GitHub 項目。有兩種方法使 origin
與 upstream
保持同步:cdn
upstream
,上游項目的做者能在 GitHub 的 Web 界面上操做是否接受你的 PR。固然這一般不多發生,由於一般有成百上千的人克隆了他的項目,他不得不這麼作。(譯者認爲「有用」的PR通常是會被接受的)upstream
的更新獲取併合併到 local
,而後推送到你的 origin
。這是最經常使用的方法。upstream
upstream
是很重要的設置,只需進行一次。blog
upstream
是遠程項目地址的別名,表明一個遠程項目的 URL 地址(相似 DNS 之於 IP 地址,可用 git remote
查看,譯者注)。雖然能夠每次在引用遠程項目的時候都使用完整的 URL 地址,但這是一個痛苦的體驗,因此咱們用「別名」。
如你所見,origin
也是一個遠程項目的別名,在克隆項目的時候 git
命令會自動設置爲被克隆項目 URL 地址。
若是你已經克隆了一個項目,可使用 git remote -v
命令來查看。
$ git clone git@github.com:MyName/My-Forked-Repo.git
[...cloning output...]
$ git remote -v
origin git@github.com:MyName/My-Forked-Repo.git (fetch)
origin git@github.com:MyName/My-Forked-Repo.git (push)
複製代碼
能夠設置多少個遠程項目別名,由於它們僅僅表明一些遠程項目的 URL 地址而已。讓咱們來加一個「引用 」到上游項目,別稱爲 upstream
。
$ git remote add upstream https://github.com/LambdaSchool/Original-Repo.git
$ git remote -v
origin git@github.com:MyName/My-Forked-Repo.git (fetch)
origin git@github.com:MyName/My-Forked-Repo.git (push)
upstream https://github.com/LambdaSchool/Original-Repo.git (fetch)
upstream https://github.com/LambdaSchool/Original-Repo.git (push)
複製代碼
如今能夠看到有2個遠程項目別名。
你可能注意到,遠程項目 URL 地址是 HTTPS 的。這是由於咱們(大概)沒有上游項目的 SSH 訪問權限,但這不要緊,由於咱們只須要讀取權限便可,並不須要寫入權限。
Fork
如上圖所示,咱們把 upstream
的更新獲取併合併到 local
,而後推送到 GitHub 上的 origin
。操做完成後,local
和 origin
就與upstream
保持同步了。
下述操做,是假設將 local
的 master
分支與 origin
的 master
分支合併。若是合併其餘分支,調整成對應的分支便可。
upstream
獲取更新命令 git fetch
與 git pull
功能一致,區別是前者只獲取不合並。
有趣的是:
git pull
便是git fetch
命令和git merge
命令的簡寫。
執行以下命令,從 upstream
獲取更新:
$ git fetch upstream
[...fetch output...]
複製代碼
master
分支與 upstream/master
分支上一步獲取了 upstream
的全部更新。這一步是如何合併這些更新。
1,執行以下命令,查看本地是否已經提交了所有變動。
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working tree clean
複製代碼
若是提示有暫存的變動,請參考這提交以後再繼續。
2,確保切換到本地的 master
分支,由於 master
分支是準備要合併的分支。(*號代表是當前的分支)
$ git checkout master
$ git branch
* master
複製代碼
3,執行合併操做。下述命令中的 upstream/master
指 upstream
的 master
分支。(區別本地的 master
分支)
$ git merge upstream/master
[...merge output...]
複製代碼
注意,若是提示輸入修訂日誌,請輸入「合併分支」或任何其餘內容。(若是是 fast-forward
方式合併,無需輸入修訂日誌)
若是在合併過程當中沒有看到任何衝突提示信息,合併成功,那這會是合併過程當中最開心的時刻。
不然在進行下一步前,先解決合併衝突。限於篇幅本文不涉及 如何解決合併衝突,但那會也不會是世界末日。
一個有用的快捷命令 git up
,如何設置請查閱 git-config 文檔。
up = "!git remote update -p; git merge --ff-only
@{u}
"
使用快捷命令或多或少會令人忘記如何正確的使用 git pull
命令──不像 git pull
,git up
永遠不會讓你到一個提示,但願你解決一個合併衝突。
git up
從全部上游分支下載全部最新提交(修剪死分支),並嘗試將本地分支快速轉發到上游分支上的最新提交。若是成功,則沒有本地提交,所以沒有合併衝突的風險。若是存在本地(未刷新)提交,則快進將失敗,從而能夠在執行操做以前查看上游提交。
origin
在獲取和合並操做後,本地項目已經和上游項目保持同步。要使遠程項目也保持同步,還得執行以下命令:
$ git push
[...push output...]
複製代碼
至此,這次同步工做完成!