什麼是 Git ?
Git 是一種版本控制的系統。結束。
——等等,那什麼又是版本控制?
玩遊戲時可以將進度存檔,要是之後被打死就可以回到這個紀錄時間點重來。另外像是寫報告時會出現報告_final.docx
、報告_final_final.docx
、報告_final_final_final.docx
,其實就是版本控制的概念。
(圖為 Undertale 的存檔畫面,只是想放點有趣的東西增加學習動機)
工作時很多人負責同一個專案出問題,想知道誰在哪個時間點寫錯程式碼嗎?或是正在開發新功能同時需要修 bug ,兩者必須分開進行又不想刪掉手邊正在開發的新功能嗎?版本控制都能輕鬆讓你回到世界還很單純的時刻 (?)
無論是自己還是多人版本控制,東西太多時就會混亂,就需要有個系統幫忙進行版本控制,而 Git 就是這樣的一個系統。
從零開始思考版本控制
在了解 Git 之前,先試著想想如果要設計一個管理版本控制的系統,會需要甚麼樣的架構?
可能情況一:
同時管理兩個以上有關聯的檔案,如果每個檔案的版本分開紀錄,資料夾很有可能會變成這樣:
這個檔案.txt
這個檔案_版本二.txt
那個檔案.txt
那個檔案_版本二.txt
那個檔案_版本三.txt
然後你同事轉過來問你:「ㄟ當初那個檔案的版本二,是對應到這個檔案的哪個版本啊?」結果你也忘記,尷尬。
解決方法:
大家捆起來一起做版本紀錄,就像是把全部的東西放進資料夾裡面,最後主目錄會變成這樣:
專案資料夾(內含這個檔案.txt、那個檔案.txt)
專案_版本二資料夾(內含這個檔案.txt、那個檔案_版本二.txt)
專案_版本三資料夾(內含這個檔案_版本二.txt、那個檔案_版本三.txt)
可能狀況二
五個人同時負責同個專案,版本名稱好像不能單純用數字命名了。
解決方法:
不要糾結命名方法了, Git 直接亂數命名,然後開一個檔案紀錄版本們的時間和修改者等資料,還有一個檔案紀錄哪個是最新版本。
說了那麼多,終於要開始使用 Git 了
推薦使用 Git Bash ,下載方式可參考我之前寫的: [DAY4] 初學Command Line
常用指令整理
指令 | 功能 | 其他 |
---|---|---|
git init | 初始化 | 成功後會建立 .git 的隱藏資料夾 |
git status | 看狀態 | |
git add | 將檔案加入版本控制 | |
git rm --cached | 將檔案移除版本控制 | 若沒加 --cached 會直接刪掉檔案,要小心 |
git commit | 建立新的版本 | 最後可加 -m "敘述" 可對 commit 做說明 |
git log | 查看歷史紀錄 | |
git checkout | 回到某個版本 | |
git branch | 和 branch 有關 | 可直接加名稱新增branch |
-v 查看現在有哪些 branch |
||
-d 刪除 branch |
||
git branchout | 切換 branch | |
git merge | 合併 branch | 把 branch 合併進來 |
init
首先要讓 Git 連接資料夾,確認位置在目標資料夾後輸入:
git init
之後輸入 ls -a
查看所有檔案,會發現多了一個 .git
的隱藏資料夾,就表示初始化成功了。
status
git status
可查看現在 Git 內的狀況。
Git 運作方式
Git可以的工作區塊可以分成三個,分別是工作目錄 (Worling Diretory)
、暫存區 (Staging Area)
和 儲存區 (Respository)
。
可以把儲存區想成一個倉庫,每次有或從外面(工作目錄)送進來前,都會先放在倉庫前面的廣場(暫存區),都好了才開門一次放進倉庫,這樣除了倉庫門不用開開關關外,裡面的人也比較好清點貨物。
如何解讀 status
以下圖為例
On branch master
:目前沒有分支。
Changes to be committed
:將要提交的檔案。也就是在廣場捆好等倉庫門打開就可以直接運送進去的檔案。
Changes not staged for commit
:被更動尚未要提交的檔案。其實也在廣場,只是門打開時無法被送進去。
Untracked files
:未被追蹤的檔案。還沒進入廣場。
常用指令
區域之間的關係和移動檔案的方法,可以用下圖解釋:
加入/移出版本控制
git add "欲加入檔案名稱"
git add
可將檔案從 untrscked 的狀態加入版本控制。
與之相反的是:
git rm "欲移出檔案名稱" --cached
記得一定要加 --cached
,不然檔案會被刪掉。
小技巧:
對象是所有檔案時,可使用.
或-all
,不用一個一個輸入。
兩者差異可參考:把檔案交給 Git 控管
細節:暫存區的檔案修改完後,要再 add
一次,不然不會 commit。
增加新的版本
在廣場準備得差不多了,可以打開倉庫門將檔案存入做為新的版本:
git commit (欲放入 respository 的檔案)
enter 後會進入 vim ,這時可以輸入對這個新版本的敘述,完成後就算是建立一個新的版本了。
git commit -a
:將暫存區所有檔案一起存入新 commit 。
git commit (欲放入 respository 的檔案) -m "敘述"
:不用進入 vim ,直接寫好 commit 的附註。
git commit -am "敘述"
:上面兩者的合體技,一起存入後寫好附註。
查看歷史紀錄
git log
會出現各個版本的歷史紀錄,比較新的 commit 會在上方,其中顯示的格式如下:
commit 457d6edf9bd8355014956d497f8617980b76cf9f #幾乎沒有意義的名稱
Author: 編輯者名字 <編輯者信箱>
Date: Fri Jun 19 17:38:55 2020 +0800 #最後修改時間
123 #說明
如果想看比較簡潔的,可以用 git log --oneline
,歷史紀錄會以 名稱前五碼 說明
的形式條列。
切換到某個版本
想切到某個版本,可以用:
git chechout (欲切回版本名稱)
如果要切回最新版本,可用 git checkout master
。
要忽略的檔案
有些檔案(例如說明文件)雖然在資料夾內,但不太常修改,因此我們不想將它加入 Git 中,此時可以將它加入 .gitignore
中。
首先用 vim .gitignore
打開文字編輯器,進入 vim 後輸入欲加入的檔名後離開就算完成了。之後就算使用 git add .
也不會將這些檔案加入 Git 了。
複習
下載完 git 後,如何將檔案移入 commit
- 在目標資料夾下,用
git init
初始化 Git 。 - 設定不想加入 Git 的
.gitignore
。 git add .
將所有檔案放入暫存區(倉庫前廣場),然後再git commit -m
建立新的版本(塞進倉庫)。- 上個步驟也可合併成
commit -am
,但要注意若有新增的檔案,還請乖乖使用git add
。
額外補充:git giff
可以看不同版本之間的差異。
下篇預告
branch的概念和常用指令、github是什麼、以及其他 Git 狀況模擬。