新手必須知道的Git(上)
在開發程式的時候,通常會利用Git進行專案的版本控制,但是事實上不少工程師,甚至是資深工程師,都有可能誤用或是誤解Git正確的用法,其實之所以會有這些誤用,只能說是因為網路資訊普及造成的現象,當自己什麼都不清楚的狀況下,很容易在初學的階段就輕易相信別人所說的話,所以導致不經意的錯誤觀念不斷誤用,以下將整理一些重點給大家知道。
為什麼會學不好Git
- 情境跟指令搭不起來
有些指令根本不是做那些事情,反而拿去使用了這些指令,可能會導致專案版本控制出了狀況。 - 基本認知有錯,把它當FTP在用
很多人以為Git不就是像GitHub那樣把檔案放到雲端上管理,但是事實上那根本不是Git在做的。
先來提供學習資料
- Gitbook
這邊我要推薦五倍紅寶石的高見龍老師的網站,當然你也可以買他的書,但是他的書本事實上幾乎跟網站上的資料一模一樣,但是你也可以購買他的書當作是贊助和保養自己的眼睛用。我們公司也請過高大大來演講過不少次,都有把很多Git的精華提供給我們受益良多,這邊也希望能夠幫他多推廣知識,讓更多知道Git真正的用法。 - 官方網站
現在網路流通的時代,導致太多人喜歡看懶人包學習,導致基本功容易不扎實,但事實上官方文件是最詳細的,所以請多閱讀官方文件,對自己絕對不吃虧。
什麼是Git
- Git是眾多版本控制軟體的其中之一
事實上有很多版本控制的軟體,但是Git在近日是最突出的,是目前業界最多人使用的版控軟體沒有之一 - Git就像是檔案的時光機
當你搞砸了你的專案,你並不需要找以前的備份檔,因為他本身就是一個時光機,可以讓檔案回到指定的時間點 - 知道每一行程式碼在什麼時間寫的
當然也可以知道哪一行是誰寫的。 - 作者是Linux Torvalds
一開始作者只是為了管理Linux kernal而創造了Git,而且作者只花了10天的時間就把Git實作完成了,厲害吧?
Git的特色
- 開源且免費使用
- 速度快檔案小
- 同時支援本地及遠端操作
你在本地端可以離線操作 - 容易與其他人共同協作 (前提:讓大家Git怎麼用)
- 是一種容易學不容易精通的工具
時間無法重來,但是Git可以
為什麼不斷強調這句話呢?因為Git非常的強大,他可以紀錄你在程式上所做的任何一舉一動,包含任何的還原紀錄都能紀錄。
因此,你可以還原到你的歷史紀錄,你也可以還原你所做的還原。
Git該學多深
Git的指令並不需要每一個指令都會,畢竟每次改版都會新增一些陌生的指令。
你只需要學好常用的20%左右的指令,即可在工作上正常使用了。
如何學習Git
一開始請多善用Terminal介面學習Git,少用GUI
不過通常工作上,為了便利偶而還是會利用GUI減少工作時間,例如:刪除大量branch。
.git就是所有的精華
.git裡面記錄著很多重要的資料,但是初學的你只需要知道以下三者即可。
- 工作目錄 Working Directory
- 暫存區域 staging
- 儲存庫 repository
工作目錄送到暫存區域
以下示範簡易的Git使用
新增檔案
1
touch index.html
檢查狀態
1
git status
加入暫存區域
1
git add index.html
新增hello 和 world
指令同上存檔
1
git commit -m “init commit”
commit紀錄要怎麼寫
如果是你私人的專案,那當然你要一路寫save或update也沒人會跟你計較。
但是如果是公司的專案,也許你詞窮不知道要怎麼寫,但是至少你要描述出你在這次修改做了什麼動作,不然別人在追蹤的時候會不好看懂。
檢查紀錄
以下兩種指令皆可,但是目前圖形軟體插件很方便,有時候會用GUI查看。
1 | git log |
不小心把目錄或檔案刪掉了怎麼辦
- 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
git branch cat
翻譯:我要新增一個cat分支
在目前head所在地貼上cat貼紙
就這樣沒別的變化 也不會長出甚麼分支形狀
如果head指向master
現在正在master分支上
- 切換
1
git checkout cat
蒟蒻:我要切換到cat分支
head移動到cat貼紙
專案變成cat貼紙指到的commit狀態 在這時候其實跟master是一樣的
補充:
如果把兩個指令結合的話,可以輸入
1 | git checkout -b cat |
但是我不建議新手馬上就使用便捷指令,容易基本功不扎實,之後觀念東漏西漏又回頭學。
把機敏資料push到remote怎麼辦
如果你發生程式不小心把你的Key給push到remote時,不幸運的你,可能過好幾天才發現,幸運的你馬上就發現了這個問題,試圖想解決這些狀況發生,但是很不幸的我必須跟你說,因為Git實在是太萬能了,不管你是上述的哪一種狀況,你都非常不幸的無法拯救這份repository了。
為什麼無法挽救
- 刪除檔案再commit
你可能會想問,Key上傳到remote,那我刪除再push上去不就好了?但是remote的commit紀錄還存在上面 - 刪除branch
那你可能會想到,刪除branch再新增同樣名稱的branch不就好了?這樣就不會有commit記錄在branch上了呀?
你有這種想法算你有認真思考過,但是很可惜的還是要跟你說,就是因為Git太強大了,因此你這樣做是在做白工
你的任何歷史記錄都會完完全全記錄在.Git檔裡面,有心人士還是可以透過.Git去查看到你不小心上傳上去的機敏資料的。 - 刪除repo
刪除repo對你來說應該是最好的選擇,但是別忘了那些資料可是永久存取到對方公司的主機上,那邊安不安全誰知道。
那要怎麼解決
- 更新Key
你可以更新Key,這是最簡單的方式,這樣存在.Git裡面的就如同作廢。 - 直接修改.git檔
但是通常不建議這麼做,相對麻煩,而且也要花時間去了解結構。
小節
這裡介紹了一些很基本常用的Git指令,下一次將會介紹更貼近職場應用情境的介紹。