Git權威指南(筆記)

來源:互聯網
上載者:User

標籤:chromium   git   path   分支合并   branch   

Git權威指南跳轉至: 導航、 搜尋
目錄
  • 1初識Git
  • 2Git安裝
  • 3Git初始化
  • 4Git暫存區(stage)
  • 5Git對象
  • 6Git重設
  • 7Git檢出
  • 8git stash
  • 9Git基本操作
  • 10曆史
  • 11Git複製
  • 12Git庫管理
  • 13Git協議與工作協同
  • 14衝突解決
  • 15Git裡程碑
  • 16Git分支
  • 17遠程版本庫
  • 18補丁檔案互動
  • 19經典Git協同模型
  • 20Topgit協同模型
  • 21子模組(submodule)協同模型
  • 22子樹合并*
  • 23Android式多版本庫協同
  • 24Git與SVN協同模型
  • 25Git伺服器
    • 25.1Gitolite
    • 25.2Gitosis
    • 25.3Gerrit代碼審核
    • 25.4Git託管
  • 26遷移到Git
  • 27Git的其他應用
  • 28Git的其他特性
  • 29附錄
初識Git
  1. git add -u/-A/-p
  2. git pull remote-mirror local-master
  3. 匯出提交曆史(即從一現有代碼產生補丁):
    1. 初始化git版本庫。。。(這一步其實可能 很消耗時間,如果代碼量很大的話)
    2. git tag v1
    3. git commit -a
    4. git format-patch v1..HEAD 這要求每次提交都是一個修正,實際中可能更想把所有提交合并成一個補丁。。。
  4. 重寫提交說明:git commit --amend(修補提交,修改上一次提交???)
    1. 要修改曆史提交的說明,需先定位:git rebase -i <commit-id>(懷疑這裡rebase不是這麼用的吧?)
  5. git diff
    1. --word-diff
    2. --cached
  6. 儲存和恢複工作進度(push/pop):
    1. git stash(相對於push)
    2. git checkout <new_branch>
    3. ...
    4. git checkout <origin_branch>
    5. git stash pop
  7. 本地Git,與伺服器端svn協同:
    1. git svn fetch(這相當於在Git控制的環境中執行svn update?)
    2. git svn rebase
    3. git svn dcommit
  8. Git命令預設分頁(less -FRSX)
Git安裝
  1. 擷取最新版並丟棄本地修改:
    1. git fetch
    2. git clean -fdx
    3. git reset --hard
    4. git tag
    5. git checkout v1.7.4.1
  2. 命令補齊?/etc/bash_completion
  3. 中文支援:git config --global core.quotepath false
    1. Linux上,最好不要使用UTF-8以外的字元集(GBK)
  4. Mac OS X上安裝Git:$ brew install git
  5. p40 Cygwin預設使用UTF-8字元集,並巧妙地與Windows字元集進行轉換(?)
  6. PuTTY Pageant:提供SSH私密金鑰?
  7. msysGit環境:
    1. $ ls --show-control-chars *.txt(顯示中文檔案名稱)
    2. TortoiseGit對中文提交說明的支援有缺陷???扯淡
Git初始化
  1. git grep
  2. git rev-parse --git-dir
  3. git config可以很方便地操作INI檔案:
    1. GIT_CONFIG=test.ini git config a.b.c "Hello"
  4. 別名:git config --global alias.ci "commmit -s"
Git暫存區(stage)
  1. 當執行git status(-s是顯示stage內容?)時,首先依據.git/index的時間戳記等資訊判斷工作區是否有改動
    1. (依賴於檔案時間戳記的設計本質上說不是太可靠。。。)
  2. Git-diff比較:
    1. 工作區 vs 暫存區:git diff
    2. 暫存區 vs HEAD:git diff --cached
    3. 工作區 vs HEAD:git diff HEAD
  3. 不要使用git commit -a(繞過stage,直接提交)
  4. 每次修改需重新git add以增加到stage(這個add確實很容易把人搞糊塗!)
Git對象
  1. git cat-file [-t -p ...] <SHA1-40bit-ID>
  2. .git/objects:ID的前2位作為目錄名,後38位作為檔案名稱??
  3. .git/refs/heads/下的引用名稱稱為分支(引用指向某一個提交id!)# p90 Hg同時使用順序數字和SHA1??
  4. HEAD^代表HEAD的上一次提交
  5. a5~5 相當於 a5^^^^^
  6. a5:path/to/file
Git重設
  1. git reset --hard HEAD^ (暫存區裡的修改可能丟失)
  2. git reset --hard 9e8a761
  3. git reflog show master | head -5
  4. git reset --hard [email protected]{2} 切換master回到2次修改之前
  5. 2種reset
    1. git reset [-q] [<commit>] [--] <paths> ...
    2. git reset[--soft / --mixed / --hard / --merge / --keep] [-q] [<commit>]
Git檢出
  1. checkout時重設當前HEAD
  2. p102 當不是從master檢出並提交後,由於提交沒有被分支跟蹤,則有可能被從版本庫清除
  3. 解救:切換到master,然後merge剛才的提交(開發分支?):
    1. git merge acc2f9
  4. git log --graph --pretty=online
  5. *reset的預設是HEAD,而checkout的預設是stage(index)
  6. 檢出並建立新分支:git checkout [-m] [[-b / --orphan] <new_branch>] [<start_point>]
git stash
  1. git stash(儲存當前工作進度,分別對stage、working)可以多次儲存進度!(save point?)
  2. git-<cmd>:Git大部分命令也是用指令碼實現的(!),這一點上與Hg類似
  3. stash內部實現實際上就是一個特殊的分支(refs/stash)而已
    1. 與SVN的trunk/tags/branch目錄相比,Git則把這種狀態劃分內建到命令裡去了(話說這樣一來我覺得還是SVN更容易理解的說)
    2. 把2個SVN串聯起來實際上就相當於Git的stage了,哈哈
Git基本操作
  1. git stash apply(pop的話會刪除進度?)
  2. 本地刪除不會影響stage,而git rm則會修改stage,下一次commit生效
  3. git add 參數
    1. -u:標記本地所有改動(更新、刪除)
    2. -A:所有改動和增加
    3. -i:互動式手工選擇
  4. git describe
  5. .gitignore
    1. /TODO 只忽略此目錄下的TODO
    2. .svn/ 所有的.svn(子)目錄
  6. git archive --format=tar --prefix=1.0/ v1.0 | gzip > foo-v1.0.tag.gz
曆史
  1. gitk --all
  2. gitk --since="2 weeks ago" #這種時間描述應該是從Ruby裡借鑒來的
  3. gitg & (基於GTK+的)
  4. qgit & (基於Qt的)
  5. git blame -L 6,+5 Readme.txt
  6. git bisect start/good/bad/reset
  7. * Hg只能悔一次,Git因為有強大的reset,可以任意多次
  8. 時間旅行“回到未來”(這個比喻真不恰當!)
    1. git cherry-pick
    2. git rebase --onto <newbase> <since> <until>
    3. git rebase -i
  9. 丟棄曆史,僅保留最近的100次提交:
    1. 建立根提交:git cat-file commit A^0 | sed -e ‘/^parent/ d‘ > tmpfile
    2. git hash-object -t commit -w --tmpfile
    3. git rebase --onto <new-root-commit-id> A master
  10. 分布式情況下修正一個錯誤提交的方法是反轉提交:
    1. git revert HEAD
Git複製
  1. git clone <repos> <new-dir>
    1. 不帶參數(非裸版本庫,工作區直接push會導致錯誤?只允許從備份庫pull,不能反向push?)
    2. --bare(只有.git/,裸版本庫,這時可以push)
    3. --mirror
      1. 可以與上遊git fetch同步
  2. git push/pull [<remote-repos> [<ref-specs>]]
Git庫管理
  1. git show-ref
    1. refs/heads/開頭的是分支
    2. refs/remotes/是遠程分支的本機對應分支
    3. refs/tags/是裡程碑
  2. *為什麼clone遠程版本庫會產生物件程式庫打包和引用打包的效果呢?(檔案在傳輸時被壓縮了。。。)
  3. git fsck
    1. 沒有被引用關聯的鬆散對象,如暫存區引入的大檔案
    2. git prune
  4. git fsck --no-reflogs
    1. git reflog expire --expire=now --all
    2. git prune
  5. git gc
    1. --prune=now
  6. 1.6.6+ 部分git命令會自動執行git gc --auto
    1. git merge
    2. git receive-pack(當接受到對方的push時)
    3. git rebase -i
    4. git am
  7. 觸發條件:.git/objects/17目錄下對象超過27個時
Git協議與工作協同
  1. 智能協議 vs 啞協議(.git/info/refs,git/objects/info/packs)
  2. ‘快進式’push:推送的push必須基於版本庫的相應分支的現有基礎
  3. 強制push(這種情況下會覆蓋其他使用者的,??)
  4. merge後push:
    1. git pull
    2. git push
  5. 禁止‘快進式’push:
    1. git --git-dir=/path/to/repos/shared.git config receive.denyNonFastForwards true
  6. 通過hooks和授權允許特定使用者強制push(。。。)
衝突解決
  1. git pull = fetch + merge
  2. 自動合并
    1. 不同檔案
    2. 相同檔案的不同行
    3. 檔案移動 & 檔案內容的修改
  3. 自動合并成功,但有邏輯衝突:測試!!!
  4. 衝突解決:<<<<<<<=======>>>>>>>
    1. kdiff3
  5. 樹衝突
  6. 合并策略:git merge [-s <strategy>] [-X <strategy-options>] <commit> ...
    1. ours
    2. theirs
    3. subtree
    4. octopus
Git裡程碑
  1. git tag
  2. 命名規範:v1.0-init
    1. 不要以-開頭
    2. / .不能出現在最後
    3. 不能出現2個以上連續的.
    4. 不能使用特殊字元: ~ ^: ? \
    5. 不能以.lock結尾
Git分支
  1. master:隨著提交而變化
  2. 發布分支(Bugfix)
  3. 特性分支
  4. Vendor分支(專門建立一個與上遊同步的分支)
  5. git branch dever-name/feature-name(分支命名帶/?)
  6. 合并到主線:
    1. git checkout master
    2. git merge user1/funcA
    3. git cherry
    4. git push
    5. git branch -d user1/funcA
  7. 採用rebase時的分支關係圖要比merge簡單?
遠程版本庫
  1. git branch -r
    1. .git/refs/remotes/origin/ #see .git/config
  2. 從遠程分支建立跟蹤分支:git checkout -b v-1.x origin/v-1.x(如果沒有名字衝突,可直接git checkout v-1.x)
    1. 跟蹤分支的好處是可以git pull自動維護與上遊分支的一致更新
    2. 如果希望對本地分支也支援跟蹤功能:--track
  3. 註冊新的遠程版本庫:git remote add new-remote-name <URL-to-remote-repos-git>
  4. git remote update
  5. 遠程版本庫中的tags同步到本地,不會建立新的名字空間!!
    1. -n(--no-tags)
補丁檔案互動
  1. 建立補丁:
    1. git format-patch -s HEAD~3..HEAD(最近的3個提交匯出為補丁檔案)
  2. 接受郵件:mail -f user1-archive(mbox格式)
  3. 首先切換到本地的基準點:git checkout -b user1-patch-base HEAD~3
  4. 應用補丁:git am user1-archive
    1. 或可:cat *.patch | git am
  5. git apply:應用一般格式的補丁,但不提交
  6. StGit(沒看出這裡的用處到底怎麼樣的)
    1. stg uncommit -n 3
    2. stg pop -a(撤銷版本庫上的提交?)
    3. stg ser
    4. stg push/goto ...
    5. stg refresh
    6. stg show
    7. stg export(quilt格式的?)
  7. Quilt
經典Git協同模型
  1. Hg + MQ
    1. 入棧的補丁轉為提交,出棧則是移走最新的提交
Topgit協同模型
  1. master用於與上遊同步,建立本地的特性分支(refs/heads/t/feature_name)
  2. 為了實現特性分支匯出為補丁,引入了特殊的引用(refs/top-bases/*),用於追蹤各特性分支的基準分支
  3. tg create t/new-feature-branch-name [DEPS ...] 可指定多個依賴分支???
    1. 當依賴分支有更新時,tg info t/feature3 可看到t/feature1上的提交
  4. tg update
  5. tg summary
    1. --graphviz | dot -T png -o topgit-layout.png
  6. tg remote [--populate] [REMOTE]
  7. tg export
    1. --collapse
  8. .topdeps:重複資料刪除的依賴??
子模組(submodule)協同模型
  1. svn:externals
  2. git submodule add /path/to/repos/libA.git lib/lib_a
  3. clone時預設不包含submodules,如果需要的話,
    1. git submodule init
    2. git submodule update
  4. ???這裡的講解太含糊了。。。fuck
子樹合并*
  1. git read-tree --prefix=lib util-branch
  2. git checkout -- lib
  3. git write-tree
  4. git commit-tree ...
  5. 反方向:將項目的一個子目錄匯出為新的git項目,要求匯出對應的曆史。。。
    1. #see git filter-branch
  6. git-subtree外掛程式*
Android式多版本庫協同
  1. repo(相當於用Python指令碼把多個Git倉庫用目錄組織起來。。。,manifest.xml)
  2. repo init --mirror -u git://.../manifest.git
    1. repo sync
  3. repo upload:向Gerrit伺服器進行git push
Git與SVN協同模型
  1. git svn clone <svn-path> <dir-name>
  2. git svn fetch
  3. git svn rebase(注意,SVN提交都是線性!)
  4. git rebase --continue
  5. git svn dcommit
    1. 推送之後,Git裡的提交說明中嵌入了git-svn-id:標籤(把映射關係加到Git commit log中,聰明!)
  6. 注意:使用git-svn時盡量不要在不同分支之間進行合并,而是盡量在一個分支上線性提交
    1. 如果真的需要在SVN不要分支間合并,使用SVN 1.5+,因為這樣可以正確記錄svn:mergeinfo屬性
Git伺服器
  1. 唯讀HTTP啞協議
  2. 智能HTTP:1.6.6+ git-http-backend
  3. Gitweb:唯讀訪問?
    1. git instaweb(如果安裝了)
  4. git-daemon
  5. SSH方式
Gitolite
  1. 又是Perl開發的?
  2. gitolite-admin管理庫?(Devops?)
  3. 存取控制及授權:略
Gitosis
  1. Python開發,SKIP
Gerrit代碼審核
  1. 最早的Gerrit由Python之父Guido van Rossum開發的Rietveld分支而來,現在的Gerrit是用Java實現的
  2. 特殊引用:
    1. refs/for
      1. 建立一個<review-id>,並建立refs/changes/nn/<review-id>/m
    2. refs/changes
  3. hooks/commit-msg
    1. Change-Id
  4. Gerrit伺服器架設:。。。略
    1. 第一個使用者為系統管理員;建立公開金鑰以啟動ssh服務
Git託管 遷移到Git
  1. cvs2svn > cvs2git
  2. Hg遷移到Git:fast-export(略)
Git的其他應用
  1. etckeeper
  2. 作者自己開發的Gistore,shit
  3. git diff --binary
Git的其他特性
  1. 屬性檔案?
  2. hooks
    1. applypatch-msg
    2. pre/post-applypatch
    3. pre/post-commit
    4. prepare-commit-msg
    5. commit-msg
    6. pre-rebase
    7. post-checkout/merge
    8. pre/post-receive
    9. update
    10. post-update
    11. pre-auto-gc
    12. post-rewrite
  3. sparse checkout
    1. skip-worktree
  4. 淺clone:
    1. --depth 2
      1. .git/shadow
  5. 提交嫁接:.git/info/grafts
  6. 提交替換:.git/refs/replace/
  7. git notes
附錄 

Git權威指南(筆記)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.