前言
為什麼寫程式要做版本控制呢?我每天一直寫一直寫,永遠都會是最新版本啊!
- 理由很簡單:
- 有可能哪天突然要回復成以前的版本,一但先前沒有備份就糟了。
- 可能我不確定老闆最後要的是什麼樣子,所以我提供不同版本的樣式給老闆選擇。
- 其他雜七雜八的理由。
- 一但有了版本控制,哪天突然需要查閱以前的資料,心裡就會有安心的感覺,還好我有保存起來。
此文章會介紹到的指令
git init
: 初始化
建立檔案.gitignore
: 忽略不需要版本控制的檔案git add .
: 把需要版本控制的檔案加進去( 新增一個暫存資料夾 temp/,把東西丟進去 )git status
:查看目前版本的相關資訊git log
:查看歷史版本的相關資訊git commit -am "message"
: 新建一個版本
如果步驟 (3.) 已經完成的話,也可以直接用 git commit -m "message"
可以用 git diff 查看與上一版的差異。git checkout <hashes>
: 可以切換各個版本git checkout master
: 回到最新版本
怎麼做版本控制
從我們熟悉的方式說起:
假設我們要開始找工作,需要寫出自己的履歷表。
- 我需要分成
中文
和英文
的版本 前端
和後端
的職位不相同,履歷也要區分開來- 某間公司我特別喜歡,我要獨立出來做一個特別版本
那我應該要怎麼做?
- 建立一個叫做
中文版
的資料夾,及一個英文版
的資料夾。 - 底下分別在建立
前端版本
及後端版本
的資料夾。 - 看看我現在做的履歷屬於哪個一個版本,就存放在對應的資料夾底下。
- 哪天我需要找 前端英文版履歷,我就可以去 英文版 及 前端版本 資料夾底下找。
現在我們換個情境
上次的履歷做的非常好,現在已經找到了喜歡的工作,為了與同事們合作完成一份專案,我們在網路上建立了雲端資料夾來進行版本控制。結果遇到了一些問題:
- 藍寶做了一個新的資料夾叫做
新版 2.2
,結果痞子妹剛好新增了一個資料夾也叫新版 2.2
。兩個資料夾名稱一樣,結果內容不同。 - 睏寶正在編輯
project_sleep
這個檔案,正好海盜船長也在自己的電腦修正同一個檔案,睏寶先編輯完後上傳到資料夾,海盜船長比較晚完成,但也把完成的檔案上傳上來,結果睏寶編輯好的檔案就被 覆蓋 掉了。
一但開始多人協作,事情就變得沒這麼簡單
Git 的版本控制
- 首先要解決版本名稱相同的問題,就必須讓版本名稱亂到幾乎不可能相同。
- 於是 Git 就將版本名稱轉成 hashes 亂碼,再額外用一個紀錄檔紀錄這個亂碼對應到的是哪一個版本,使得版本名稱不會發生重複。
- 接下來來解決檔案被
覆蓋
的問題。- 每當建立好版本的時候 Git 會去記憶檔案改動的內容,若是新的檔案要去取代掉原先的檔案時,發現兩者內容有衝突,Git 會提醒使用者修正有衝突的部分。
開始使用 Git
init
版本控制初始化
- 先在電腦建立一個要做為版本控制的資料夾,接著打開神奇的 Terminal 把位置切換到剛剛建立好的資料夾中。輸入指令
git init
,資料夾裡面就會出現一個.git
的隱藏資料夾。
status
查看狀態
- 用於確認現在的版本狀態,哪些檔案有加入版本控制,現在在哪一條
branch
等等。 - 使用方式:
git status
add
加入版本控制
- 每新增一個檔案,我們要讓電腦知道,這個檔案要不要做版本控制。
- 若是沒有加入版本控制,Git 會在訊息中提醒你。
- 使用方式:
git add <檔案名稱>
:將這個檔案加入版本控制git add .
:將這個資料夾下的全部檔案加入版本控制git rm --cached <檔案名稱>
:將檔案解除版本控制
commit
建立版本
幫目前的資料存檔,建立新的版本
做一次
commit
就好像幫你的資料夾拍一張照片!幫你記下現在每個檔案長什麼樣子,我每做一次commit
就再拍一張新照片。我可以隨時回來查看曾經拍過的照片。使用方式:
git commit
會跳出 Vim 的介面要求你將版本做命名git commit -m <名稱>
直接建立版本並完成命名git commit -am <名稱>
跳過add
的步驟。將所有檔案加入版本控制,建立新版本,並完成命名。(三個願望一次滿足)-am 無法把新建立的檔案加入版本控制,需要先輸入 git add 再做 commit
注意!
當檔案發生改動,想要提交 commit 之前,Git 會要求你再輸入
git add 檔案名稱
。除非直接使用git commit -am 名稱
這個指令。
log
查看紀錄
- 查看先前版本的版本號碼、提交者、提交時間。
- 使用方式:
git log
checkout
警察臨檢,把所有東西都拿出來給我檢查!
- 可用來查看任何版本的內容
- 在沒有其他 branch 的情況下
- 輸入
git checkout <版本號碼>
:切換到任何 commit 過的版本 - 輸入
git checkout master
:切換回最新版本
- 輸入
- 若是有新增 branch
- 輸入
git checkout <branch_name>
:切換到任何 branch
- 輸入
.gitignore
忽略不需要版本控制的檔案
- 前面提到在提交
commit
之前,Git 會要求輸入git add <檔案名稱>
將修正過的檔案加入版本控制。但是如果我真的有些檔案不想要加入版本控制呢。 - 可以將這些檔案紀錄在
.gitignore
當中,這樣git add .
就不會加到不必要的檔案了。
diff
查看版本差異
- 用來比較新舊版本所做的改動
後記
一開始在學習用 Git 做版本控制,真的複雜到不行。還好 Huli 講解的很淺顯易懂,才讓我即便瞎子摸象,至少還摸得出鼻子在哪。
接下來另外還要寫一篇關於 版本控制 GitHub 的文章,紀錄版本控制如何結合 GitHub 來完成。