「譯」如何保持 GitHub Fork 項目同步

如何保持 GitHub Fork 項目同步

原文: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 項目。

有兩種方法使 originupstream 保持同步:cdn

  1. 提交合並建議(PR)給 upstream ,上游項目的做者能在 GitHub 的 Web 界面上操做是否接受你的 PR。固然這一般不多發生,由於一般有成百上千的人克隆了他的項目,他不得不這麼作。(譯者認爲「有用」的PR通常是會被接受的)
  2. upstream 的更新獲取併合併到 local ,而後推送到你的 origin這是最經常使用的方法。

GitHub Fork 項目

什麼是 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 。操做完成後,localorigin 就與upstream 保持同步了。

下述操做,是假設將 localmaster 分支與 originmaster 分支合併。若是合併其餘分支,調整成對應的分支便可。

upstream 獲取更新

命令 git fetchgit 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/masterupstreammaster 分支。(區別本地的 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 pullgit up 永遠不會讓你到一個提示,但願你解決一個合併衝突。

git up 從全部上游分支下載全部最新提交(修剪死分支),並嘗試將本地分支快速轉發到上游分支上的最新提交。若是成功,則沒有本地提交,所以沒有合併衝突的風險。若是存在本地(未刷新)提交,則快進將失敗,從而能夠在執行操做以前查看上游提交。

上傳到 origin

在獲取和合並操做後,本地項目已經和上游項目保持同步。要使遠程項目也保持同步,還得執行以下命令:

$ git push
[...push output...]
複製代碼

至此,這次同步工做完成!

相關文章
相關標籤/搜索