Git 使用遠端倉庫

moduzhang發表於2018-08-29

遠端倉庫

什麼是遠端倉庫

Git 是一個分散式版本控制系統,這意味著不存在一個主資訊倉庫。每位開發者使用的都是倉庫的一個副本。因此,你可以擁有倉庫的一個副本(它包含釋出的 commit 和版本歷史記錄),並且你的朋友也可以擁有相同倉庫的一個副本。每個倉庫包含的資訊與其他副本完全相同,沒有哪一個是主要的。

在此之前,你可能一直使用的都只是本地倉庫。而遠端倉庫與你的本地 Git 倉庫一樣,只是它位於其他地方(github 或其他電腦上)。

訪問遠端倉庫的方式

訪問遠端倉庫的方式有多個:

  • 使用 URL
  • 使用系統檔案的路徑

雖然你也可以在自己的檔案系統上建立遠端倉庫,但這種做法極少見。到目前為止,訪問遠端倉庫的最常見方式是通過位於 Web 上的倉庫的 URL

我們與遠端倉庫互動和控制遠端倉庫的方式,是使用 Git 遠端命令:

$ git remote
  • 可以連線到多個不同的遠端倉庫。
  • 簡寫名是用於指代遠端倉庫位置的名稱。通常該位置為 URL,但也可能是同一臺計算機上的檔案路徑。
  • git remote add 用於新增到新的遠端倉庫的連線。
  • git remote -v 用於檢視遠端倉庫與連線之間的詳細資訊。

為何需要多個遠端倉庫

簡單來說,如果你跟多個開發者合作,那麼你就需要在他們合併到 master 分支之前,在專案中獲取他們在各自的分支上所做的更改。如果你想在決定實施自己的更改前,測試一下他們的更改,則需要這麼做。

新增遠端倉庫

git remote 命令可以讓你管理遠端倉庫和與之互動。

這裡寫圖片描述

git remote 的輸出只是一個單詞 origin。”origin” 一詞稱為”簡寫名”。簡寫名只是遠端倉庫所在位置的簡略表示。簡寫名僅區域性用於當前倉庫(如在你的本地倉庫中)。”origin” 一詞是指代主遠端倉庫的專用名稱。你也可以將它重新命名為別的東西,但通常會被命名為 “origin”。

我們為何關心引用遠端倉庫路徑的簡便性?這是因為,你很快會發現我們將在很多命令中,用到遠端倉庫的路徑。而這時,只使用一個名稱就比使用遠端倉庫的完整路徑簡單多了。

如果你想檢視遠端倉庫的完整路徑,只需使用 -v 選項即可。

在 GitHub 上託管

GitHub 與 Git 非常相似,有時候人們會將 Git 和 GitHub 混淆,認為它們是完全一樣的,而事實上它們大相徑庭。

  • Git 是一個版本控制工具(命令列)
  • GitHub 是一個託管 Git 專案的服務
git remote add origin https://github.com/huabinzhang427/my-travel-plans.git

首先自己在 GitHub 上建立倉庫,然後通過上面的命令,在我的本地倉庫與 GitHub 帳戶上剛建立的遠端倉庫之間建立連線

通過 git clone 克隆的倉庫,無法更改在 GitHub 上的專案,因為它不是該遠端倉庫的所有者。

這裡寫圖片描述

git remote add 用於建立一個 origin 簡寫名,新增了一個遠端倉庫的連結,指向 GitHub 上的專案。
git remote -v 會顯示簡寫名和 URL。

git remote 命令

將更改推送到遠端倉庫

這裡寫圖片描述

我的遠端倉庫的簡寫名為 origin,並且我想推送的 commit 位於 master 分支上。那麼,我要使用以下命令將我的 commit 推送到 GitHub 上的遠端倉庫:

$ git push origin master

git push 命令需要:

  • 你想向其推送 commit 的遠端倉庫的簡寫名
  • 包含你想推送的 commit 的分支名

這裡寫圖片描述

有幾點需要注意:

  • 你可能需要輸入使用者名稱和密碼,這取決於你如何配置 GitHub 的以及使用的遠端 URL 。如果你使用的是 HTTP 版本(而不是 ssh 版本)的遠端倉庫,就需要提供使用者名稱和密碼。如果你配置 GitHub 使用 SSH 協議,並提供過 SSH 密匙,就不需要執行上一步。如果你對使用 SSH 連線 GitHub 感興趣,請參閱使用 SSH 連線 GitHub 文件
  • 如果你要輸入使用者名稱和密碼,使用者名稱會在輸入後顯示出來,但密碼不會顯示。只需繼續輸入密碼,完成後按 Enter 鍵即可。
  • Git 會壓縮檔案使之變小,然後將其推送至遠端倉庫。
  • 這裡建立了一個新分支,在頁面底部可看到 [new branch],後面是 master -> master

這裡寫圖片描述

現在我們輸出中有一個標記 (marker)!該標記為 origin/master,並被稱為跟蹤分支。跟蹤分支的名稱包含遠端倉庫的簡寫名及分支名稱。所以跟蹤分支 origin/master 告訴我們遠端倉庫 origin 有一個 master 分支,指向 commit 5590046(幷包含 5590046 前的所有 commit )。這非常有用,因為這意味著我們可以在本地倉庫跟蹤遠端倉庫的資訊!

需要注意的一點是,這個 origin/master 跟蹤分支並不能實時表現被跟蹤分支在遠端倉庫上的位置。如果我們之外的其他人對遠端倉庫做了更改,我們本地倉庫中的 origin/master 跟蹤分支不會移動。我們必須告訴它檢查更新,它才會移動。

從遠端倉庫拉取修改

這裡寫圖片描述

做出這樣操作的情況是本地倉庫與遠端倉庫的狀態不一致,我們需要同步遠端倉庫的狀態到本地倉庫。

這裡寫圖片描述

本地倉庫中出現的分支實際上在跟蹤遠端倉庫中的一個分支(例如,本地倉庫中的 origin/master 稱為跟蹤分支,因為它在跟蹤遠端倉庫上簡寫名為 “origin” 的 master 分支)。

新增遠端更改

使用 git pull 拉取更改

git push 會同步遠端倉庫與本地倉庫。要執行相反操作(將本地倉庫與遠端倉庫同步),我們需要使用 git pullgit pull 的格式與 git push 的非常相似 - 提供遠端倉庫的簡寫名,以及你要拉取 commit 的分支名稱。

$ git pull origin master

在執行 git pull 時,會發生以下活動:

  • 遠端分支上的 commit 會被複制到本地倉庫。
  • 本地跟蹤分支(origin/master)移到指向最新的 commit。
  • 本地跟蹤分支(origin/master)合併到本地分支(master)。

這裡寫圖片描述

執行 git pull origin master 會檢索 origin 遠端倉庫 master 分支中的 commit。

執行此程式碼時需要注意幾點:

  • 格式與 git push 非常相似 - 要對專案計數、壓縮和打包。
  • 它有一個短語 “fast-forward”,這意味著 Git 進行了快進合併。
  • 它顯示類似於 git log --stat 的資訊,其中顯示更改的檔案以及新增或刪除了多少行。

如果你不想自動將本地分支與跟蹤分支合併,則不應使用 git pull,而是使用另一個命令 git fetch。當遠端倉庫包含你沒有的 commit ,但本地倉庫也包含遠端倉庫所沒有的 commit 時。

注意,可以在 GitHub 上手動新增更改(但不建議這樣做,所以別這樣做)。

Pull 和 Fetch

git fetch 用於從遠端倉庫分支檢索 commit ,但不會在收到這些 commit 之後,自動將本地分支與遠端跟蹤分支合併。

$ git fetch origin master

執行 git fetch 後,會發生以下活動:

  • 遠端分支上的 commit 會複製到本地倉庫
  • 本地跟蹤分支(例如,origin/master)移到指向最新的 commit

需要注意的一點是,本地分支完全不會被改變。你可以將 git fetch 想象成 git pull 它的一半操作,而 git pull 的另一半是合併。

現在的狀況是遠端倉庫上具有本地倉庫沒有的 commit。

這裡寫圖片描述

執行 git fetch origin master,系統將獲取 originmaster 分支上的所有 commit。並移動至 origin/master 跟蹤分支,使其指向這些 commit。

這裡寫圖片描述

就這樣,並沒有讓本地 master 分支移動。如果我們希望本地 master 分支具有 origin/master 中的 commit,則需要進行手動合併(merge)。如果我們位於 master 分之上,則需要執行 git merge origin/master 以更新本地 master 分支。

這裡寫圖片描述

使用 git fetch 而不是 git pull 的一個主要情形是當你的遠端分支和本地分支都擁有對方所沒有的更改時。在這種情況下,你要獲取遠端更改,將它們儲存到本地分支中,然後手動執行合併。最後,你可以將新的合併 commit 推送會遠端倉庫。

本地倉庫落後於遠端倉庫。

這裡寫圖片描述

現在假設我們沒有注意到這一點,然後在本地倉庫做了一次提交。現在我們兩個倉庫,前幾個提交相同,但現在他們的 master 分支指向不同提交。如果我們試著執行 git pull 命令並不起作用。

這裡寫圖片描述

但是我們可以使用 git fetch 在不合並的情況下獲取遠端倉庫的提交。所以如果我們執行 git fetch origin master 命令就會獲取遠端倉庫的提交,並且將 origin/master 指向它們。

這裡寫圖片描述

由於我們在 master 分支上,我們可以執行 git merge origin/master 命令,把遠端做的修改更新到我們的 master 分支上。

這裡寫圖片描述

現在本地倉庫擁有一些遠端倉庫沒有的提交,所以我們需要推送這些提交。在 origin/master 分支上執行 git push 命令將會推送更新後的本地 commit 提交到遠端倉庫。

這裡寫圖片描述

相關文章