11.1 Git 分支
在 Git 中操作分支 (branches) 是版本控制中的一個關鍵方面,允許在同一個 repository 中平行進行多條線的開發。分支使得 Git 成為一個強大的工具,能夠進行協作、實驗以及管理專案的不同版本。

你可以將 git 中的分支視為文件夾,git 將你的專案複製進去。你擁有主要的專案文件夾 在你的 本地 repository — master,而 git 可以創建這個文件夾的副本,讓你在那裡嘗試一些實驗,而不會改動原來的、運行良好的代碼。這些文件夾的副本被稱為 分支 — branches。
分支是代碼的替代版本。假設你想要在一個大型專案裡改變某些東西,進行一些你不太確定的實驗。如果沒有 git,你會怎麼做?
你可能會將項目複製到一個新的文件夾,然後嘗試更改全部內容。如果結果滿意,你可以將其複製回主要文件夾。如果不滿意,你可以忘掉它,或者乾脆刪掉。
或者讓我們用生活中的例子。比如,寫一本書:
- 你有一本書的手稿(主要分支)。
- 你想嘗試改變結尾(創建一個新分支)。
- 你在一個單獨的文件中寫新的結尾(在新分支中操作)。
- 如果新的結尾更好,你將其替換到手稿中(合併分支)。
- 刪除包含新結尾的單獨文件(刪除分支)。
11.2 創建分支
在 IntelliJ IDEA 中創建分支非常簡單:

輸入分支名稱:

IntelliJ IDEA 會立即在菜單頂部顯示當前分支名稱:

在此之前,那裡是什麼?
那裡是你的第一個也是主要的分支名稱 — master。
現在那裡顯示的是 test,這意味著 Git(由 IntelliJ IDEA 管理)不僅創建了新分支,還立即切換到了它。
現在我們來在當前分支(test)的 main.html 文件中添加一些代碼並提交:

11.3 在分支間切換
步驟 1. 選擇分支。
現在我們切換到舊分支。點擊頂部菜單,我們看到了什麼?

別擔心 — 這很簡單:
Local — 是你本地 git repository 的分支列表。在這裡有兩個:
- test
- master
Remote — 是你的遠端 repository,位於 GitHub 伺服器上。我們將變更 push 到那裡,但新的分支還不存在,這很合理。遠端 repository 的名稱是 origin,其中只有分支 master。
Recent — 這只是你最近使用過的分支名稱列表:這是 IntelliJ IDEA 為了方便和速度而添加的選項。
在本地 repository 名稱右側顯示的 origin/master 是遠端 repository 的名稱,它現在與本地同步,變更將被 push 到這裡。
步驟 2. 將分支代碼加載到當前文件夾。

步驟 3. 檢查。
我這裡顯示的是分支「master」和舊的代碼:

11.4 合併分支
現在讓我們嘗試將我們兩個分支的代碼合併。
步驟 1. 首先讓我們在項目中添加另一個文件 — index.html 並寫入一些代碼:
- 創建文件 index.html
- 寫入代碼 <h1>Hello</h1>
- 提交文件
這是我的 master 分支中的兩個文件的樣子:

步驟 2. 合併分支。
將在 test 分支中所做的變更合併到我們當前的分支(master)。
為此,也使用頂部菜單中的命令「Merge ‘test’ into ‘master’」:

步驟 3. 檢查結果。

檢查:
- 上方仍然顯示分支 master
- 我們有兩個文件:index.html 和 main.html
- main.html 文件包含在 test 分支中添加的代碼
11.5 合併衝突
有時分支合併時會出現衝突。
如果你在不同分支中的同一個文件做了更改並嘗試合併,可能會出現衝突。
文本文件衝突
Git 是非常智能的系統,它能夠理解文件類型。如果你在不同位置對它認為是文本的文件進行更改,它會將一個文件中的更改轉移到另一個文件中的適當位置(就像人類那樣)。
二進制文件衝突
但如果你修改了一些圖片或文檔,Git 不會嘗試合併它們的部分:它只會讓你選擇哪個版本的文件要保留在當前分支。
手動解決衝突
如果你在文本文件中同一位置做了不同更改,Git 無法正確合併不同版本並會讓你自己完成:

這是可能的樣子:

你在這裡看到什麼:
- 左邊是 master 分支的 main.html 文件內容
- 右邊是 test 分支的 main.html 文件內容
- 中間是 IntelliJ IDEA 提供的讓你撰寫最終版本的區域(可以點擊「>>」和「<<」按鈕自動插入某個文件的更改)
我選擇了 master 的版本並手動編寫了代碼。這是我做到的結果:

11.6 更改歷史
還有非常有用和有趣的功能。你可以查看 任何文件 的更改歷史,點擊 Show History 按鈕。 它有兩個可能的位置。找到它們。
這是我 main.html 文件的 更改歷史 的樣子:

解釋:
- 左邊你會看到特定文件的更改歷史:
- 更改越新,越在上面,越舊 — 越在下面
- 這裡也顯示了分支合併的歷史
- 右邊 — 是在特定提交中所做的更改
GO TO FULL VERSION