[DAY8] 初學 Git (上)


什麼是 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

  1. 在目標資料夾下,用 git init 初始化 Git 。
  2. 設定不想加入 Git 的 .gitignore
  3. git add . 將所有檔案放入暫存區(倉庫前廣場),然後再 git commit -m 建立新的版本(塞進倉庫)。
  4. 上個步驟也可合併成 commit -am ,但要注意若有新增的檔案,還請乖乖使用 git add
    額外補充: git giff 可以看不同版本之間的差異。

下篇預告

branch的概念和常用指令、github是什麼、以及其他 Git 狀況模擬。

參考資料:

為你自己學 Git
檔案狀態

180天成為工程師






Related Posts

漫談傳輸介面-UART

漫談傳輸介面-UART

[ JavaScript  12 ]  ES6 新增特性

[ JavaScript 12 ] ES6 新增特性

Google Cloud Source Repositories 使用紀錄

Google Cloud Source Repositories 使用紀錄



Comments