而不是介紹
你好!今天我們要聊的是版本控制系統,也就是Git。
Git 基礎知識
Git 是我們代碼的分佈式版本控制系統。我們為什麼需要它?分佈式團隊需要某種系統來管理他們的工作。需要跟踪隨時間發生的變化。也就是說,我們需要能夠逐步查看哪些文件已更改以及如何更改。當您調查在單個任務的上下文中發生了什麼變化時,這一點尤其重要,從而可以恢復更改。安裝 Git
讓我們在您的計算機上安裝 Java。在 Windows 上安裝
像往常一樣,您需要下載並運行一個 exe 文件。這裡的一切都很簡單:點擊第一個谷歌鏈接,執行安裝,就是這樣。為此,我們將使用 Windows 提供的 bash 控制台。在 Windows 上,您需要運行 Git Bash。下面是它在“開始”菜單中的樣子:

在 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有幾個雕像需要理解和記住:- 未追踪
- 修改的
- 上演
- 堅定的
你應該怎麼理解這個?
這些是適用於包含我們代碼的文件的狀態:- 創建但尚未添加到存儲庫的文件具有“未跟踪”狀態。
- 當我們對已經添加到 Git 存儲庫的文件進行更改時,它們的狀態為“已修改”。
- 在我們更改的文件中,我們選擇我們需要的那些,這些類被更改為“暫存”狀態。
- 提交是從處於暫存狀態的準備文件創建的,並進入 Git 存儲庫。之後,沒有文件處於“暫存”狀態。但可能仍然存在狀態為“已修改”的文件。

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

什麼是分支?
分支是指向某個提交的指針。因為提交知道哪個提交在它之前,所以當一個分支指向一個提交時,所有那些先前的提交也適用於它。因此,我們可以說您可以擁有任意數量的分支指向同一個提交。工作發生在分支中,因此當創建新提交時,分支會將其指針移至最近的提交。開始使用 Git
您可以單獨使用本地存儲庫,也可以使用遠程存儲庫。要練習所需的命令,您可以將自己限制在本地存儲庫中。它只將所有項目的信息存儲在本地的 .git 文件夾中。如果我們談論的是遠程存儲庫,那麼所有信息都存儲在遠程服務器的某個位置:只有項目的副本存儲在本地。可以將對本地副本所做的更改推送 (git push) 到遠程存儲庫。在這里和下面的討論中,我們討論的是在控制台中使用 Git。當然,您可以使用某種基於 GUI 的解決方案(例如 IntelliJ IDEA),但首先您應該弄清楚正在執行的命令及其含義。在本地存儲庫中使用 Git
接下來,我建議您按照閱讀本文時執行的所有步驟進行操作。這將提高您對材料的理解和掌握。嗯,祝你胃口好!:) 要創建本地存儲庫,您需要編寫:
git init

git status

- git add -A — 將所有文件添加到“暫存”狀態
- 混帳添加。— 添加此文件夾和所有子文件夾中的所有文件。本質上,這與上一個相同
- git add <file name> — 添加特定文件。在這裡您可以使用正則表達式根據某種模式添加文件。例如,git add *.java:這意味著您只想添加擴展名為 java 的文件。
git add *.txt
要檢查狀態,我們使用我們已知的命令:
git status

git commit -m "all txt files were added to the project"

git log

git status

git status

git diff

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

git add GitTest.java
git commit -m "added GitTest.java"
git status

使用 .gitignore
顯然,我們只想在存儲庫中單獨保留源代碼,而不是其他任何東西。那還能有什麼呢?至少,由開發環境生成的編譯類和/或文件。要告訴 Git 忽略它們,我們需要創建一個特殊文件。這樣做:在項目的根目錄中創建一個名為 .gitignore 的文件。此文件中的每一行代表一個要忽略的模式。在此示例中,.gitignore 文件將如下所示:
```
*.class
target/
*.iml
.idea/
```
讓我們來看看:
- 第一行是忽略所有擴展名為.class的文件
- 第二行是忽略“目標”文件夾及其包含的所有內容
- 第三行是忽略所有擴展名為.iml的文件
- 第四行忽略.idea文件夾
git status


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

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

- 根據我們所在的分支創建一個新分支(99% 的情況)
- 根據特定提交創建分支(1% 的案例)
讓我們根據特定的提交創建一個分支
我們將依賴提交的唯一標識符。為了找到它,我們寫:
git log

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

git branch -a

讓我們在當前的基礎上創建一個分支
創建分支的第二種方法是從另一個分支創建它。我想在 master 分支的基礎上創建一個分支。首先,我需要切換到它,下一步是創建一個新的。讓我們來看看:- git checkout master——切換到master分支
- git status — 驗證我們實際上在 master 分支中

git checkout -b feature/update-txt-files

解決衝突
在我們探討什麼是衝突之前,我們需要討論將一個分支合併到另一個分支。這張圖片描繪了將一個分支合併到另一個分支的過程:

git add *.txt
git commit -m "updated txt files"
git log

git checkout master
git merge feature/update-txt-files
git log

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 add *.txt
git commit -m "added header to txt"

git checkout master
… we updated test_resource.txt

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 文件中發生衝突:

- 主分支中這一行的更改位於“<<<<<<< HEAD”和“=======”之間。
- feature/add-header 分支中的更改位於“=======”和“>>>>>>> feature/add-header”之間。

git status

git add *.txt

git commit

使用遠程存儲庫
最後一步是找出使用遠程存儲庫所需的更多命令。正如我所說,遠程存儲庫是存儲存儲庫的地方,您可以從中克隆它。有哪些遠程存儲庫?例子:-
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 add test_resource.txt
git commit -m "prepared txt for pushing"
將其推送到遠程存儲庫的命令是:
git push

有用的鏈接
- 官方Git 文檔。我推薦它作為參考。
GO TO FULL VERSION