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中國

    Linux中國

    捐贈 Let&apos;s Encrypt,共建安全的互聯網

    隨著 Mozilla、蘋果和谷歌對沃通和 StartCom 這兩家 CA 公司處罰落定,很多使用這兩家 CA 所簽發證書的網站紛紛尋求新的證書籤發商。有一個非盈利組織可以為大家提供了免費、可靠和安全的 SSL 證書服務,這就是 Let's Encrypt 項目。現在,它需要您的幫助
    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...