Git 整理筆記 (一)

LUFOR129
Sep 10, 2021

這個月參加了IT鐵人30天賽(Lufor)。把在上面寫東西順便整理一下發過來,算是偷偷蹭幾天文章。

Git簡單的來說,就是版本控管工具,幾乎所有的軟體業求職,都要求你必須要能夠先有Git的技能。不難理解,現代的系統龐大,已經不再是單打獨鬥的時代了,現在講求團隊共進退。但是團隊合作就會有摩擦。

  1. 我要怎麼看到你昨天寫好的程式?
  2. 你我同時修改一份文件該怎麼決定誰的要上去?
  3. 我把code寫壞了,該如何回復之前可以RUN的版本來更詳細的檢查錯誤?

這些就是為什麼你要使用GIT!

Git 安裝

git 的安裝非常簡單,如果你是Windows前往https://git-scm.com/ 直接下載即可; 如果你是Linux如Ubuntu則可以輸入sudo apt-get install git-all。之後的文章以Windows為例子,Visual Studio Code作為開發工具做說明。

Windows安裝完成後會多了一個十分好用的工具,GIT CMD。他可以在windows內使用linux指令如lsclear,是一個值得加入工具列的好東西。

但是我們這裡不用GIT CMD,我們來用來用Visual Studio開發。這裡推薦兩個好用的Git相關模組。

  • Git History (畫出漂亮的Git logs圖)
  • Git Lens (方便對比code)

Git 的使用

一個專案要怎麼開啟版本控管? 輸入 git init

之後在當前目錄底下會自動新增一個.git目錄。該目錄會記錄下此當前目錄的所有資訊,那些程式修改、有哪些branch、現在HEAD在哪…等。

我們可以將寫好的code分成三個區塊的歷程。

  • 工作區 : 修改程式的地方
  • 緩衝區 : 將暫時修改好的程式保存起來
  • 歸檔區 : 永久的保存此次更新

檔案具體在哪一區可以用git status來查看

具體步驟是怎麼樣呢? 假如我今天新增了一個Apple.txt裡面寫上one Apple。那麼這個檔案就會處在工作區中,代表檔案隨時都會變動。

輸入git add Apple.txt,將Apple.txt放入緩衝區中,代表暫時保存起來。這個暫時保存是隨時都可以覆蓋過去的,我可以修改文件成two Apple然後重新git add。此外,如果要add的檔案太多了,可以用git add .將當前目錄下所有檔案都add進去。

如果你認可了此次的修改,你想要永久保存起來,可以下git commit -m "modify Apple",將緩衝區的所以修改歸檔在歸檔區,如此便成為了一次修改完成。-m後面接的註解便是你為了這次的修改所做的註解。commit後也會自動生成是誰commit、時間....等相關訊息。通常我們完成一個任務就會commit一次,不論這個任務是大是小。

輸入git log就可以看到此次的commit了。

Git 回推版本 (reset)

使用Git的一大好處就是,當我的程式在改動的過程中發生了難以修復的錯誤,我們可以透過版本回推來還原。承接上一章節,我們先來建立多個commit。

輸入git log --gragh如上圖,我們新提交了3個commit,分別是新增修改1、新增修改2、把修改1改成修改3。HEAD->MASTER代表我們MASTER HEAD目前處於最新的"修改1變成修改3"的commit下。

就像是在一篇文章講的,我們在修改、commit有分為三大區塊:工作區、緩衝區、歸檔區。因此我們回推也可以選擇回推不同的程度。下達git reset <不同回推程度> <哈希(前七碼)>即可進行回推。

(哈希可由reflog查看)
git reset --soft <哈希>
# 還原commit (但還是有被add)
# --soft只回原歸檔區
git reset --mixed <哈希>
# 然後查看git log 會發現之前提交的消失了
# 但是程式碼沒有變動(尚未回滾)
# --mixed 是同時對歸檔區與緩衝區做回滾。
# 所以此時modify尚未add
git reset --hard <哈希>
# 還原commit全部,包含程式碼
# --hard還原歸檔區、緩衝區、工作區

soft、mixed、hard分別代表三種不同的回推程度。具體可以看下圖:

實際來下達git reset --mixed f81792d (回到修改二),可以看到程式還原到尚未add的狀態。

revert

git revert <哈希>同樣的能夠回復程式,但是邏輯不太一樣。來實際git revert f81792d(修改二),這樣就會把修改二的東西都回推掉,類似hard模式。

回朔的邏輯是用一個新的commit來去覆蓋之前的修改

revert可以用在修改前輩的程式上,想要回推前輩的東西,但是又不敢亂來。利用revert可以保留前輩之前的commit。不過基本上不常用啦,如果真的要保留,應該要用checkout一個新的分支。

--

--