[Git] 極簡Git——關於Git的簡要回顧

 

  1. Git歷史:它起源於Linux內核開發時,爲輔助Linux開發而設計的版本控制系統,發源於C時代的它,有很多C的影子和影響,其中 stash 命令就算一個。
  2. Git屬於第三代版本控制系統,Subversion屬於第二代,而所謂最開始的版本控制,也就是手工複製啦
  3. Git是分佈式版本控制系統,Subversion是中心化版本控制系統,依賴服務器,主要區別在於有無本地倉庫(Repository)
  4. Git和Subversion第二區別:關於文件的快照,svn將某個文件的修改記錄爲文件,即某文件版本=初始文件+文件改動,而Git更加激進,對每一個版本的文件都作了個克隆。
  5. Git中全部數據在存儲前都計算校驗和(Hash),而後以校驗和來引用。校驗和包括文件目錄結構,文件自身校驗和,以此來檢測是否發生改動。
  6. Git的幾個狀態,其是啥,與命令的關係:
    1. untracked 僅在項目文件夾下,仍未加入.git倉庫底下,或被git rm 。git

    2. unmodified 受Git版本控制管理了,git add + git commit 但自上一次加入以來未更改過。緩存

    3. modified 受Git版本控制管理了,但自上一次加入以來已更改。
    4. staged 受Git版本控制管理了,但自上一次加入以來已更改,且執行了git add再度生成了份克隆。  
  7. Git的幾個區域,及其與命令的關係
    Working Directory Staging Area .git repository
    |__________< check_out_____________|
    |__< reset/add >__|_____commit >_____|
  8. 因此checkout 會覆蓋Working Directory 記得保存。IDEA有警告,nice.
  9. git init 進入文件夾後執行,以同步設置(repository等)
  10. git clone以克隆代碼到本地
  11. git pull以更新雲端代碼到本地。
  12. stash與add,stash表明了當前文件的緩存區,stash to stack。與add的區別在於,它不會生成克隆,實際使用時,你會看到working directory的變動回到了上衣版本同步時的樣子,更改則進入了棧,應用更改的時候pop出來,直白的面對數據結構,令人聯想到C。
  13. Git分支,沒什麼好講的,rebase的時候增長分支,值得注意的是,push衝突時,rebase 變基會有個小分支,會改變remote tracking branch。
  14. Git merge。合併
  15. Chery pick。在另一個分支,一般是master,將其餘分支,一般是dev,pick過來,merge的操做。
  16. 理論上提交的代碼應該要作到沒問題,不影響其餘模塊,實際上每每不行,因此2~3個分支老是須要的,dev,test,master。根據進度,測試狀況,一點一點chery pick或者merge過來
  17. 正常的Git流程:git init/git clone-->git add-->[git stash-->git pull-->git stash apply ]-->git commit-->[git add -->git commit --amend]-->git push
  18. 各IDE的git 插件在保存時都會add。有文章說IDEA只會stash,是錯的。能夠開個cmd,定位到倉庫底下,編保存邊驗證下。
  19. Git push 和pull 的本質在於同步commit對象,這點很重要,也是爲何可能會把別人的提交 變成 本身的提交的緣由。