Linux中國

Git 入門:術語基礎

如今,對於任何希望跟蹤他們的變化的人來說,版本控制是一個重要的工具。它對程序員、系統管理員和 網站可靠性工程師 site reliability engineers (SRE)都特別有用。確保可以從錯誤中恢復到已知的良好狀態是一個巨大的勝利,比以前給複製的文件添加 .old 後綴的策略更友好。

但學習 Git 這件事往往被告訴大家「投身開源」的好心同行們過度簡化了。在你還不明白之前,就有人要你給一個從 上游 upstream 變基 rebase 拉取請求 pull request (PR)或 合併請求 merge request (MR),然後他們才能從你的 遠程版本庫 remote 合併 —— 而且一定會刪除 合併提交 merge commits 。無論你想給開源項目做出什麼好的貢獻,當你看到這些你不認識的單詞時,都會覺得難以融入。

![Git 速查表封面圖](/data/attachment/album/202101/08/171207av0lvu3z688ubg8l.jpg "Git Cheat Sheet cover image")

  • 下載 我們的 Git 速查表。

如果你有一兩個月的時間和足夠的好奇心,Git SCM 是你需要學習所有術語的權威來源。但如果你正在尋找來自實踐的總結,請繼續閱讀。

提交就是提醒

對我來說,Git 最難理解的部分是 Git 最簡單的概念:一個 提交 commit 就是一個內容的集合,包括一個關於描述的信息,以及之前的提交。沒有固有的代碼發布策略,甚至沒有內置的明確建議。這個內容甚至不一定是代碼 —— 可以是任何你想添加到版本庫的東西。 提交消息 commit message 會對這些內容進行注釋。

我喜歡把提交信息看作是給未來的自己的禮物:它可能會提到你編輯的文件,但更重要的是它提醒你修改這些文件的意圖。添加更多關於你為什麼編輯這些內容的信息,可以幫助任何使用你的版本庫的人,即使那個人是你。

origin/master 在哪裡?

要知道自己在 Git 項目中的位置,首先把它想成一棵樹。所有 Git 項目都有一個根目錄,類似於文件系統的根目錄。所有的提交都是這個根目錄下的分支。這樣一來,分支只是一個提交的指針。按照慣例,master 是根目錄下默認的分支名稱。(LCTT 譯註:世界變得快,原文發表於 2019 年,而現在有些地方開始用 main 替代這個名字。)

由於 Git 是一個分散式的版本控制系統,同一個代碼庫分布在多個地方,所以人們經常用 版本庫 repository 這個詞來表示同一個項目的所有副本。(LCTT 譯註:「repository」 英文原意是倉庫、存儲庫,在計算機環境中,常用於版本控制、軟體分發等方面,有時候會統一譯作「倉庫」、「存儲庫」。但我們認為,應該根據不同語境採用更有指向性的譯法。在 Git 等版本控制語境中,採用「版本庫」;在軟體分發方面,採用「軟體庫」;其它泛指或不確定的語境中,可採用「倉庫」、「存儲庫」譯法。)有 本地版本庫 local repository ,這是你編輯代碼的地方(稍後會有更多的介紹),還有 遠程版本庫 remote repository ,這是你完成後想把代碼發送到的地方。遠程版本庫可以在任何地方,甚至在你的本地版本庫所在的同一台計算機上,但它們通常託管在 GitLab 或 GitHub 等版本庫服務上。

我在哪裡?

雖然不是官方的賣點,但迷路也是 Git 倉庫的「樂趣」之一。你可以通過這套可靠的命令來找到自己的方向:

  • git branch —— 找到你所在的分支。
  • git log —— 查看你正在進行的提交。
  • git status —— 查看自上次提交以來你所做的編輯。
  • git remote —— 查看你正在跟蹤的遠程倉庫。

用這些命令來定位自己的方向,當你被卡住的時候,會讓你有一種方向感。

我是否已將我的提交暫存或緩存起來?

你電腦上的代碼俗稱為你的 工作空間 workspace 。但不是很明顯的是,當你在 Git 倉庫中時,你還有兩個(是的,兩個!)其他位置: 索引 index 暫存 stash 。當你寫了一些內容,然後添加時,你是把它添加到索引中,也就是準備提交的緩存內容。有的時候,你的索引中的文件還沒有準備好提交,但你想查看另一個分支。這時,暫存就派上用場了。你可以使用 git stash 將索引了但尚未提交的文件存儲到暫存區中。當你準備好取迴文件時,運行 git stash pop 將更改帶回索引中。

下面是一些你需要使用暫存區和緩存區的命令:

  • git diff ...origin/master —— 顯示最近的本地提交和遠程的 origin 版本庫的 master 分支之間的差異。
  • git diff --cached —— 顯示最近的本地提交與添加到本地索引的內容之間的任何差異。
  • git stash —— 將索引的(已添加但未提交的)文件放在暫存區堆棧中。
  • git stash list —— 顯示暫存區堆棧中的變化。
  • git stash pop —— 將最近的變化從暫存庫中刪除。

無頭騎士

Git 裡面有各種比喻。當我想到 HEAD 是哪裡的時候,我就會想到火車線路。如果你最終處於 脫離的 HEAD detached HEAD 模式,就意味著你已經脫離了這個隱喻的軌道。

HEAD 是指向當前簽出分支中最近一次提交的指針。默認的「簽出checkout」是指當你創建一個 Git 倉庫並進入到 master 分支的時候。每次創建或修改到另一個分支時,你都會切換到該分支行。如果你在當前分支的某處進行 git checkout <commit>HEAD 就會移動到該提交。如果沒有提交歷史記錄將你的當前提交連接到已簽出的提交,那麼你將處於脫離的 HEAD 狀態。如果你找不到 HEAD 的位置,你可以隨時用 git reset --hard origin/master 來刪除修改,回到已知狀態。警告:這將刪除你上次推送到 master 後的任何改動。

你是上游還是下游?

你的項目的本地副本被認為是你的本地版本庫,它可能有也可能沒有遠程版本庫 —— 遠程版本庫的副本是用於協作或保存的。也可能還有一個 上游 upstream 版本庫,在那裡,項目的第三個副本由不同的貢獻者託管和維護。

例如,假設我想為 Kubernetes 做貢獻。我會首先將 kubernetes/kubernetes 項目 復刻 fork 到我的賬戶下 mbbroberg/kubernetes。然後我會將我的項目克隆到我的本地工作區。在這種情況下,我的本地克隆是我的本地倉庫,mbbroberg/kubernetes 是我的遠程倉庫,kubernetes/kubernetes 是上游。

合併的隱喻

當你深入 Git 分支時,根系統的視覺效果就會和火車軌道的形象合二為一。分支通常被用作開發一個新功能的方式,最終你想把它 合併 merge 到主分支中。當這樣做時,Git 會按順序保留共同的提交歷史,然後將你的分支的新提交追加到歷史中。這個過程有一大堆的細節:是否 變基 rebase ,是否添加一個 合併提交 merge commit Brent Laster 在《如何在 Git 中重置、恢復和返回之前的狀態》中會有更詳細的探討。

我想現在就去 Git

要掌握 Git 命令的世界,有大量的術語和需要探索的地方。我希望這篇關於日常使用術語的第一人稱探索能幫助你適應這一切。如果你覺得自己被卡住了或者遇到了挫折,歡迎在 Twitter @mbbroberg 上聯繫我。

回顧

  • 提交 Commit —— 將當前索引的內容保存在一個新的提交中,並附上用戶描述更改的日誌信息。
  • 分支 Branch —— 指向一個提交的指針。
  • master —— 第一個分支的默認名稱。
  • HEAD —— 指向當前分支上最近一次提交的指針。
  • 合併 Merge —— 合併兩個或多個提交的歷史。
  • 工作空間 Workspace —— Git 倉庫本地副本的通俗名稱。
  • 工作樹 Working tree —— 工作區中的當前分支;任何時候你都可以在 git status 的輸出中看到這個。
  • 緩存 Cache —— 用於臨時存儲未提交的變更的空間。
  • 索引 Index —— 變更提交前存儲其變化的緩存。
  • 跟蹤和未跟蹤的文件 —— 沒有被索引緩存的文件或尚未加入其中的文件。
  • 暫存 Stash —— 另一個緩存,作為一個堆棧,在這裡可以存儲更改而不需要提交它們。
  • origin —— 遠程版本庫的默認名稱。
  • 本地倉庫 Local repository —— 也就是你在工作站上保存 Git 倉庫副本的地方。
  • 遠程存儲庫 Remote repository —— Git 存儲庫的第二副本,你可以在這裡推送變更以便協作或備份。
  • 上游存儲庫 Upstream repository —— 你跟蹤的遠程存儲庫的通俗說法。
  • 拉取請求 Pull request —— 這是 GitHub 的專用術語,用於讓其他人知道你推送到倉庫分支的變化。
  • 合併請求 Merge request —— 這是 GitLab 的專用術語,用於讓其他人知道你推送到倉庫分支的變化。
  • origin/master —— 遠程版本庫及其主要分支的默認名稱。

後記:雙關語是 Git 最好的部分之一,願你喜歡。

via: https://opensource.com/article/19/2/git-terminology

作者:Matthew Broberg 選題:lujun9972 譯者:wxy 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的電子郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國