Git -基本知識 (from alpha camp)

張凱喬
10 min readApr 12, 2018

--

相關圖片

找了一張我覺得看得比較懂的git workflow

resources: https://medium.com/@talgoldfus/better-understanding-gits-work-flow-in-order-to-properly-deal-with-merge-conflicts-part-i-760a366fc997

版本控制就是:控制程式語言的版本紀錄
並以分支與合併等功能,用於程式語言協作、部屬等

git則是最受歡迎的版本紀錄軟體
功能包含

  • 紀錄檔案的內容更動
  • 追蹤修改的內容與修改者
  • 保留歷史紀錄,了解專案脈絡
  • 支援本地和遠端版本控制
  • 可以還原成舊有版本
git --version  #取得git的版本
git config --global user.name "your name" #設定名稱
git config --global user.email "your email" #設定EMAIL
git config --list #看一下NAME EMAIL的設定
git init #讓這個資料夾開始版本紀錄

git init之後
就會在git裡面有.git檔

git init通常是本地端的動作
那譬如說 像是git hub上的專案 都是以.git為結尾
這就是裸倉庫的概念 必須用git init — bare 的方式建立

git我認為最難的是概念
主要有三個概念,第一是提交流程
就是工作區(workspace)=>暫存區(index)=>儲存庫(Repository)

第二個是分支(branch),開始比較正式或結構清楚的專案時,往往都會依賴branch的功能來達成多人協作。

第三個是遠端庫(remote),協作的時候通常會仰賴遠端庫的協助,把寫完的推進遠端庫(push),然後再把人家更新的內容拉回本機端(pull)。

概念一:提交流程

先講第一個概念吧
先參考這篇

https://read01.com/zh-tw/mA2G2E.html

先介紹工作區 跟 儲存庫
工作區 與 儲存庫 分別就是上圖的Working Directory與Repository
然後工作區就是你的本機檔案,然後儲存庫就是程式提交的正式版本

接下來介紹暫存區,在你提交給正式版本之前
你的檔案必須先經過給暫存區
之所以要有暫存區,原因有很多個,譬如說git是紀錄檔案的修改,而不是真正儲存完整檔案,所以透過staging這個動作,可以讓git追蹤檔案。此外,在提交給儲存庫的時候,可以分檔案提交...等等。

有了這個概念之後,可以先執行簡單的操作

git status  #查詢更動過的內容
git add [檔案名] #把有更動過的檔案加入暫存區
git add . #把所有檔案加入暫存區
git commit #建立版本紀錄節點
git commit -m "備註" #建立節點(直接輸入紀錄版本的備註)

這個是最基本的操作
參考最上面的圖及下面連結

使用git log可以看到版本提交的紀錄

也可以在log後面提加一些選項
--graph 圖像化(除了文字顯示之外,在左側前端用圖像化表示)
--pretty=oneline 僅顯示單行呈現每一個記錄節點
--abbrev-commit 縮短節點的代碼字元數

版本紀錄大致上就是顯示節點代碼跟commit comment
不會清楚的讓你知道版本實際上程式碼的差異

要比較程式碼的差異,就要用diff指令

最常用的就是 git diff
=> 比對的是「已經修改但還沒進入staging area的內容」

另外一個常用的是 git diff - -cached
=>比對的是「staging area與當前版本的差異內容」

剩下的話,可以用git diff +版本,比對特定版本與當前的差異
譬如說 git diff HEAD,其實就是上述兩個指令相加的內容

然後 rollback的操作的部分,也就是版本回朔
我看了幾篇 內容還算清楚 可以先讀一下

簡單來說
分兩個 reset 與 revert

一般來說比較常用的是reset,因為revert會新增一個版本紀錄,因為只有少數的特例,你才需要把錯誤的版本繼續留在紀錄中。

reset 很簡單,但是要記住有三種運用方式(也就是option)

  1. -- hard 直接重置特定版本的紀錄,可能會影響到你目前的工作態度。(換句話說,就是最hardcore的重置)
  2. --soft 不會更動到你目前的檔案,但是會退回staging area(就像是做完git add . 的狀態),用途有兩種,第一種就是打錯commit comment;第二種就是想要合併多個連續commit,把頻繁的修改合併成同一個commit。
  3. --mixed 也不會更動檔案,會退回working directory(也就是還沒有git add之前)。

如果不小心reset --hard錯了也沒關係,要記得git reflog這個好物,git 版控是很靈活的,他不會因為你reset --hard就把原本新的紀錄刪掉,而只是把你目前的HEAD指向你去的那個版本,而原本新的紀錄還留著,只是你看不到(預設git log只會回朔,不會到未來)

上述這些,大概就是提交流程,包含了在主幹分支上建立commit、查看紀錄、退回紀錄等等。

概念二:分支

分支是協作的好物。
有些協作的過程會利用分支,來分成主要版本、開發版本、新功能等等類別,參考下列連結。

實際執行也不難,例如

git branch iss53    #開一個名為iss53的分支
git checkout iss53 #切換到iss53這個分支
...(然後在iss53增加一些commit紀錄)...
git checkout master #再切回到master
git merge iss53 #把iss53內容合併到master

困難的是多頭馬車一起拉,譬如A分支往前推進了好幾個紀錄、B分支往前推進了好幾個紀錄,然後要把B合併到A,就會有一些重複修改的程式碼,或者同時改了不一樣的程式碼,就會產生衝突。

以下這篇很詳細,可以參考。

概念三:遠端庫

遠端庫是很方便的,譬如你想要在多台電腦上做同一個專案,這個時候只要輸一些指令,就可以很快的同步資料。而多人協作更不用說了,是一定要有一個遠端庫來讓每個人可以各自用自己的電腦來做同一個專案。

最常用的免費遠端庫包含github與bitbucket
兩個都滿好用的,在視覺化與使用引導上都很清楚

基本上的步驟就是 "設定Remote"->"PULL"->"PUSH"

PULL指的是把遠端庫的東西拉回本機端
PUSH指的是把本機端的東西推到遠端庫

另外,要注意的是PULL另一個用法是FETCH
PULL會把遠端的內容直接併進(MERGE)本機端
FETCH則不會做MERGE,由你自己決定動作。
(更簡單來說,PULL = FETCH + MERGE)

git的操作基本上,只要掌握到概念
大概對每個指令就能理解在做啥

其實也有很多git GUI(圖形介面)可以用
已經不再需要記這些指令了,按按鈕就可以搞定
(可以google "sourcetree”、”gitkraken”)

這篇先降

--

--

No responses yet