參考文章
突然發現了很多自己不知道的git命令和選項,記錄一下自己覺得可能會有用的
##雜項
查看已經暫存起來的文件(add)和上次提交時的快照之間的差異 git diff --cached,版本>1.6.1可以用 git diff --staged
設置git默認使用的編輯器 git config --global core.editor vscode
提交前自動add跟蹤過(注意是跟蹤過)的文件 git commit -a
從暫存區刪除文件,但是保留本地(變爲未跟蹤) git rm --cached readme.txt
rm命令可以用blob模式(正則),注意目錄有子目錄的時候,用git rm需要 git rm a/\*
來刪除a中的aa目錄,而git rm a/*
只會刪除a目錄下的文件,aa目錄不動
檢查補丁是否能順利應用 git apply --check
假設這個分支是從master拉取的,現在想看看當前分支和剛拉取的時候的區別 git diff master…
把項目壓縮打包
git archive master --prefix='project/' --format=zip > `git describe master`.zip
git describe
命令只適用於有標註的標籤(通過-a
或者-s
選項創建的標籤)
查看stash的記錄 git stash list
應用stash但不刪除記錄 git stash apply
刪除stash記錄 git stash drop
取消所應用的stash,參數stash@{0}可以省略 git stash show -p stash@{0} | git apply -R
交互暫存,文件多時很有用 git add -i
修改已經提交的歷史(未推送) git rebase -i
查看某文件每個修改的信息,-L選項可以限制行數 git blame -L 12,22 simplegit.rb
發現提交有問題,想要查找哪次提交引入了問題,二分查找 git bisect
git的配置可能有三個目錄 /etc/gitconfig、~/.gitconfig、.git/config,從外到內
##提交歷史
展示每次提交的差異 git log -p
展示最近2次的提交歷史 git log -2
使用簡短且唯一的SHA-1值 git log --abbrev-commit
顯示在當前分支中,並且不在遠程master中的提交 git log origin/master…HEAD
查詢refA和refB包含,但是refC不包含的提交 git log refA refB ^refC
查看兩個分支的提交的區別,並指示分別屬於哪個分支 git log --left-right master…experiment
展示每個文件的增減行數 git log --stat
展示提交修改的文件名 git log --name-only
展示方式選擇 git log --pretty=oneline
- 選項有short、full、fuller、oneline、format
展示格式化舉例 git log --pretty=format:"%h - %an, %ar : %s"
展示某時間段的提交 git log --since=2weeks
- –since, --after 之後(2周以內)
- –until, --before 之前(2周之前)
- –author 指定作者,–committer 指定提交人
- –all-match 多個條件都要滿足
- –grep 搜索提交說明
##撤銷
修改提交(不要在推送後還去修改) git commit --amend
可能失去的數據,僅限於沒有提交過的數據,切記
##標籤
列出所有標籤 git tag
列出符合條件的標籤 git tag -l ‘v1.4.2.*’
創建附註標籤 git tag -a v1.4 -m ‘my version 1.4’
簽署標籤(不知道幹嘛用的,加密?) git tag -s v1.5 -m ‘my signed 1.5 tag’
創建輕量標籤 git tag v1.4-lw
驗證標籤(和簽署對應) git tag -v v1.4.2.1
對以前某次提交添加標籤 git tag -a v1.2 9fceb02
推到遠程 git push origin v1.5
全部標籤推到遠程 git push origin --tags
##分支
查看哪些分支合併進了當前分支 git branch --merged
與上面的相反 git branch --no-merged
沒有合併的分支用git branch -d刪除會提示錯誤,可以用-D強制刪
不要對已經推送到遠程的分支進行變基操作,否則可能會得到重複的提交歷史
##子模塊
我覺得我是不會用這個的,如果真的有公共模塊,不如創建一個倉庫A,另外的倉庫B如果需要使用,就全量拷貝,需要同步的時候,先更新倉庫A,再全量拷貝並替換倉庫B裏的相應內容
初始化 git submodule init
更新子模塊狀態 git submodule update
當開發者對子模塊做了一個本地的變更但是並沒有推送到公共服務器。然後他提交了一個指向那個非公開狀態的指針然後推送上層項目。當其他開發者試圖運行git submodule update
,子模塊會找不到所引用的提交,因爲它只存在於第一個開發者的系統中
子目錄
和子模塊一樣,略複雜,容易出幺蛾子
假設當前你有兩個遠程rack_remote和origin,你的master分支是從origin拉取的,rack_branch分支是從rack_remote拉取的,現在你想把rack_branch分支的內容作爲master的子目錄,你可以切換到rack_branch,然後執行,rack_branch的內容會進入master分支的rack目錄中
git read-tree --prefix=rack/ -u rack_branch
如果rack_remote有更新,可以切換到rack_branch拉取更新,然後切換回master,執行
git merge -s subtree
要比較master裏rack目錄和rack_branch分支的區別,可以執行
git diff-tree -p rack_branch
也可以直接和rack_remote比較
git diff-tree -p rack_remote/master
自定義屬性
.gitattributes文件中可以設置一些屬性,如果不想這個文件出現在工程目錄下,也可以設置到.git/info/attributes裏。
通過一些設置可以進行部分二進制文件的比較,具體看原文檔。
使用git archive時不想導出某些文件和目錄,比如不想導出test目錄,可以把test/ export-ignore這句寫到.gitattributes文件裏
鉤子
分爲客戶端掛鉤和服務端掛鉤,具體可以看原文檔
pre-commit 在鍵入提交信息前運行,從該掛鉤返回非零值時,放棄此次提交,可以用git commit --no-verify來忽略
還有一些底層命令,原理之類的內容,也還是建議看文檔