2015年9月29日 星期二

Git使用學習系列-入門

在安裝並設定好TortoiseGit+Github後, 在網路找到一個不錯的入門學習教學影片, 就將教學中一些重點整理起來。

Git的好處

  • 分散式管理, 每台Client端同步後都擁有整份完整的source code及交付內容.
  • 同步一次後, 不需要網路即可使用.
  • 不用擔心Server備份, 每台client端都有一份.

 

Git的儲存方式

  • DAG
  • 利用無環圖來記錄metadata

 

Git的參照

  • Reference會指向一個Commit
  • tag不會移動,指向的commit都一樣
  • branch指向該branch最新的commit
  • HEAD指向current branch

所以開branch和tag只不過是refs而已, 所以儘量開branch來做topic吧.

Git的Integrity

GIT使用SHA1來保證檔案的完整性,避免程式在轉移時發生損壞沒有被發現.

為什麼要有Stage Area?

Stage的翻譯是(進展的)階段;時期. 就語意來解釋, 是在開發過程, 只要有認為修改完成的code, 就可以先進stage做為一個初期的交付, 但沒有真的進repo. 一旦開發中又有修改到, 就可以再交付. 若改動過程中把working copy改爛了, 還可以從stage中給救回來(做revert). 以下是概略重點:

  • working copy可能有很多程式在修改, 包含了想要commit的內容和不相關的實驗修改.
  • Stage area的設計可以讓你只commit想要的檔案, 甚至是想要的部份修改而已.
  • Stage Area又叫作Index.

附上一張圖,在沒有remote repository時的狀態. 圖片來源: Git

另一張圖, 有remote repository(像GitHub)的狀態. 圖片來源: Why Git is Better than X


Git的簡易操作

從Github Repository Pull

在Github建立一個Sandbox Repository. 然後用TortoiseGit的Clone從Github將Sandbox作Pull

image

成功後代表已經在client端建立了一個working copy, 並且可以將檔案加入到此目錄中, 之後可以作add, commit等.

到Git Bash中操作

在working copy中, 進到Sandbox目錄, 按右鍵選擇Git Bash here, 可以開啟bash並在此目錄中操作.

image

新增檔案到Repository

Step1: 在Sandbox中新增一個sweet.txt, 並使用Add將它加入Repo.

image

SNAGHTML47d559

Step2: Commit到本地的Repo

image

Step3: Push到Github

image

結果

SNAGHTML49edf7

以Bash的方式作Add, commit

需求: 以下示範加入一個新的檔案, 作add/commit後, 再修改它的內容後, 再做一次add/commit.

SNAGHTML62255c

在完成上述工作後, 變更的內容就交付到本地端的Repo了. 此時再去修改檔案會發生什麼事?

檔案狀態會由commit改為not staged

image

使用diff來看改了什麼

image

又要再做一次add, commit將變更交付到repo.

image


使用劇情分析

就使用中可能發生的劇情作一些分析記錄.

將同一個檔案進stage並在commit前修改,那做了commit後會發生什麼事?

Story

  1. 修改README
  2. git add README
  3. 再次修改README

情境: 此時作 git commit –m “commit update”後, 到底commit了什麼進repo?

分析: 只要用add將修改加入到stage後, 再去修改同一檔案時, 改動的部份是屬於working copy, 並不影響在stage中的內容. 所以作完commit後, 會是將第一次修改的內容交付到repo中. 若是要將第二次的修改也交付, 需再做一次add/commit.

如何將檔案由Stage移出或Local repo的改動回復?

Story: 若要對交付到stage或Local repo的改動後悔怎麼處理?

分析: 對stage的處理並非將改動復原, 而是將指定的檔案由stage移出, 但改動的部份還是沒有復原. 若要將改動完全復原, 要由repo由提取覆蓋. git提供2個命令分別解決這2個問題.

將檔案由stage移出: git reset HEAD filename

將檔案由repo復原 (會覆蓋掉working copy的改動): git checkout -- filename

以圖片顯示, 來源:http://www.dexcoder.com/

 


Git常用命令

記錄一些常用的命令.

add - 將檔案加入stage

add命令是將檔案加入stage. 可加單一檔案, 也可加全部檔案或是一個檔案中的部份修改.

#加全部檔案
git add .

#加一個檔案
git add README

#加一個檔案中的部份修改. s:選擇, y: 接受, n:不接受
git add README --patch

 


commit - 將檔案由stage加入repository


將stage中的變更加入repo.

#將stage中的變更加入repo
git commit -m "commit message"

 


tag - 對某一個改動下標籤


在發行版本時, 會希望在發行使用的那一個改動去下一個tag, 比如說1.0.0_REL, 之後若有問題要查尋時,比較容易找到發行時使用的變動點.


使用目前branch的最新版本作tag: git tag 1.0.0_RC1


image


使用特定的交付點作tag


先到log中選到要作tag的交付點, 並複製SHA1值. 然後再作tag:


git tag 1.0.0_TEST_REL 7483da8f57c4bf70a2f8665e5a509a503318fad8


image


 


設定GIT要忽略的檔案或資料夾


有些副檔名或資料夾不要進GIT Repo的, 可以在Repo的根或專案資料夾的根中去加入 .gitignore 檔案去設定.



  • Step1: 在有.git資料夾的某一個檔案, 按右鍵後選擇Add to Ignore list.

  • Step2: IgnoreType有2種,選任一種都可以. 然後就會自動產生一個.gitignore的隱藏檔.

  • Step3: 以文字編輯器開啟後加入要忽略的檔案或資料夾.

  • Step4: 將這個檔案add/commit/push交付到Repo.

之後GIT在add/commit時, 就會自動忽略這些檔案或資料夾.


可以到.gitignore大集合去看一下, 根據不同的專案平台類似, 可以找到不少預設的ignore list: https://github.com/github/gitignore


 


其他注意事項



  1. 空目錄會被忽略

延伸閱讀



 

教學影片


自由軟體鑄造場_20121104_版本控制系統-Git_張文鈿(ihower)_01

沒有留言:

張貼留言