你沒聽錯。

好啦,剛剛那句有點欠揍 lol。不過從標題來看,你大概早就猜到這篇文章要講什麼了。
Git 這東西大家都聽過。不過先別跟 GitHub 搞混了。它們是兩個不同的東西。
我有用過 Git,但不是大多數人那種用法,而是透過 GitHub Desktop。 我從一開始就用 GitHub Desktop,因為它的介面很友善,而且很好上手。

那問題是什麼? 問題就在於我一直在用 GitHub Desktop。我的履歷上寫了「Git」,但因為我其實是透過 UI 在操作,總覺得怪怪的。
我覺得學習透過 CLI 使用 Git 是個好主意。這樣我就能同時理解 UI 世界和命令列世界!我知道有時候學新東西很難,所以我想最好先向社群請教還有哪些指令值得學,也希望這篇文章能幫助其他新手和老手重新複習一些 Git。
話說回來,如果你是那種做 Git 主要依賴 UI,想學幾個 Git 指令讓自己更上手的人,這裡就是讓你 git gud 的地方!以下是一些適合入門的 Git 指令,對應 GitHub Desktop 的常見操作,也能幫助你開始養成在終端機中使用 Git 的習慣! 這份清單會按照從開始到接近完成任務/專案的順序來排。我也會拿《空洞騎士:絲之歌》來當作視覺化比喻,如果你是視覺型學習者的話。
注意: 這是我在從 GitHub Desktop 轉向學習 Git 指令時的經驗整理。如果有我漏掉的地方,或有需要更新的資訊,歡迎告訴我!
如果你要開始一個新專案,這就是第一個應該下的指令!就算你已經有一個現成的專案,但還沒有初始化 Git,那也最好先執行這個指令!
可以把它想成在《空洞騎士:絲之歌》裡開始一個新遊戲。開始遊戲之後,你就能使用更多功能,這些我們等一下會講到。

注意: 如果你是從 GitHub clone 一個已經初始化過 Git 的專案,就不用做這一步。你想做也可以,但那就沒有意義了。
說到現成專案,如果你想把一個已存在的專案抓到自己的電腦上,就是用這個指令!
例如,如果你想 clone Forem(dev.to)的 repository,可以透過網站上的網址來做:

更具體一點,就是複製 HTTPS 連結:

接著,在你的 VS Code 終端機裡輸入:
git clone https://github.com/forem/forem.git
可以把這想成你在遊戲裡打開一個既有的存檔。就這麼簡單。
如果你是把別人的檔案抓下來,匯入到自己的電腦,我會把它理解成:預設對方已經把所有東西都裝好了。如果那個檔案是舊的,你就得更新它。套到程式開發的情境,如果他們沒有 Git,就先執行 git init。
注意: clone repository 的時候,記得要在一個空資料夾裡操作。
現在你有一個專案,然後像其他開發者一樣,你對專案做了一些修改。
<img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/7fjp96q20vt2c69x9prv.gif" />
在把你的變更送到 GitHub 的 branch 之前,你要先把改過的檔案加入,然後再 commit。
如果你修改了很多檔案,而且想一次全部包含進同一次 commit,你可以這樣做:
git add .
不過,如果你只想把某個特定檔案加入 commit,就要找到那個檔案路徑。舉例來說,如果我改了一個叫做 tests.js 的檔案,而且它放在 app 資料夾裡,那就會是:
git add /app/tests.js
如果你不小心把所有檔案都加入追蹤了,可以用下面的指令把全部還原:
git restore .
如果是特定檔案,照樣需要檔案路徑:
git restore /app/tests.js

我會把這想成你在玩遊戲時,有時候會裝備護符,我把它當成「已追蹤檔案」,而你的物品欄則像是「未追蹤檔案」。裝備上的東西就是你要實際使用的,而物品欄則是你目前收集/修改過的東西清單。


當你根據前面的指令把檔案加入之後,就可以準備 commit 了!我把這想成一個「存檔點」。就像你在繼續玩之前先存檔一樣。
如果之後發生了完全失控的狀況,你可以回到前一個 commit。舉例來說,你有 3 個 commit:
A --> B --> C(你現在在這裡)
如果你想回到「B」,就要先找到「B」那個 commit 的 hash,然後用下面的方式還原:
# 找出 commit hash
git log
# 還原特定 commit
git revert <commit-hash>
就像在遊戲裡一樣,你可以回到前一個存檔點。
小提示: 一定要把 commit 訊息寫清楚,描述你做了什麼。最好像
git commit -m "修正重新導向的 bug",而不是寫成git commit -m "更新檔案"。
到這時候,你應該已經有不少 commit 和變更了。是時候把它們推送到 GitHub repository 上了!這就是要用的指令!
不過,最佳實務是先把 GitHub 上的變更抓下來,方法如下:
git fetch origin main
有時候,如果 repository 上已經有變更,但你的本機開發環境還不是最新,就可以在 fetch 完之後再執行:
git pull origin main
我會把這理解成遊戲版本更新。如果遊戲不是最新版,你就先「fetch」最新版本,然後把版本更新上去。這樣存檔才會正確。如果你的存檔資料和遊戲目前版本不一致,很可能就會造成衝突;不過這部分我們不展開,因為這篇主要是講基礎。
如果你想建立一個分支:
git branch nameBranch
要切換到那個分支,並在那裡進行開發:
git checkout existingBranch
小提示: 如果你想用一條指令同時建立分支並切換過去,可以使用下面這個指令。感謝 @inayi 的留言提供!
git checkout -b branchName
它主要會顯示給你看的,是哪些檔案已經被追蹤,以及哪些還沒有被追蹤。被追蹤的檔案就是即將被 commit 的檔案。未追蹤的檔案則是已經變更了,但還不是下一次 commit 的一部分。 這個指令能幫助你掌握哪些檔案有改動,以及哪些檔案會被包含進 commit。
就這樣。它不是完美的,而且我很有可能漏掉一些東西,不過至少這是一個很好的開始,能幫助你慢慢從 GitHub Desktop 轉向學習這些指令。 當然,還有很多我沒提到的功能,例如 git merge 等等,但我想保持簡單。再者,這篇文章是基於我的經驗,以及我常用、也在本文中提到的指令。
如果你想學更多 Git,可以參考官方文件:https://git-scm.com/docs
當然,前提是你想這麼做……

不然就會被詛咒。
說到 Doom,Doomsday 的新預告片已經上線了,而且根本就是 Doom 的氣場農場 lol。
https://www.youtube.com/watch?v=X1aFkAkFASk
如果你還知道其他值得學的指令,歡迎留言,並把這張圖片一起附在你的留言裡!(見下方) 如果你只是剛好路過,我也很想看到 Hornet 說「Git Gud!」的那張圖片 :D

<center><sub>請把這個加到你的留言裡!</sub></center>
<center><b>有問題或想留言嗎?很期待聽到你的想法!</b></center>
<center>
<img src="https://dev-to-uploads.s3.us-east-2.amazonaws.com/uploads/articles/im64jcvto7ehrjyyqfaa.png" />
</center>