git 小札 - 流程總覽

貓xian森發表於2017-10-11

集中式版本管理(subversion)和分散式版本管理(git)的差異

集中式
集中式

  • 集中式版本管理主要以檔案變更列表的方式儲存資訊
  • 這類系統(cvssubversionperforcebazaar等等)儲存的資訊是一組基本檔案和每個檔案隨時間逐步累積的差異

分散式
分散式

  • 分散式版本管理系統在儲存資料方面, 猶如對小型系統做一次快照
  • 每次提交更新時候, 對當時的全部檔案製作一個快照並儲存快照的索引
  • 如果檔案沒有修改, 則並不會重新儲存該檔案, 而是隻保留一個連結指向之前儲存的檔案

關於git的三種狀態

三種狀態
三種狀態

  • 已修改, 表示修改了當前版本的檔案, 但是還未儲存的資料庫中
  • 已暫存, 對當前版本做了標記, 使之包含在下次的提交中
  • 已提交, 表示資料已安全儲存到本地資料庫中

基本的git工作流程

  • .gitignore中可以新增需要忽略跟蹤的檔案
    • 可以使用/開頭來防止遞迴, 使用/結尾來指定目錄
    • 支援global模式(簡化的正規表示式), *匹配零個或者多個任意字元, [abc] 匹配其中一個, ?只匹配一個任意字串, [0-9]表示匹配09之間的任意數字, ** 表示匹配任意目錄
  • git status 檢查當前檔案狀態

    • git status -s狀態概要預覽
    • git status --short 同上
  • git add 開始跟蹤新檔案,或者把已跟蹤的檔案放到暫存區,還能用於合併時把有衝突的檔案標記為已解決狀態等

  • git diff 檢視已暫存和未暫存的修改, 此時比較的是工作目錄與暫存區之間的差異

    • git diff --cached或者git diff --staged檢視已暫存的下次提交裡邊的內容
  • git commit -m 加上簡短提交資訊提交

    • git commit -a -m 跳過暫存, 將所有跟蹤檔案暫存起來一併提交
    • git commit --amend 提交當前暫存區所有檔案, 合併至上次的提交中
  • git rm 從暫存區中移除檔案(不再跟蹤), 本地檔案也會刪除

    • git rm --cached 從暫存區中移除, 但是檔案仍保留在本地目錄中, 可使用global模式, 例如git rm log/\*.log
  • git mv 移動檔案或者重新命名

  • git log 檢視提交日誌

    • git log -p -2 顯示最近兩次提交的內容差異
    • git log --stat 顯示每次提交的簡略統計資訊
  • git reset HEAD file 取消暫存檔案

  • git checkout -- file 撤銷檔案的修改, 此時對改檔案所有的修改都會消失, 本質上是拷貝了另一個檔案來覆蓋它

  • git remote 檢視遠端倉庫

    • git remote -v 檢視遠端倉庫已經對應的url
    • git remote show remote-name 檢視遠端倉庫詳細資訊
  • git remote add remote-name url 新增遠端倉庫

  • git fetch remote-name 從遠端倉庫中拉取當前還沒有的資料, 執行完畢後將會有遠端倉庫中所有的分支和引用, 以備合併和檢視

  • git push remote-name branch-name 推送到遠端倉庫

  • git remote rename remote-name 修改遠端倉庫名

  • git remote rm remote-name 刪除遠端倉庫

  • git tag 列出標籤

    • git tag -l version 列出指定版本的標籤
  • git tag -a version -m message 建立一個附註標籤, 附註標籤是儲存在git資料庫中的一個完整物件, 它包含打標籤者的名字, 郵件, 日期以及標籤資訊

  • git tag version 建立一個輕量標籤, 輕量標籤本質上是將校驗和儲存到一個檔案中, 並沒有儲存其它任何資訊
  • git tag -a version 部分檢驗和 後期補標籤

  • git push remote-name tag-name 推送標籤到遠端, git push 本身並不會傳送標籤到遠端

  • git push remote-name --tags 推送所有標籤到遠端

  • git checkout -b branch-name tag-name 在特定標籤上新建一個分支, 相當於檢出標籤