在安裝並設定好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
成功後代表已經在client端建立了一個working copy, 並且可以將檔案加入到此目錄中, 之後可以作add, commit等.
到Git Bash中操作
在working copy中, 進到Sandbox目錄, 按右鍵選擇Git Bash here, 可以開啟bash並在此目錄中操作.
新增檔案到Repository
Step1: 在Sandbox中新增一個sweet.txt, 並使用Add將它加入Repo.
Step2: Commit到本地的Repo
Step3: Push到Github
結果
以Bash的方式作Add, commit
需求: 以下示範加入一個新的檔案, 作add/commit後, 再修改它的內容後, 再做一次add/commit.
在完成上述工作後, 變更的內容就交付到本地端的Repo了. 此時再去修改檔案會發生什麼事?
檔案狀態會由commit改為not staged
使用diff來看改了什麼
又要再做一次add, commit將變更交付到repo.
使用劇情分析
就使用中可能發生的劇情作一些分析記錄.
將同一個檔案進stage並在commit前修改,那做了commit後會發生什麼事?
Story
- 修改README
- git add README
- 再次修改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
使用特定的交付點作tag
先到log中選到要作tag的交付點, 並複製SHA1值. 然後再作tag:
git tag 1.0.0_TEST_REL 7483da8f57c4bf70a2f8665e5a509a503318fad8
設定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
其他注意事項
- 空目錄會被忽略
延伸閱讀
- Why Git is Better than: 有分支相關的內容值得參考
- 詳解Git工作區、暫存區、歷史記錄區以及git reset、git revert、git checkout等撤銷命令的區別
- Git - 簡易指南: 包含大部份的用法, 用很簡易的說明及圖示說明要如何使用
沒有留言:
張貼留言