Git 入門:術語基礎
如今,對於任何希望跟蹤他們的變化的人來說,版本控制是一個重要的工具。它對程序員、系統管理員和 網站可靠性工程師 (SRE)都特別有用。確保可以從錯誤中恢復到已知的良好狀態是一個巨大的勝利,比以前給複製的文件添加 .old
後綴的策略更友好。
但學習 Git 這件事往往被告訴大家「投身開源」的好心同行們過度簡化了。在你還不明白之前,就有人要你給一個從 上游 變基 的 拉取請求 (PR)或 合併請求 (MR),然後他們才能從你的 遠程版本庫 合併 —— 而且一定會刪除 合併提交 。無論你想給開源項目做出什麼好的貢獻,當你看到這些你不認識的單詞時,都會覺得難以融入。
![Git 速查表封面圖](/data/attachment/album/202101/08/171207av0lvu3z688ubg8l.jpg "Git Cheat Sheet cover image")
- 下載 我們的 Git 速查表。
如果你有一兩個月的時間和足夠的好奇心,Git SCM 是你需要學習所有術語的權威來源。但如果你正在尋找來自實踐的總結,請繼續閱讀。
提交就是提醒
對我來說,Git 最難理解的部分是 Git 最簡單的概念:一個 提交 就是一個內容的集合,包括一個關於描述的信息,以及之前的提交。沒有固有的代碼發布策略,甚至沒有內置的明確建議。這個內容甚至不一定是代碼 —— 可以是任何你想添加到版本庫的東西。 提交消息 會對這些內容進行注釋。
我喜歡把提交信息看作是給未來的自己的禮物:它可能會提到你編輯的文件,但更重要的是它提醒你修改這些文件的意圖。添加更多關於你為什麼編輯這些內容的信息,可以幫助任何使用你的版本庫的人,即使那個人是你。
origin/master 在哪裡?
要知道自己在 Git 項目中的位置,首先把它想成一棵樹。所有 Git 項目都有一個根目錄,類似於文件系統的根目錄。所有的提交都是這個根目錄下的分支。這樣一來,分支只是一個提交的指針。按照慣例,master
是根目錄下默認的分支名稱。(LCTT 譯註:世界變得快,原文發表於 2019 年,而現在有些地方開始用 main
替代這個名字。)
由於 Git 是一個分散式的版本控制系統,同一個代碼庫分布在多個地方,所以人們經常用 版本庫 這個詞來表示同一個項目的所有副本。(LCTT 譯註:「repository」 英文原意是倉庫、存儲庫,在計算機環境中,常用於版本控制、軟體分發等方面,有時候會統一譯作「倉庫」、「存儲庫」。但我們認為,應該根據不同語境採用更有指向性的譯法。在 Git 等版本控制語境中,採用「版本庫」;在軟體分發方面,採用「軟體庫」;其它泛指或不確定的語境中,可採用「倉庫」、「存儲庫」譯法。)有 本地版本庫 ,這是你編輯代碼的地方(稍後會有更多的介紹),還有 遠程版本庫 ,這是你完成後想把代碼發送到的地方。遠程版本庫可以在任何地方,甚至在你的本地版本庫所在的同一台計算機上,但它們通常託管在 GitLab 或 GitHub 等版本庫服務上。
我在哪裡?
雖然不是官方的賣點,但迷路也是 Git 倉庫的「樂趣」之一。你可以通過這套可靠的命令來找到自己的方向:
git branch
—— 找到你所在的分支。git log
—— 查看你正在進行的提交。git status
—— 查看自上次提交以來你所做的編輯。git remote
—— 查看你正在跟蹤的遠程倉庫。
用這些命令來定位自己的方向,當你被卡住的時候,會讓你有一種方向感。
我是否已將我的提交暫存或緩存起來?
你電腦上的代碼俗稱為你的 工作空間 。但不是很明顯的是,當你在 Git 倉庫中時,你還有兩個(是的,兩個!)其他位置: 索引 和 暫存 。當你寫了一些內容,然後添加時,你是把它添加到索引中,也就是準備提交的緩存內容。有的時候,你的索引中的文件還沒有準備好提交,但你想查看另一個分支。這時,暫存就派上用場了。你可以使用 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 模式,就意味著你已經脫離了這個隱喻的軌道。
HEAD
是指向當前簽出分支中最近一次提交的指針。默認的「簽出checkout」是指當你創建一個 Git 倉庫並進入到 master
分支的時候。每次創建或修改到另一個分支時,你都會切換到該分支行。如果你在當前分支的某處進行 git checkout <commit>
,HEAD
就會移動到該提交。如果沒有提交歷史記錄將你的當前提交連接到已簽出的提交,那麼你將處於脫離的 HEAD
狀態。如果你找不到 HEAD
的位置,你可以隨時用 git reset --hard origin/master
來刪除修改,回到已知狀態。警告:這將刪除你上次推送到 master
後的任何改動。
你是上游還是下游?
你的項目的本地副本被認為是你的本地版本庫,它可能有也可能沒有遠程版本庫 —— 遠程版本庫的副本是用於協作或保存的。也可能還有一個 上游 版本庫,在那裡,項目的第三個副本由不同的貢獻者託管和維護。
例如,假設我想為 Kubernetes 做貢獻。我會首先將 kubernetes/kubernetes
項目 復刻 到我的賬戶下 mbbroberg/kubernetes
。然後我會將我的項目克隆到我的本地工作區。在這種情況下,我的本地克隆是我的本地倉庫,mbbroberg/kubernetes
是我的遠程倉庫,kubernetes/kubernetes
是上游。
合併的隱喻
當你深入 Git 分支時,根系統的視覺效果就會和火車軌道的形象合二為一。分支通常被用作開發一個新功能的方式,最終你想把它 合併 到主分支中。當這樣做時,Git 會按順序保留共同的提交歷史,然後將你的分支的新提交追加到歷史中。這個過程有一大堆的細節:是否 變基 ,是否添加一個 合併提交 ,Brent Laster 在《如何在 Git 中重置、恢復和返回之前的狀態》中會有更詳細的探討。
我想現在就去 Git
要掌握 Git 命令的世界,有大量的術語和需要探索的地方。我希望這篇關於日常使用術語的第一人稱探索能幫助你適應這一切。如果你覺得自己被卡住了或者遇到了挫折,歡迎在 Twitter @mbbroberg 上聯繫我。
回顧
- 提交 —— 將當前索引的內容保存在一個新的提交中,並附上用戶描述更改的日誌信息。
- 分支 —— 指向一個提交的指針。
master
—— 第一個分支的默認名稱。HEAD
—— 指向當前分支上最近一次提交的指針。- 合併 —— 合併兩個或多個提交的歷史。
- 工作空間 —— Git 倉庫本地副本的通俗名稱。
- 工作樹 —— 工作區中的當前分支;任何時候你都可以在
git status
的輸出中看到這個。 - 緩存 —— 用於臨時存儲未提交的變更的空間。
- 索引 —— 變更提交前存儲其變化的緩存。
- 跟蹤和未跟蹤的文件 —— 沒有被索引緩存的文件或尚未加入其中的文件。
- 暫存 —— 另一個緩存,作為一個堆棧,在這裡可以存儲更改而不需要提交它們。
origin
—— 遠程版本庫的默認名稱。- 本地倉庫 —— 也就是你在工作站上保存 Git 倉庫副本的地方。
- 遠程存儲庫 —— Git 存儲庫的第二副本,你可以在這裡推送變更以便協作或備份。
- 上游存儲庫 —— 你跟蹤的遠程存儲庫的通俗說法。
- 拉取請求 —— 這是 GitHub 的專用術語,用於讓其他人知道你推送到倉庫分支的變化。
- 合併請求 —— 這是 GitLab 的專用術語,用於讓其他人知道你推送到倉庫分支的變化。
origin/master
—— 遠程版本庫及其主要分支的默認名稱。
後記:雙關語是 Git 最好的部分之一,願你喜歡。
via: https://opensource.com/article/19/2/git-terminology
作者:Matthew Broberg 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive