CodeGym /Java Blog /Toto sisi /Git 入門:新手綜合指南
John Squirrels
等級 41
San Francisco

Git 入門:新手綜合指南

在 Toto sisi 群組發布

而不是介紹

你好!今天我們要聊的是版本控制系統,也就是Git。Git 入門:新手綜合指南 - 1如果您不知道/不了解 Git,那麼您與編程毫無關係。但美妙之處在於,您不必為了持續使用而將所有 Git 命令和功能都記在腦子裡。您需要了解一組命令,以幫助您了解正在發生的一切。

Git 基礎知識

Git 是我們代碼的分佈式版本控制系統。我們為什麼需要它?分佈式團隊需要某種系統來管理他們的工作。需要跟踪隨時間發生的變化。也就是說,我們需要能夠逐步查看哪些文件已更改以及如何更改。當您調查在單個任務的上下文中發生了什麼變化時,這一點尤其重要,從而可以恢復更改。

安裝 Git

讓我們在您的計算機上安裝 Java。

在 Windows 上安裝

像往常一樣,您需要下載並運行一個 exe 文件。這裡的一切都很簡單:點擊第一個谷歌鏈接,執行安裝,就是這樣。為此,我們將使用 Windows 提供的 bash 控制台。在 Windows 上,您需要運行 Git Bash。下面是它在“開始”菜單中的樣子:Git 入門:新手綜合指南 - 2現在這是一個您可以使用的命令提示符。為避免每次都必須轉到項目所在的文件夾才能在那裡打開 Git,您可以在項目文件夾中使用鼠標右鍵打開命令提示符,並輸入我們需要的路徑:Git 入門:新手綜合指南 - 3

在 Linux 上安裝

通常 Git 是 Linux 發行版的一部分並且已經安裝,因為它是最初為 Linux 內核開發而編寫的工具。但有些情況下它不是。要檢查,您需要打開一個終端並輸入:git --version。如果你得到一個可理解的答案,那麼就不需要安裝任何東西。打開終端並在 Ubuntu 上安裝 Git。我在 Ubuntu 上工作,所以我可以告訴你為它寫什麼:sudo apt-get install git。

在 macOS 上安裝

在這裡,您也首先需要檢查 Git 是否已經存在。如果您沒有它,那麼最簡單的獲取方式就是在此處下載最新版本。如果安裝了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 中的狀態

Git有幾個雕像需要理解和記住:
  • 未追踪
  • 修改的
  • 上演
  • 堅定的

你應該怎麼理解這個?

這些是適用於包含我們代碼的文件的狀態:
  1. 創建但尚未添加到存儲庫的文件具有“未跟踪”狀態。
  2. 當我們對已經添加到 Git 存儲庫的文件進行更改時,它們的狀態為“已修改”。
  3. 在我們更改的文件中,我們選擇我們需要的那些,這些類被更改為“暫存”狀態。
  4. 提交是從處於暫存狀態的準備文件創建的,並進入 Git 存儲庫。之後,沒有文件處於“暫存”狀態。但可能仍然存在狀態為“已修改”的文件。
這是它的樣子:Git 入門:新手綜合指南 - 4

什麼是提交?

提交是版本控制的主要事件。它包含自提交開始以來所做的所有更改。提交像單鍊錶一樣鏈接在一起。更具體地說:有一個第一次提交。當創建第二個提交時,它知道第一個之後會發生什麼。並且以這種方式,可以跟踪信息。提交也有自己的信息,即所謂的元數據:
  • 提交的唯一標識符,可用於查找它
  • 提交作者的名字,創建者
  • 創建提交的日期
  • 描述提交期間所做的事情的註釋
這是它的樣子:Git 入門:新手綜合指南 - 5

什麼是分支?

分支是指向某個提交的指針。因為提交知道哪個提交在它之前,所以當一個分支指向一個提交時,所有那些先前的提交也適用於它。因此,我們可以說您可以擁有任意數量的分支指向同一個提交。工作發生在分支中,因此當創建新提交時,分支會將其指針移至最近的提交。

開始使用 Git

您可以單獨使用本地存儲庫,也可以使用遠程存儲庫。要練習所需的命令,您可以將自己限制在本地存儲庫中。它只將所有項目的信息存儲在本地的 .git 文件夾中。如果我們談論的是遠程存儲庫,那麼所有信息都存儲在遠程服務器的某個位置:只有項目的副本存儲在本地。可以將對本地副本所做的更改推送 (git push) 到遠程存儲庫。在這里和下面的討論中,我們討論的是在控制台中使用 Git。當然,您可以使用某種基於 GUI 的解決方案(例如 IntelliJ IDEA),但首先您應該弄清楚正在執行的命令及其含義。

在本地存儲庫中使用 Git

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

git init
Git 入門:新手綜合指南 - 6這將在控制台的當前目錄中創建一個 .git 文件夾。.git 文件夾存儲有關 Git 存儲庫的所有信息。不要刪除它 ;) 接下來,將文件添加到項目中,並將它們指定為“未跟踪”狀態。要檢查您的工作的當前狀態,請這樣寫:

git status
Git 入門:新手綜合指南 - 7我們在 master 分支,我們會一直呆在這裡,直到我們切換到另一個分支。這顯示哪些文件已更改但尚未添加到“暫存”狀態。要將它們添加到“暫存”狀態,您需要編寫“git add”。我們在這裡有幾個選項,例如:
  • git add -A — 將所有文件添加到“暫存”狀態
  • 混帳添加。— 添加此文件夾和所有子文件夾中的所有文件。本質上,這與上一個相同
  • git add <file name> — 添加特定文件。在這裡您可以使用正則表達式根據某種模式添加文件。例如,git add *.java:這意味著您只想添加擴展名為 java 的文件。
前兩個選項顯然很簡單。隨著最新的添加,事情變得更加有趣,所以讓我們寫:

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

git status
Git 入門:新手綜合指南 - 8在這裡您可以看到正則表達式已正常工作:test_resource.txt 現在處於“暫存”狀態。最後,使用本地存儲庫的最後階段(使用遠程存儲庫時還有一個階段;))——創建一個新的提交:

git commit -m "all txt files were added to the project"
Git 入門:新手綜合指南 - 9接下來是一個很棒的命令,用於查看分支上的提交歷史記錄。讓我們利用它:

git log
Git 入門:新手綜合指南 - 10在這裡您可以看到我們已經創建了第一個提交,它包括我們在命令行上提供的文本。理解這段文字應該盡可能準確地解釋這次提交期間做了什麼是非常重要的。這將在未來多次幫助我們。尚未入睡的好奇讀者可能想知道 GitTest.java 文件發生了什麼。讓我們現在就知道。為此,我們使用:

git status
Git 入門:新手綜合指南 - 11如您所見,它仍處於“未跟踪”狀態,正在等待。但是,如果我們根本不想將它添加到項目中怎麼辦?有時會發生這種情況。為了讓事情變得更有趣,讓我們現在嘗試更改我們的 test_resource.txt 文件。讓我們在那裡添加一些文本並檢查狀態:

git status
Git 入門:新手綜合指南 - 12在這裡您可以清楚地看到“未跟踪”和“已修改”狀態之間的區別。GitTest.java 是“未跟踪的”,而 test_resource.txt 是“已修改的”。現在我們有處於修改狀態的文件,我們可以檢查對它們所做的更改。這可以使用以下命令完成:

git diff
Git 入門:新手綜合指南 - 13也就是說,您可以在這裡清楚地看到我添加到我們的文本文件中的內容:hello world!讓我們將更改添加到文本文件並創建一個提交:

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

git log
Git 入門:新手綜合指南 - 14如您所見,我們現在有兩個提交。我們將以相同的方式添加 GitTest.java。這裡沒有評論,只有命令:

git add GitTest.java
git commit -m "added GitTest.java"
git status
Git 入門:新手綜合指南 - 15

使用 .gitignore

顯然,我們只想在存儲庫中單獨保留源代碼,而不是其他任何東西。那還能有什麼呢?至少,由開發環境生成的編譯類和/或文件。要告訴 Git 忽略它們,我們需要創建一個特殊文件。這樣做:在項目的根目錄中創建一個名為 .gitignore 的文件。此文件中的每一行代表一個要忽略的模式。在此示例中,.gitignore 文件將如下所示:

```
*.class
target/
*.iml
.idea/
```
讓我們來看看:
  • 第一行是忽略所有擴展名為.class的文件
  • 第二行是忽略“目標”文件夾及其包含的所有內容
  • 第三行是忽略所有擴展名為.iml的文件
  • 第四行忽略.idea文件夾
讓我們嘗試使用一個例子。為了看看它是如何工作的,讓我們將編譯後的 GitTest.class 添加到項目中並檢查項目狀態:

git status
Git 入門:新手綜合指南 - 16顯然,我們不想以某種方式不小心將已編譯的類添加到項目中(使用 git add -A)。為此,創建一個 .gitignore 文件並添加前面描述的所有內容:Git 入門:新手綜合指南 - 17現在讓我們使用提交將 .gitignore 文件添加到項目中:

git add .gitignore
git commit -m "added .gitignore file"
現在是關鍵時刻:我們有一個“未跟踪”的已編譯類 GitTest.class,我們不想將其添加到 Git 存儲庫中。現在我們應該看到 .gitignore 文件的效果:

git status
Git 入門:新手綜合指南 - 18完美的!.gitignore +1 :)

使用分支機構等

自然地,只在一個分支工作對於孤獨的開發人員來說是不方便的,而當團隊中有多個人時,這是不可能的。這就是為什麼我們有分支機構。正如我之前所說,分支只是指向提交的可移動指針。在這一部分中,我們將探索在不同的分支中工作:如何將一個分支的更改合併到另一個分支,可能會出現什麼衝突,等等。要查看存儲庫中所有分支的列表並了解您所在的分支,您需要編寫:

git branch -a
Git 入門:新手綜合指南 - 19你可以看到我們只有一個 master 分支。它前面的星號表示我們在其中。順便說一句,你也可以使用“git status”命令來找出我們在哪個分支。然後有幾個創建分支的選項(可能還有更多——這些是我使用的):
  • 根據我們所在的分支創建一個新分支(99% 的情況)
  • 根據特定提交創建分支(1% 的案例)

讓我們根據特定的提交創建一個分支

我們將依賴提交的唯一標識符。為了找到它,我們寫:

git log
Git 入門:新手綜合指南 - 20我用註釋“added hello world...”突出顯示了提交,它的唯一標識符是 6c44e53d06228f888f2f454d3cb8c1c976dd73f8。我想創建一個從此提交開始的“開發”分支。為此,我寫道:

git checkout -b development 6c44e53d06228f888f2f454d3cb8c1c976dd73f8
創建一個分支時,只有來自 master 分支的前兩個提交。為了驗證這一點,我們首先確保切換到不同的分支並查看那裡的提交數量:

git status
git log
Git 入門:新手綜合指南 - 21正如預期的那樣,我們有兩個提交。順便說一句,這裡有一個有趣的點:這個分支中還沒有 .gitignore 文件,所以我們的編譯文件 (GitTest.class) 現在以“未跟踪”狀態突出顯示。現在我們可以通過編寫以下代碼再次查看我們的分支:

git branch -a
Git 入門:新手綜合指南 - 22可以看到有兩個分支:“master”和“development”。我們目前正在開發中。

讓我們在當前的基礎上創建一個分支

創建分支的第二種方法是從另一個分支創建它。我想在 master 分支的基礎上創建一個分支。首先,我需要切換到它,下一步是創建一個新的。讓我們來看看:
  • git checkout master——切換到master分支
  • git status — 驗證我們實際上在 master 分支中
Git 入門:新手綜合指南 - 23這裡可以看到我們切換到了master分支,.gitignore文件生效了,編譯後的類不再高亮為“untracked”。現在我們在master分支的基礎上新建一個分支:

git checkout -b feature/update-txt-files
Git 入門:新手綜合指南 - 24如果您不確定這個分支是否與“master”相同,您可以通過執行“git log”並查看所有提交來輕鬆檢查。應該有四個。

解決衝突

在我們探討什麼是衝突之前,我們需要討論將一個分支合併到另一個分支。這張圖片描繪了將一個分支合併到另一個分支的過程:Git 入門:新手綜合指南 - 25在這裡,我們有一個主分支。在某些時候,從主分支創建一個輔助分支,然後對其進行修改。工作完成後,我們需要將一個分支合併到另一個分支中。我不會描述各種功能:在本文中,我只想傳達一個大概的理解。如果您需要詳細信息,可以自己查找。在我們的示例中,我們創建了 feature/update-txt-files 分支。正如分支名稱所示,我們正在更新文本。Git 入門:新手綜合指南 - 26現在我們需要為這項工作創建一個新的提交:

git add *.txt 
git commit -m "updated txt files"
git log
Git 入門:新手綜合指南 - 27現在,如果我們想將 feature/update-txt-files 分支合併到 master 中,我們需要到 master 中編寫“git merge feature/update-txt-files”:

git checkout master
git merge feature/update-txt-files
git log
Git 入門:新手綜合指南 - 28因此,master 分支現在還包含添加到 feature/update-txt-files 的提交。添加了此功能,因此您可以刪除功能分支。為此,我們寫:

git branch -D feature/update-txt-files
到目前為止一切都很清楚,是嗎?讓情況復雜化:現在假設您需要再次更改 txt 文件。但是現在這個文件也將在 master 分支中被更改。換句話說,它會平行變化。當我們想將我們的新代碼合併到 master 分支時,Git 將無法弄清楚該怎麼做。我們走吧!我們將基於 master 創建一個新分支,對 text_resource.txt 進行更改,並為此工作創建一個提交:

git checkout -b feature/add-header
... we make changes to the file
Git 入門:新手綜合指南 - 29

git add *.txt
git commit -m "added header to txt"
Git 入門:新手綜合指南 - 30轉到 master 分支並在與 feature 分支相同的行上更新此文本文件:

git checkout master
… we updated test_resource.txt
Git 入門:新手綜合指南 - 31

git add test_resource.txt
git commit -m "added master header to txt"
現在最有趣的一點是:我們需要將更改從 feature/add-header 分支合併到 master。我們在master分支,所以只需要寫:

git merge feature/add-header
但是結果會在 test_resource.txt 文件中發生衝突:Git 入門:新手綜合指南 - 32這裡我們可以看到 Git 無法自行決定如何合併這段代碼。它告訴我們需要先解決衝突,然後才執行提交。好的。我們在文本編輯器中打開有衝突的文件,看看:Git 入門:新手綜合指南 - 33要了解 Git 在這裡做了什麼,我們需要記住我們做了哪些更改以及在哪裡,然後進行比較:
  1. 主分支中這一行的更改位於“<<<<<<< HEAD”和“=======”之間。
  2. feature/add-header 分支中的更改位於“=======”和“>>>>>>> feature/add-header”之間。
這就是 Git 告訴我們它無法弄清楚如何在文件中的這個位置執行合併的方式。它將本節分為來自不同分支的兩個部分,並邀請我們自己解決合併衝突。很公平。我大膽地決定刪除所有內容,只留下“header”一詞:Git 入門:新手綜合指南 - 34讓我們看看更改的狀態。描述會略有不同。我們沒有“修改”狀態,而是“未合併”。那麼我們可以提到第五種身份嗎?我不認為這是必要的。讓我們來看看:

git status
Git 入門:新手綜合指南 - 35我們可以說服自己,這是一個特殊的、不尋常的案例。讓我們繼續:

git add *.txt
Git 入門:新手綜合指南 - 36您可能會注意到描述建議只寫“git commit”。讓我們嘗試這樣寫:

git commit
Git 入門:新手綜合指南 - 37就這樣,我們做到了——我們在控制台中解決了衝突。當然,這在集成開發環境中可以做得更容易一些。例如,在 IntelliJ IDEA 中,一切都設置得非常好,您可以在其中執行所有必要的操作。但是 IDE 在“幕後”做了很多事情,我們常常不了解那裡到底發生了什麼。當沒有理解時,問題就會出現。

使用遠程存儲庫

最後一步是找出使用遠程存儲庫所需的更多命令。正如我所說,遠程存儲庫是存儲存儲庫的地方,您可以從中克隆它。有哪些遠程存儲庫?例子:
  • 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 入門:新手綜合指南 - 38在我們的例子中,遠程存儲庫中目前沒有任何變化,所以響應是:已經是最新的。但是如果我對遠程存儲庫進行任何更改,本地存儲庫會在我們拉取它們後更新。最後,最後一個命令是將數據推送到遠程存儲庫。當我們在本地做了一些事情,想要發送到遠程倉庫時,首先要在本地創建一個新的commit。為了證明這一點,讓我們在文本文件中添加一些其他內容:Git 入門:新手綜合指南 - 39現在對我們來說很常見的東西——我們為這項工作創建一個提交:

git add test_resource.txt
git commit -m "prepared txt for pushing"
將其推送到遠程存儲庫的命令是:

git push
Git 入門:新手綜合指南 - 40嗯,這就是我想說的。感謝您的關注。在GitHub上關注我,我在這裡發布了與我的個人學習和工作相關的各種很酷的示例項目。

有用的鏈接

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