Featured image of post 從零開始學 Git — 從時光機到平行時空,再到專業補丁大作戰!

從零開始學 Git — 從時光機到平行時空,再到專業補丁大作戰!

帶你從 Git 的基礎概念出發,學會如何安全地「撤回」錯誤,並深入 Rebase 與 Patch 技巧,讓你的開發歷史整潔又專業。

前言:你還在用「最終版_真的最後一版_絕對不改版.zip」嗎?

相信各位在剛開始寫程式的時候,一定遇過這種悲劇:
剛寫好一個功能,結果手賤改了一下,程式就再也跑不起來了,而且你完全不記得剛才動了哪一行。
或者是跟同學協作專案,大家用隨身碟傳檔案,結果你的程式碼被別人的舊版本覆蓋掉,瞬間心血化為烏有。

如果你有以上症狀,那麼你需要的不是祈禱,而是 Git
Git 就像是開發者的「存檔點(Save Point)」與「時光機」。它能記錄你程式碼的每一刻,讓你在出事時能隨時跳回那個「至少還跑得動」的時空。

今天我們就來聊聊 Git,從基礎的概念到專業開發者必備的進階技巧,一次幫你補齊!


1. Git 的三層世界觀:拍照存檔的藝術

在 Git 的世界裡,要把你的修改「存檔」,其實要經過三個階段。我們可以把它想像成拍婚紗照的過程:

  1. Working Directory (工作目錄):你正在寫 Code 的地方,就像是在更衣室換衣服。
  2. Staging Area (暫存區):你覺得這段 Code 寫得差不多了,把它加進來,就像是穿好禮服、化好妝,站在攝影機前面擺好姿勢。
  3. Repository (本地倉庫):按下快門,這張照片正式被記錄在相簿裡。

常用指令實作

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 1. 建立時光機入口:在資料夾內初始化 Git
git init

# 2. 查看當前時空狀態:看看有哪些檔案還沒「擺好姿勢」
git status

# 3. 將修改放入暫存區:準備好拍照
git add <檔案名稱或 . 代表全部>

# 4. 正式記錄時光:按下快門存檔
git commit -m "feat: 這裡寫下你這次做了什麼改動"

2. 分支(Branch):開啟平行時空的冒險

當你想要開發一個可能會「毀滅世界」的新功能,但又不希望影響到現在正跑得很順的版本時,分支就是你的平行宇宙。

你可以在 dev 分支裡瘋狂實驗,如果不小心把程式寫爛了,直接把這個平行宇宙毀掉(刪除分支)就好,主線(main/master)依然毫髮無傷。如果實驗成功,再把它「合併(Merge)」回現實世界。

1
2
3
4
5
6
7
8
9
# 開啟平行時空
git branch dev

# 跳躍到平行時空
git checkout dev

# (在 dev 寫完後) 回到現實世界,並合併成果
git checkout main
git merge dev

3. 給後悔藥一個機會:git revert — 安全的撤銷

人非聖賢,孰能無過?有時候 Commit 了才發現裡面有一行 Code 會讓伺服器爆炸。
這時候很多人會想到 git reset,但如果你已經把 Code 推送到 GitHub 上,千萬不要隨便用 reset,因為那會改寫歷史,讓你的隊友崩潰。

這時候 git revert 就是你的好朋友。它不會刪除舊的歷史,而是新增一個「反向」的 Commit 來抵消掉錯誤。就像是你在帳本上記錯一筆帳,你不是用橡皮擦擦掉,而是再記一筆「沖銷」進去。

1
2
3
4
5
# 撤銷某個特定的 Commit
git revert <commit-id>

# 撤銷完後,會自動產生一個新的 Commit,內容是將該次改動全部還原
# 這對多人協作的分支來說是最安全的操作!

4. 遠端協作:GitHub — 程式碼的社交舞台

GitHub 讓我們可以把本地的時光機記錄,推送到雲端的「備份中心」。這不僅是異地備援,更是讓你跟全球開發者(或是你的組員)同步時空的關鍵。

1
2
3
4
5
6
7
8
# 連結遠端基地
git remote add origin <GitHub 的 Repo URL>

# 將成果推上雲端
git push -u origin main

# 同步遠端的最新時空
git pull origin main

5. 專業修煉:當線圖開始變成「蜘蛛網」時…

隨著專案變大,你會發現 git pull 抓下來的歷史線圖變得很醜,充滿了「Merge branch…」的雜訊。這時候,資深開發者會使用 Rebase

維持線圖整潔:git pull --rebase

預設的 pullfetch + merge,會產生一個額外的 Merge Commit。而 --rebase 則是「將你的修改重新嫁接在最新的基礎之上」,讓歷史維持在一條直線上。

1
2
3
4
5
6
# 告別混亂的 Merge Commit,維持直線歷史
git pull --rebase origin main

# 如果發生衝突時,修完檔案後下這行繼續 rebase
git add <修好的檔案>
git rebase --continue

6. 離線協作與補丁:format-patcham

想像一個情境:你在一個極其機密的離線環境,或是你想提交 Code 給 Linux Kernel 這種不使用 GitHub PR 的專案。你可以把你的 Commit 封裝成一個 .patch 檔案

製作與套用補丁

1
2
3
4
5
# [製作補丁] 將最後一個 Commit 轉成 .patch 檔案
git format-patch -1

# [套用補丁] 正式吃下補丁,它會自動幫你產生對應的 Commit 與作者資訊
git am 0001-fix-bug.patch

結語:習慣大於指令

學會了這些指令,你的 Git 戰鬥力已經超越了大部分的初學者。但我還是要叮嚀一句:Git 最強大的不是指令,而是你的使用習慣。

嘗試練習「原子化提交(Atomic Commits)」— 一次只做一件事,就存一個檔。這樣當你真的需要坐時光機回去時,才不會發現一個存檔點裡塞了滿滿的垃圾 XD。

那麼今天也來一點簡單的練習吧!

  1. 嘗試在本地建立一個 Repo,完成一個 Commit 後,使用 git revert 撤銷它,看看 Commit 紀錄會發生什麼變化。
  2. 在你的 .gitconfig 裡加上 pull.rebase = true,感受一下整潔線圖的快樂。

有任何問題,歡迎在下方留言區討論喔!那麼,我們就下篇文章見囉,掰~

共發表了 172 篇文章 ‧ 總計 313.5k
使用 Hugo 建立
主題 StackJimmy 設計