前言:你還在用「最終版_真的最後一版_絕對不改版.zip」嗎?
相信各位在剛開始寫程式的時候,一定遇過這種悲劇:
剛寫好一個功能,結果手賤改了一下,程式就再也跑不起來了,而且你完全不記得剛才動了哪一行。
或者是跟同學協作專案,大家用隨身碟傳檔案,結果你的程式碼被別人的舊版本覆蓋掉,瞬間心血化為烏有。
如果你有以上症狀,那麼你需要的不是祈禱,而是 Git。
Git 就像是開發者的「存檔點(Save Point)」與「時光機」。它能記錄你程式碼的每一刻,讓你在出事時能隨時跳回那個「至少還跑得動」的時空。
今天我們就來聊聊 Git,從基礎的概念到專業開發者必備的進階技巧,一次幫你補齊!
1. Git 的三層世界觀:拍照存檔的藝術
在 Git 的世界裡,要把你的修改「存檔」,其實要經過三個階段。我們可以把它想像成拍婚紗照的過程:
- Working Directory (工作目錄):你正在寫 Code 的地方,就像是在更衣室換衣服。
- Staging Area (暫存區):你覺得這段 Code 寫得差不多了,把它加進來,就像是穿好禮服、化好妝,站在攝影機前面擺好姿勢。
- Repository (本地倉庫):按下快門,這張照片正式被記錄在相簿裡。
常用指令實作
| |
2. 分支(Branch):開啟平行時空的冒險
當你想要開發一個可能會「毀滅世界」的新功能,但又不希望影響到現在正跑得很順的版本時,分支就是你的平行宇宙。
你可以在 dev 分支裡瘋狂實驗,如果不小心把程式寫爛了,直接把這個平行宇宙毀掉(刪除分支)就好,主線(main/master)依然毫髮無傷。如果實驗成功,再把它「合併(Merge)」回現實世界。
| |
3. 給後悔藥一個機會:git revert — 安全的撤銷
人非聖賢,孰能無過?有時候 Commit 了才發現裡面有一行 Code 會讓伺服器爆炸。
這時候很多人會想到 git reset,但如果你已經把 Code 推送到 GitHub 上,千萬不要隨便用 reset,因為那會改寫歷史,讓你的隊友崩潰。
這時候 git revert 就是你的好朋友。它不會刪除舊的歷史,而是新增一個「反向」的 Commit 來抵消掉錯誤。就像是你在帳本上記錯一筆帳,你不是用橡皮擦擦掉,而是再記一筆「沖銷」進去。
| |
4. 遠端協作:GitHub — 程式碼的社交舞台
GitHub 讓我們可以把本地的時光機記錄,推送到雲端的「備份中心」。這不僅是異地備援,更是讓你跟全球開發者(或是你的組員)同步時空的關鍵。
| |
5. 專業修煉:當線圖開始變成「蜘蛛網」時…
隨著專案變大,你會發現 git pull 抓下來的歷史線圖變得很醜,充滿了「Merge branch…」的雜訊。這時候,資深開發者會使用 Rebase。
維持線圖整潔:git pull --rebase
預設的 pull 是 fetch + merge,會產生一個額外的 Merge Commit。而 --rebase 則是「將你的修改重新嫁接在最新的基礎之上」,讓歷史維持在一條直線上。
| |
6. 離線協作與補丁:format-patch 與 am
想像一個情境:你在一個極其機密的離線環境,或是你想提交 Code 給 Linux Kernel 這種不使用 GitHub PR 的專案。你可以把你的 Commit 封裝成一個 .patch 檔案。
製作與套用補丁
| |
結語:習慣大於指令
學會了這些指令,你的 Git 戰鬥力已經超越了大部分的初學者。但我還是要叮嚀一句:Git 最強大的不是指令,而是你的使用習慣。
嘗試練習「原子化提交(Atomic Commits)」— 一次只做一件事,就存一個檔。這樣當你真的需要坐時光機回去時,才不會發現一個存檔點裡塞了滿滿的垃圾 XD。
那麼今天也來一點簡單的練習吧!
- 嘗試在本地建立一個 Repo,完成一個 Commit 後,使用
git revert撤銷它,看看 Commit 紀錄會發生什麼變化。 - 在你的
.gitconfig裡加上pull.rebase = true,感受一下整潔線圖的快樂。
有任何問題,歡迎在下方留言區討論喔!那麼,我們就下篇文章見囉,掰~
