在開發程式的時候,通常會利用Git進行專案的版本控制,但是事實上不少工程師,甚至是資深工程師,都有可能誤用或是誤解Git正確的用法,其實之所以會有這些誤用,只能說是因為網路資訊普及造成的現象,當自己什麼都不清楚的狀況下,很容易在初學的階段就輕易相信別人所說的話,所以導致不經意的錯誤觀念不斷誤用,以下將整理一些重點給大家知道。

為什麼會學不好Git

  1. 情境跟指令搭不起來
    有些指令根本不是做那些事情,反而拿去使用了這些指令,可能會導致專案版本控制出了狀況。
  2. 基本認知有錯,把它當FTP在用
    很多人以為Git不就是像GitHub那樣把檔案放到雲端上管理,但是事實上那根本不是Git在做的。

先來提供學習資料

  1. Gitbook
    這邊我要推薦五倍紅寶石的高見龍老師的網站,當然你也可以買他的書,但是他的書本事實上幾乎跟網站上的資料一模一樣,但是你也可以購買他的書當作是贊助和保養自己的眼睛用。我們公司也請過高大大來演講過不少次,都有把很多Git的精華提供給我們受益良多,這邊也希望能夠幫他多推廣知識,讓更多知道Git真正的用法。
  2. 官方網站
    現在網路流通的時代,導致太多人喜歡看懶人包學習,導致基本功容易不扎實,但事實上官方文件是最詳細的,所以請多閱讀官方文件,對自己絕對不吃虧。

什麼是Git

  1. Git是眾多版本控制軟體的其中之一
    事實上有很多版本控制的軟體,但是Git在近日是最突出的,是目前業界最多人使用的版控軟體沒有之一
  2. Git就像是檔案的時光機
    當你搞砸了你的專案,你並不需要找以前的備份檔,因為他本身就是一個時光機,可以讓檔案回到指定的時間點
  3. 知道每一行程式碼在什麼時間寫的
    當然也可以知道哪一行是誰寫的。
  4. 作者是Linux Torvalds
    一開始作者只是為了管理Linux kernal而創造了Git,而且作者只花了10天的時間就把Git實作完成了,厲害吧?

Git的特色

  1. 開源且免費使用
  2. 速度快檔案小
  3. 同時支援本地及遠端操作
    你在本地端可以離線操作
  4. 容易與其他人共同協作 (前提:讓大家Git怎麼用)
  5. 是一種容易學不容易精通的工具

時間無法重來,但是Git可以

為什麼不斷強調這句話呢?因為Git非常的強大,他可以紀錄你在程式上所做的任何一舉一動,包含任何的還原紀錄都能紀錄。
因此,你可以還原到你的歷史紀錄,你也可以還原你所做的還原。

Git該學多深


Git的指令並不需要每一個指令都會,畢竟每次改版都會新增一些陌生的指令。
你只需要學好常用的20%左右的指令,即可在工作上正常使用了。

如何學習Git

一開始請多善用Terminal介面學習Git,少用GUI
不過通常工作上,為了便利偶而還是會利用GUI減少工作時間,例如:刪除大量branch。

.git就是所有的精華

.git裡面記錄著很多重要的資料,但是初學的你只需要知道以下三者即可。

  1. 工作目錄 Working Directory
  2. 暫存區域 staging
  3. 儲存庫 repository

工作目錄送到暫存區域

以下示範簡易的Git使用

  1. 新增檔案

    1
    touch index.html
  2. 檢查狀態

    1
    git status
  3. 加入暫存區域

    1
    git add index.html
  4. 新增hello 和 world
    指令同上

  5. 存檔

    1
    git commit -m “init commit”

commit紀錄要怎麼寫

如果是你私人的專案,那當然你要一路寫save或update也沒人會跟你計較。
但是如果是公司的專案,也許你詞窮不知道要怎麼寫,但是至少你要描述出你在這次修改做了什麼動作,不然別人在追蹤的時候會不好看懂。

檢查紀錄

以下兩種指令皆可,但是目前圖形軟體插件很方便,有時候會用GUI查看。

1
2
git log
git log --oneline

不小心把目錄或檔案刪掉了怎麼辦

  1. checkout回來
    使用以下指令查看你的歷史修改
    1
    git status

發現你誤刪了hello.html,因此把他checkout

1
git checkout hello.html

如果你打算全部復原,那就用萬用符號

1
git checkout .

Git指令的危險性


相信你看到這邊會覺得Git很強大對吧?但是越強大的東西也代表他越危險。
你的一不小心誤用,可能會造成不可預期的後果,但是只要是歷史紀錄有關的,通常都有辦法搶救回來。
除了某些狀況,例如:
一個檔案刪除(welcome),一個檔案編輯(hello)
理論上應該打

1
git checkout welcome.html

但是打

1
git checkout . 

是救不回來的

所以…要保護自己的專案可以怎麼做

交接專案的時候,把.git留下來只交原始碼
表示:你得的到我的肉體 得不到我的靈魂
(別說是我教的)

系統炸了,誰做的!


使用blame可以查看整個檔案每一行是誰寫的

1
git blame index.html

也可以根據行數查詢

1
git blame -L 8,10 index.html

但是總是有一句話謠傳在資訊界,通常很常會blame到自己

為什麼要使用branch


一開始就會有一個master,這就是一種branch
但是事實上branch就是一個分支,你隨時可以在你的當前分支切換到一個新的分支
在開發專案上,建議多養成時常產生branch的習慣,這樣也可以增加你的生產力,也能保持程式碼簡潔

branch使用

雖然branch叫分支,但是事實上他在.git裡面的結構,叫做貼紙會比較貼切一點,分支只是一張貼在某個commit上的貼紙。
那如何新增呢?

  1. 新增
    1
    git branch cat

翻譯:我要新增一個cat分支
在目前head所在地貼上cat貼紙
就這樣沒別的變化 也不會長出甚麼分支形狀
如果head指向master
現在正在master分支上

  1. 切換
    1
    git checkout cat

蒟蒻:我要切換到cat分支
head移動到cat貼紙
專案變成cat貼紙指到的commit狀態 在這時候其實跟master是一樣的

補充:
如果把兩個指令結合的話,可以輸入

1
git checkout -b cat

但是我不建議新手馬上就使用便捷指令,容易基本功不扎實,之後觀念東漏西漏又回頭學。

把機敏資料push到remote怎麼辦


如果你發生程式不小心把你的Key給push到remote時,不幸運的你,可能過好幾天才發現,幸運的你馬上就發現了這個問題,試圖想解決這些狀況發生,但是很不幸的我必須跟你說,因為Git實在是太萬能了,不管你是上述的哪一種狀況,你都非常不幸的無法拯救這份repository了。

為什麼無法挽救

  1. 刪除檔案再commit
    你可能會想問,Key上傳到remote,那我刪除再push上去不就好了?但是remote的commit紀錄還存在上面
  2. 刪除branch
    那你可能會想到,刪除branch再新增同樣名稱的branch不就好了?這樣就不會有commit記錄在branch上了呀?
    你有這種想法算你有認真思考過,但是很可惜的還是要跟你說,就是因為Git太強大了,因此你這樣做是在做白工
    你的任何歷史記錄都會完完全全記錄在.Git檔裡面,有心人士還是可以透過.Git去查看到你不小心上傳上去的機敏資料的。
  3. 刪除repo
    刪除repo對你來說應該是最好的選擇,但是別忘了那些資料可是永久存取到對方公司的主機上,那邊安不安全誰知道。

那要怎麼解決

  1. 更新Key
    你可以更新Key,這是最簡單的方式,這樣存在.Git裡面的就如同作廢。
  2. 直接修改.git檔
    但是通常不建議這麼做,相對麻煩,而且也要花時間去了解結構。

小節

這裡介紹了一些很基本常用的Git指令,下一次將會介紹更貼近職場應用情境的介紹。