版本控制簡單來說,就是把一個檔案所有歷史紀錄的版本都保存起來,像是做設計的同學一定有很深的體會。
最後同事都被弄到氣走了,這樣下去不是辦法,所以需要一個更有系統、且可以輕易比對各版本差異的模式來管理檔案。
以上是 Git 的好處之一,能幫你管理好檔案的所有版本。
第二是在開發新功能時,能夠同時保留不同功能版本,以利於之後的合併,例如:主要的穩定版 、 開發新功能版 、 修 bug 版 …
假如一個網頁資料夾,裡面有不同檔案互相有關聯的 index.html
, main.css
, index.js
,當你只改了其中一個檔案,那要怎麼做版本控制呢?
假設昨天修改了 index.html
,那就把原本的 web 資料夾
複製一份出來成 web_v2 資料夾
,這樣一個人做板控其實沒有什麼問題,但要是多人協作的情況呢?
假設現在跟同事在雲端的空間上都是同步著最新的 web_v2 資料夾
。
小花需要修改檔案,所以捉一份下來要改成 web_v3 資料夾
,但旁邊的同事小明剛好也抓了一份下來修改成 web_v3 資料夾
,造就了現在有兩份 web_v3 資料夾
,名稱一樣但內容不同的衝突情形。
所以為了解決這狀況,那就試著把資料夾名稱 web_v3
,轉成 hashes 亂碼 ,假設 hashes 是完全不會重複的,所以小花這份的資料夾名稱改成 eyokend3d28sf
,而小明的是 akuebh83ks02d
。
( 發現 main.css
打成 man.css
了,拜託忽略這個丟臉錯誤 )
( 提醒別人忽略是一件很矛盾的事 )
現在解決了版本號碼衝突的問題,但亂碼無法看出順序關係,該怎麼辦呢?
不如新增一個 版本紀錄.txt
,裡面記錄好上傳時間、上傳者、版本號碼:
4/15 08:00
, 小花
, eyokend3d28sf
4/15 08:05
, 小明
, akuebh83ks02d
檔案隨著時間越來越大,不好看出最新的版本怎麼辦,再新增一個 最新版本.txt
:
akuebh83ks02d
有些檔案確定不會變動,像是電腦設定檔、 log 檔、或者是你覺得沒有必要做版控的檔案,例如剛剛管理版本號碼的文件,那要怎麼做勒?很簡單,移出資料夾就就好了。所以我們最後的版本控制目錄會變成:
最新版本.txt
版本紀錄.txt
eyokend3d28sf/
index.html, main.css, index.js
akuebh83ks02d/
index.html, main.css, index.js
( 這兩個檔案只是拿來舉例 )
沒錯,這樣就是版本控制的雛形拉,沒想到原理沒有很複雜啊,那為什麼我之前看了一堆教程,對 Git 還是一知半解呢?( 回望過去 )
對版本控制有大致上的了解後,就可以開始正式使用囉。
init
版本控制初始化在桌面先開一個測試資料夾 git_test
, 打開 Terminal、將當前目錄改到 git_test
,輸入 git init
,會發現多了一個 .git
的隱藏資料夾。
小技巧:
Mac 預設是看不到隱藏檔案的。想要開啟可以參考:三招讓 Mac 顯示出隱藏檔案
status
查看狀態顧名思義就是查看狀態,非常常用的指令,有事沒事就查看一下,保佑全家健康、版本正常。
( 按 Q
跳出 )
add
被選上的孩子們把檔案移到 git_test/
裡面,用 git status
查看狀態會看到下圖:
看到 檔案內容用紅字標示 ,表示這些檔案雖然在此資料夾中,但並 沒有加入版本控制 ,Git 提供很貼心的提示(黃框內),表示你可以用 git add <檔案>
加入版控。
那就按照提示用 git add index.html
讓 index.html
加入版控,再用 git status
查看狀態,會發現 檔案被分成兩個區域,分別是 Stage (有版控) 、 Untracked (沒版控)。
可以看到粉紅線提示:
git add <檔案>
git rm --cached <檔案>
可是如果有超多檔案,可以使用 git add .
,把全部檔案加入版本控制。
commit
新建版本 - 人生 on-line 不要忘了存檔安排好了哪些檔案要加入或不加入版控了,接下來要開始新建人生的第一個版本,以剛剛「簡易版控」的例子來說,就是新增一個資料夾。
git commit
git commit -m <訊息>
注意:
如果檔案有變動,想要再提交一次 commit 之前,還是需要再輸入
git add <該檔案>
,不然是無法 commit 的喔!
( 慘痛教訓要記下來 )
log
回顧 - 偉人都會有個時間軸當然也可以查看其中的版本紀錄,就像「簡易版控」的 版本紀錄.txt
一樣,內容有:版本號碼、提交者、提交時間。
git log
查看
git log --oneline
: 輸出更簡潔的 log ( 差點看成 on-line )
hashes 前七碼
& commit message
checkout
切換版本 - 回到人生的存檔點人生無法隨意切換存檔點,Git 可以。
git checkout <版本號碼>
:切換到任何 commit 過的版本git checkout master
:切換到最新版本.gitignore
忽略不要版本控制的檔案 - 派對中的邊緣人還記得剛剛學到 add
指令時,檔案會分成兩區嗎?( 版控&非版控 )
每次提交 commit
前都一定要 add
需要板控的檔案,但輸入 git add .
提交所有檔案,又會把不要的檔案 add
進來。
因此 邊緣人列表 .gitignore
閃亮登場,把不需要版本控制的檔案記錄在 .gitignore
裡,之後就可以放心使用 git add .
,省得擔心會加到不必要的檔案。
注意:
.gitignore
檔案本身也需要加入版本控制( 此例中的邊緣人就是 history.txt
跟 new.txt
,一樣只是拿來舉例 )
想知道一般 .gitignore
會紀錄哪些檔案,可以參考 Huli 舉出 Facebook 的開源專案 React 裡的 .gitignore
示範。( 覺得很棒!不然憑空真的不好想像 )
commit -am
一次完成有沒有人跟我想的一樣,人生的麻煩還不夠多嗎?每次都要 add
再 commit
也太累了吧~
所以救星出現了!
git commit -am "message"
:
-m
,多一個 a
就可以讓兩個動作一次完成。git commit -am "message"
當成習慣,省得忘記 add
的麻煩。add
因為很遺憾的,救星沒有這麼給力,根據 Git 官網文件:
Tell the command to automatically stage files that have been modified and deleted, but new files you have not told Git about are not affected.
意指 -a
不適用於新增的檔案,所以如果有新檔案的加入,還是得先 add
再 commit
。(深呼吸)
diff
查看與上一版本不同之處git diff
: 能夠查看檔案與上一版本的內容差異( 按 Q
跳出 )
( Terminal 的顏色還沒改好、所以不是很明顯,通常以新增的內容會用綠色表示、減去用紅色表示。 )
複習以上學到的,要開始使用 Git 的步驟如下:
括號的內容:對照「簡易板控」的步驟
git init
: 初始化.gitignore
: 忽略不需要版本控制的檔案git add .
: 把需要版本控制的檔案加進去( 新增一個暫存資料夾 temp/
,把東西丟進去 )git commit -am "message"
: 新建一個版本 ( 把 temp/
資料夾名稱改成版本號碼 hashes/
)
git commit -m "message"
git diff
查看與上一版的差異。git checkout <hashes>
: 可以切換各個版本 ( 切換各個 hashes/
資料夾)
git checkout master
: 回到最新版本( 以上內容大部分是 程式導師實驗計畫第三期 的學習筆記,如有錯誤歡迎糾正,非常感謝 🤓 )
Written on April 16th, 2019 by Yakim shu