JavaRush /Java Blog /Random-TW /Git 入門:初學者詳細指南
Roman Beekeeper
等級 35

Git 入門:初學者詳細指南

在 Random-TW 群組發布

而不是介紹

你好,未來的高級軟體工程師。 Git 入門:初學者詳細指南 - 1今天我們將討論版本控制系統,即 Git(讀作 GIT,而不是 JIT,從英語文法來看)。是的,是的,我知道還有Mercurial、SVN……但是說實話:他們的時代已經過去了,我不會在他們身上浪費你的寶貴時間。為了讓你了解了解 Git 在我們這個時代的重要性,我會這樣說:如果不了解/不理解這一點,你在程式設計方面就一事無成。但美妙之處在於,要持續工作,您無需將所有命令和可能性都保留在腦海中。您需要了解一組命令來幫助您了解正在發生的一切。

Git 基礎知識

Git 是我們程式碼的分散式版本控制系統。為什麼我們需要它?分散式團隊需要某種工作管理系統。需要追蹤隨著時間的推移而發生的變化。也就是說,我們一步步查看哪些文件已更改以及如何更改。當您分析一項任務中所做的事情時,這一點尤其重要:這使得可以返回。讓我們想像一種情況:有一個工作代碼,裡面的一切都很好,但我們決定改進一些東西,在這裡調整它,在那裡調整它。一切都很好,但這項改進破壞了一半的功能,使其無法運作。那麼,下一步是什麼?如果沒有梵歌,人們將不得不坐上幾個小時並記住一切最初的樣子。所以我們只需回滾到提交即可。或者如果有兩個開發人員同時更改程式碼怎麼辦?如果沒有 Git,它看起來像這樣:他們從原始程式碼複製程式碼並執行他們需要執行的操作。這一刻到來了,兩人都想將他們的更改添加到主資料夾中。在這種情況下該怎麼辦?...我甚至不敢估計做這項工作的時間。如果使用Git就完全不會出現這樣的問題。

安裝Git

讓我們在您的電腦上安裝 Git。我知道每個人都有不同的作業系統,所以我將嘗試描述幾種情況。

Windows 安裝

像往常一樣,您需要下載 exe 檔案並運行它。這裡一切都很簡單:點擊第一個 Google 鏈接,安裝即可。對於工作,我們將使用他們提供的 bash 控制台。要在 Windows 上工作,您需要執行 Git Bash。這就是開始功能表中的樣子: Git 入門:初學者詳細指南 - 2這已經是一個可以在其中工作的控制台。為了不每次都去專案所在的資料夾中開啟git,可以在資料夾中右鍵單擊,打開控制台,其中包含我們需要的路徑: Git 入門:初學者詳細指南 - 3

Linux 安裝

通常 git 已經安裝並包含在 Linux 發行版中,因為它是最初為開發 Linux 核心而編寫的工具。但有些情況下它並不存在。要檢查這一點,您需要打開終端機並輸入:git --version。如果有明確的答案,則無需安裝任何東西。打開終端並安裝。我在 Ubuntu 上工作,所以我可以告訴你要為其寫什麼:sudo apt-get install git。就是這樣:現在您可以在任何終端中使用 Git。

在 macOS 上安裝

在這裡,首先您也需要檢查 Git 是否已經存在(請參閱上文,如在 Linux 上)。如果沒有,最簡單的方法是下載最新版本。如果安裝了XCode,那麼Git肯定會自動安裝。

Git 設定

git 有一個使用者設置,可以從中執行工作。這是合理且必要的事情,因為當建立提交時,Git 會在 Author 欄位中準確地取得此資訊。要為所有項目設定使用者名稱和密碼,需要輸入以下命令:

git config --global user.name ”Ivan Ivanov”
git config --global user.email ivan.ivanov@gmail.com
如果需要更改特定項目(例如個人項目)的作者,您可以刪除 --global,這樣就可以了:

git config user.name ”Ivan Ivanov”
git config user.email ivan.ivanov@gmail.com

一點理論...

為了緊扣主題,建議在您的訊息中添加一些新的單字和動作……否則就沒什麼可談的了。當然,這是一些行話和英文的副本,所以我會用英文添加含義。有哪些言語和動作?
  • git 儲存庫;
  • 提交(提交);
  • 分支;
  • 合併;
  • 衝突;
  • 拉;
  • 推;
  • 如何忽略某些文件(.gitignore)。
等等。

Git 中的狀態

《梵歌》有幾個需要理解和記住的狀態:
  • 未追蹤;
  • 修改的;
  • 準備好的(上演的);
  • 堅定的。

這是什麼意思?

這些是我們程式碼中的檔案所在的狀態。也就是說,他們的人生軌跡通常是這樣的:
  1. 建立但未新增至儲存庫的檔案將處於未追蹤狀態。
  2. 我們對已新增至 Git 儲存庫的檔案進行變更 - 它們處於已修改狀態。
  3. 從我們已更改的文件中,我們僅選擇那些(或全部)我們需要的(例如,我們不需要編譯的類別),並且這些發生更改的類別落入暫存狀態。
  4. 提交是根據暫存狀態中準備好的文件創建的,並進入 Git 存儲庫。此後,暫存狀態為空。但修改後可能仍然包含一些東西。
看起來像這樣(圖片來自官方文檔,所以你可以相信它)): Git 入門:初學者詳細指南 - 4

什麼是提交

提交是版本控制中的主要物件。它包含自該提交以來的所有更改。提交像單鍊錶一樣相互連結。即:有第一次提交。當創建第二個提交時,它(第二個)知道它是在第一個提交之後發生的。這樣您就可以追蹤資訊。提交也有自己的訊息,即所謂的元資料:
  • 您可以透過它找到它的唯一提交標識符;
  • 創建它的提交作者的姓名;
  • 提交創建日期;
  • 描述此提交期間所做操作的評論。
它看起來是這樣的: Git 入門:初學者詳細指南 - 5

什麼是分支機構

Git 入門:初學者詳細指南 - 6分支是指向提交的指標。由於提交知道哪個提交位於它之前,因此當分支指向某個提交時,所有先前的提交也會引用它。基於此,我們可以說可以有盡可能多的分支指向同一個提交。工作發生在分支上,因此當建立新的提交時,分支會將其指標移至較新的提交。

Git 入門

您只能使用本機儲存庫,也可以使用遠端儲存庫。要計算出必要的命令,您只能使用本機儲存庫。它將所有資訊僅儲存在專案本地的 .git 資料夾中。如果我們談論遠端,那麼所有資訊都儲存在遠端伺服器上的某個位置:只有項目的副本儲存在本地,對其進行的更改可以推送(git推送)到遠端儲存庫。在這裡以及進一步我們將討論在控制台中使用 git。當然,您可以使用一些圖形解決方案(例如,在 Intellij IDEA 中),但首先您需要弄清楚正在發生什麼命令以及它們的含義。

在本機儲存庫中使用 Git

接下來,我建議您按照我在閱讀本文時執行的所有步驟進行操作。這將提高您對材料的理解和記憶。所以祝你胃口好:) 要創建本地存儲庫,您需要編寫:

git init
Начало работы с Git: подробный гайд для новичков - 7這將在控制台所在的位置建立一個 .git 資料夾。.git 是一個儲存有關 Git 儲存庫的所有資訊的資料夾。無需刪除它;) 接下來,文件將添加到此項目中,並且其狀態變為“Untracked”。若要查看目前的工作狀態,請寫入:

git status
Начало работы с Git: подробный гайд для новичков - 8我們位於主分支中,在我們移動到另一個分支之前,一切都將保持原樣。這樣您就可以看到哪些文件已更改但尚未新增至暫存狀態。要將它們新增至暫存狀態,您需要編寫 git add。這裡可能有多種選擇,例如:
  • git add -A - 新增所有暫存狀態的檔案;
  • git 新增 . — 新增此資料夾中的所有檔案以及所有內部檔案。與上一篇基本相同;
  • git add <filename> - 僅新增特定檔案。在這裡您可以使用正規表示式根據某種模式進行新增。例如 git add *.java :這表示你只需要加入有 java 副檔名的檔案。
顯然前兩個選項很簡單,但是加上它會更有趣,所以我們寫:

git add *.txt
要檢查狀態,我們使用我們已經知道的命令:

git status
Начало работы с Git: подробный гайд для новичков - 9由此我們可以看到正規表示式運作正常,現在test_resource.txt處於暫存狀態。最後,最後一個階段(對於本機儲存庫,對於遠端儲存庫,還會有一個;)) - 提交並建立一個新的提交:

git commit -m “all txt files were added to the project”
Начало работы с Git: подробный гайд для новичков - 10接下來,有一個很棒的命令可以查看分支的提交歷史記錄。讓我們使用它:

git log
Начало работы с Git: подробный гайд для новичков - 11在這裡您已經可以看到我們的第一個提交已經與我們傳輸的文字一起出現。理解我們傳遞的文本必須盡可能準確地定義這次提交期間所做的事情非常重要。這在未來會有很多幫助。尚未入睡的好奇讀者可能會說:GitTest.java 檔案怎麼了?現在我們會發現,用於此目的:

git status
Начало работы с Git: подробный гайд для новичков - 12正如我們所看到的,它仍然處於未追蹤狀態並且正在伺機而動。或者也許我們根本不想將其添加到項目中?有時候這種情況會發生。接下來,為了使它更有趣,讓我們嘗試更改文字檔 test_resource.txt。讓我們在其中添加一些文字並檢查狀態:

git status
Начало работы с Git: подробный гайд для новичков - 13在這裡你可以清楚地看到兩種狀態之間的差異——未追蹤和修改。GitTest.java 處於未追蹤狀態,test_resource.txt 處於已修改狀態。現在已經有處於修改狀態的文件,我們可以查看對它們所做的更改。這可以使用以下命令來完成:

git diff
Начало работы с Git: подробный гайд для новичков - 14也就是說,您可以在這裡清楚地看到我將 hello world! 添加到我們的文字檔案中。將更改新增至文字檔案並提交:

git add test_resource.txt
git commit -m “added hello word! to test_resource.txt”
若要查看所有提交,請撰寫:

git log
Начало работы с Git: подробный гайд для новичков - 15正如您所看到的,已經有兩個提交。以同樣的方式我們加入GitTest.java。現在沒有評論,只有指令:

git add GitTest.java
git commit -m “added GitTest.java”
git status
Начало работы с Git: подробный гайд для новичков - 16

使用 .gitignore

很明顯,我們只想在儲存庫中儲存原始程式碼,而不儲存其他任何內容。還能是什麼?至少,創建開發環境的編譯類別和/或檔案。為了讓 Git 忽略它們,需要建立一個特殊檔案。我們這樣做:我們在專案的根目錄中建立一個名為 .gitignore 的文件,在這個文件中,每一行都是一個要忽略的模式。在此範例中,gitignore 將如下所示:

```
*.class
target/
*.iml
.idea/
```
現在讓我們來看看:
  • 第一行是忽略所有帶有 .class 副檔名的檔案;
  • 第二行是忽略目標資料夾及其包含的所有內容;
  • 第三行是忽略所有副檔名為.iml的檔案;
  • 第四行是忽略.idea資料夾。
讓我們透過一個例子來嘗試。要了解這是如何運作的,讓我們將已編譯的 GitTest.class 類別新增到專案中並查看專案狀態:

git status
Начало работы с Git: подробный гайд для новичков - 17顯然,我們不想意外地(如果我們使用 git add -A)將已編譯的類別加入專案。為此,請建立一個 .gitignore 檔案並添加前面描述的所有內容: Начало работы с Git: подробный гайд для новичков - 18現在讓我們使用新的提交將 gitignore 新增到專案中:

git add .gitignore
git commit -m “added .gitignore file”
現在是關鍵時刻:我們有一個已編譯的 GitTest.class 類,處於未追蹤狀態,我們不想將其新增到 Git 儲存庫中。這是 gitignore 應該工作的地方:

git status
Начало работы с Git: подробный гайд для новичков - 19一切都清楚了)Git 忽略+1)

與分公司等合作

當然,一個人在分支機構工作很不方便,而且當團隊中有多個人時也是不可能的。為此有一個分支。正如我之前所說,分支只是一個指向提交的移動指標。在這一部分中,我們將研究不同分支中的工作:如何將變更從一個分支合併到另一個分支、可能會出現哪些衝突等等。要查看儲存庫中所有分支的清單並了解您所在的分支,您需要編寫:

git branch -a
Начало работы с Git: подробный гайд для новичков - 20你可以看到我們只有一個主分支,它前面的星號表示我們在上面。順便說一句,要找出我們所在的分支,我們也可以使用狀態檢查(git status)。接下來,有幾個創建分支的選項(也許還有更多,我使用這些):
  • 根據我們現有的分支建立一個新分支(99% 的情況);
  • 根據特定提交 (1%) 建立分支。

根據特定提交建立分支

我們將依賴唯一的提交識別碼。為了找到它,我們寫下來:

git log
Начало работы с Git: подробный гайд для новичков - 21我用註釋“added hello world...”突出顯示了該提交。它有一個唯一的識別碼 - “6c44e53d06228f888f2f454d3cb8c1c976dd73f8”。我想從這次提交開始創建一個開發分支。為此我會寫:

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
建立的分支僅包含主分支的前兩次提交。為了測試這一點,我們首先確保我們已移動到另一個分支並查看其提交數量:

git status
git log
Начало работы с Git: подробный гайд для новичков - 22這是真的:事實證明我們有兩個提交。順便說一句,一個有趣的點:這個分支中還沒有 .gitignore 文件,所以我們編譯的文件(GitTest.class)現在以未追蹤狀態突出顯示。現在我們可以透過編寫以下內容再次修改我們的分支:

git branch -a
Начало работы с Git: подробный гайд для новичков - 23可以看到有兩個分支——master 和development——現在我們正在進行development。

在目前分支的基礎上建立一個分支

創建分支的第二種方法是在另一個分支上建構。我想在master分支的基礎上建立一個分支,所以需要先切換到master分支,下一步就是建立一個新的分支。我們看看吧:
  • git checkout master - 移動到 master 分支;
  • git status - 檢查它是否在主伺服器上。
Начало работы с Git: подробный гайд для новичков - 24在這裡你可以看到我們已經轉移到了master分支,gitignore已經在這裡工作了,並且編譯後的類別不再顯示為未追蹤。現在我們在master分支的基礎上建立一個新的分支:

git checkout -b feature/update-txt-files
Начало работы с Git: подробный гайд для новичков - 25如果您懷疑該分支與 master 分支不同,您可以透過撰寫 git log 並查看所有提交來輕鬆檢查這一點。應該有四個。

解決衝突

在我們了解什麼是衝突之前,我們需要討論將一個分支合併到另一個分支。這張圖可以顯示一個分支合併到另一個分支時的過程: Начало работы с Git: подробный гайд для новичков - 26即有一個主分支。在某一時刻,會從它創造一個輔助的,並在其中發生變化。工作完成後,您需要將一個分支合併到另一個分支。各種功能我就不多描述了:我只想傳達本文框架內的理解,具體細節大家需要的話自行了解。因此,在我們的範例中,我們建立了 feature/update-txt-files 分支。由於分支名稱中已寫明,我們將更新文字。 Начало работы с Git: подробный гайд для новичков - 27現在您需要為此建立一個新的提交:

git add *.txt 
git commit -m “updated txt files”
git log
Начало работы с Git: подробный гайд для новичков - 28現在,如果我們想將 feature/update-txt-files 分支合併到 master 中,我們需要進入 master 並編寫 git merge feature/update-txt-files:

git checkout master
git merge feature/update-txt-files
git log
Начало работы с Git: подробный гайд для новичков - 29因此,現在 master 分支也有一個提交被加入到 feature/update-txt-files 中。新增此功能是為了讓您可以刪除功能分支。為此,我們寫:

git branch -D feature/update-txt-files
到目前為止已經很清楚了,對吧?讓情況變得複雜一些:現在假設我們需要再次更改 txt 檔案。但現在這個文件也會在嚮導中被更改。也就是說,它會並行改變,當我們想要將新程式碼合併到 master 分支時,Git 將無法理解需要做什麼。去!我們基於 master 建立一個新分支,對 text_resource.txt 進行更改並為此建立一個提交:

git checkout -b feature/add-header
... делаем изменения в файле
Начало работы с Git: подробный гайд для новичков - 30

git add *.txt
git commit -m “added header to txt”
Начало работы с Git: подробный гайд для новичков - 31前往 master 分支,並在與功能分支相同的行上更新此文字檔案:

git checkout master
… обновor test_resource.txt
Начало работы с Git: подробный гайд для новичков - 32

git add test_resource.txt
git commit -m “added master header to txt”
現在最有趣的時刻是:您需要將功能/新增標題分支的變更合併到主分支。我們在 master 分支上,所以我們需要做的就是寫:

git merge feature/add-header
但我們會得到 test_resource.txt 檔案中存在衝突的結果: Начало работы с Git: подробный гайд для новичков - 33這裡我們可以看到,Git 無法獨立決定如何合併這段程式碼,並表示我們必須先解決衝突,然後才提交。好吧,讓我們在文字編輯器中開啟包含衝突的檔案並查看:Начало работы с Git: подробный гайд для новичков - 34要了解 git 在這裡做了什麼,您需要記住我們在哪裡編寫的內容並進行比較:
  1. “<<<<<<< HEAD” 和 “=======” 之間是 master 分支中這一行的主要變更。
  2. 在「=======」和「>>>>>>>> feature/add-header」之間,feature/add-header 分支中存在一些變更。
因此,Git 表明此時他無法弄清楚如何合併該文件,因此將此部分分為來自不同分支的兩部分,並建議我們自己決定。好吧,憑著強烈的意志,我決定刪除所有內容,只保留標題一詞: Начало работы с Git: подробный гайд для новичков - 35讓我們看看更改的狀態,描述會略有不同。不會有修改狀態,而是Unmerged。所以我們可以安全地添加第五個狀態......但我認為這是不必要的,讓我們看看:

git status
Начало работы с Git: подробный гайд для новичков - 36我們確信這是一個不同尋常的案例。我們繼續:

git add *.txt
Начало работы с Git: подробный гайд для новичков - 37在描述中你會注意到他們只建議寫 git commit。我們聽並寫:

git commit
Начало работы с Git: подробный гайд для новичков - 38就是這樣:我們就是這樣做的 - 我們解決了控制台中的衝突。當然,在開發環境中,您可以更輕鬆地做到這一點,例如,在 Intellij IDEA 中,一切都設定得很好,您可以在其中執行所有必要的操作。但是開發環境在幕後做了很多事情,我們常常不明白那裡到底發生了什麼事。當沒有理解時,就會出現問題。

使用遠端儲存庫

最後一步是了解使用遠端儲存庫所需的更多命令。正如我已經說過的,遠端儲存庫是儲存儲存庫並且可以從其中克隆它的地方。有哪些類型的遠端儲存庫?有很多例子:
  • GitHub是最大的儲存庫和協作開發儲存庫。我在之前的文章中已經描述過。
    訂閱我的 Github 帳號。我經常在那裡展示我在工作期間研究的領域的作品。

  • GitLab是一個基於Web 的開源DevOps生命週期工具,它為Git提供程式碼儲存庫管理系統,具有自己的 wiki、問題追蹤系統、CI/CD 管道和其他功能。 微軟收購 GitHub 的消息傳出後,一些開發者在 GitLab 重複了他們的工作。

  • BitBucket 是一個基於 Mercurial 和 Git 版本控制系統的用於託管專案及其共同開發的 Web 服務。曾經它比 GitHub 有一大優勢,因為它擁有免費的私人儲存庫。去年,GitHub 也將這項功能免費提供給所有人。

  • 等等…

使用遠端儲存庫時需要做的第一件事是將專案複製到本機儲存庫。對於這種情況,我導出了我們在本地製作的項目,現在每個人都可以透過編寫以下內容來自己克隆它:
git clone https://github.com/romankh3/git-demo
現在本地已經有了該項目的完整副本。為了確保專案的最新副本位於本地,正如他們所說,您需要透過編寫以下內容來轉儲資料:

git pull
Начало работы с Git: подробный гайд для новичков - 39在我們的例子中,現在遠端沒有任何改變,所以答案是:已經是最新的。但是,如果我在遠端儲存庫中進行一些更改,則本機儲存庫將在我們拉取它們後更新。最後,最後一個命令是將資料推送到遠端儲存庫。當我們在本地做了一些事情並想將其傳輸到遠端儲存庫時,我們必須先在本地創建一個新的提交。為此,讓我們在文字檔案中添加其他內容: Начало работы с Git: подробный гайд для новичков - 40現在這對我們來說是很常見的事情 - 我們為此創建一個提交:

git add test_resource.txt
git commit -m “prepated txt for pushing”
現在將其推送到遠端儲存庫的命令:

git push
Начало работы с Git: подробный гайд для новичков - 41這就是我想告訴你的。感謝您的關注。訂閱我的 GitHub 帳戶,我在其中發布了我在工作中學習和使用的不同很酷的範例專案。

有用的連結

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION