好久沒發文了,來頭條之後更忙了,也沒精力去分享一些有養分的內容了。此次分享的 git 的方方面面,基原本自於個人筆記。git 這東西算是爲數很少天天都要用的東西了,可是我以爲也不至於從頭到尾去了解他的前世此生,什麼樣的狀態最合適呢?我認爲是: 1. 瞭解他的概念,工做區,暫存區等等,這些很是重要,不然用着用着容易懵。2. 基本命令,chekout,rebase等等經常使用命令,stash這種不經常使用的可是偶爾用下仍是頗有幫助。3. 瞭解他的大多數功能,遇到不常見的狀況時知道怎麼解決,去 cheat sheet 能找到對應命令。 我以爲達到這種足以。下面的東西都是來自個人筆記(真是沒時間寫分享了,直接用以前的筆記了),基本概念引用了文檔,其他部分能夠看成cheat sheet,還有一些小tips。 本文適合收藏查閱。git
git document
pro git
cheat sheetgithub
git config --global
: 針對當前用戶,全局生效的配置git config
: 針對當前項目生效的配置,覆蓋 global 的配置。core.pager
: 分頁器,默認less 能夠設爲 '' ,避免 diff 和 log 的時候進入分頁器。user.name
: 用戶名, user.email
: 郵箱alias
: 設置別名 alias.co checkout:此後可用co代替checkout。git init
: 終端進入一個目錄後,該命令在此目錄建立版本庫。git clone
: 後接項目url和克隆到本地後的文件名。git add
: 後面加文件名(帶後綴),此命令將對該文件的修改添加到暫存區(或者將新文件列入監控範圍)。git add .
對所有文件進行add操做。( * 也能夠)-v
列出添加或修改的文件-p
列出修改內容--all
(-A
)直接把工做區扔給暫存區git commit -m
: 後面加本次提交的目的或修改的內容等(提交信息),注意放在「」(雙引號)以內,此命令將暫存區內所有內容提交到版本庫。每一次運行 commit 提交操做,都是對你的項目做一次快照,之後能夠回到這個狀態,或者進行比較。-v
: 顯示diff信息。-a
: 跳過暫存步驟,把全部被監控文件的修改提交到版本庫。至關於add commit兩個命令一塊兒(但不會添加新建立的文件)。--amend
:覆蓋(廢棄)上次提交。(上次提交說明寫錯了或者有文件遺漏了)用於修改提交歷史 帶 --no-edit 參數後,不改變提交信息git stash
: 不想提交又想切換分支,先儲藏。git stash save -a <msg>
: 儲藏還給起個名。git stash list
: 查看儲藏列表。git stash show
: 查看本次暫存內容,-u
參數查看具體內容。默認 stash@{0}
可指定其餘。git stash apply
: 恢復儲藏的內容。默認 stash@{0}
可指定其餘。 pop
恢復後會刪除恢復的stash。git stash drop
: 清除 stash。默認 stash@{0}
可指定其餘。git stash clear
: 清除全部 stash。git status
: 版本庫當前的狀態。-s
:輸出簡單版本。git diff
: 當前文件們(工做區)與暫存區的文件們有何差別。也就是修改以後尚未暫存起來的變化內容。--cache
:已提交到暫存取的文件與版本庫的文件們有何差別。HEAD
:工做區與版本庫之間的差別。branchNameA
:與A分支比較(默認爲當前分支)。branchNameA branchNameB
:比較A,B兩個分支的差別。commitA commitB
: 比較兩次提交間的差別。git difftool
:用外部工具查看差別。git shortlog
: 查看每一個人的提交狀況,-s 只顯示提交數,-n 按提交數排序。git reflog
: 查看全部提交歷史,包括被覆蓋的。git log
: 查看提交歷史。 --all
能夠查看被 reset 覆蓋的提交歷史。-[n]
: 查看最近 n 次提交。--stat
: 每次提交修改的文件和行數。--graph
: 形象的顯示分支。--oneline
: 每次提交放在一行顯示。--author
: 指定做者的提交。--grep
: 提交說明包含某些關鍵字的提交。-S
: 添加或移除了某個關鍵字的提交。--decorate
: 查看指針所在。-p
: 詳情。git show
: 展現各類東西(能夠接標籤名,分支名,版本號, 某次提交)的詳情。默認當前分支最後一次提交的內容。git blame <filename>
: 查看文件每一行最後一次修改都是誰。git reset
:後面接版本號,將HEAD快照和暫存區指向該版本(默認)。後面可接文件名,恢復該文件在某版本的狀態。後面可接分支名,指定當前分支被某分支覆蓋。不影響工做區。--soft
: 還不會影響暫存取。HEAD
: 後面可加文件名(帶後綴),將緩存區內的該文件恢復到HEAD指向的快照,工做區不變。不加文件名對全部文件生效。--hard
: 工做區內的文件也會恢復到指定快照 不安全git log --all
或 git reflog
查到git checkout
:後面加文件名(帶後綴),撤銷工做區內對該文件的修改(工做區內刪除的文件也可此命令恢復),暫存區有內容就回到暫存區的狀態,不然就回到版本庫內的狀態。不安全git revert <commit-id>
: 回到某個 commit 的狀態(會在當前提交新增一個提交)git rm
:後面加文件名(帶後綴),此命令將對該文件的刪除操做添加到暫存區。以後commit操做和提交修改中的commit操做相同。此命令刪除版本庫文件還會刪除工做區文件。(工做區直接刪除文件,也要再移除監控)git rm --cached
:後面加文件名(帶後綴),此命令將文件移除版本庫並取消監控,不刪除工做區文件。git rm $(git ls-files -d)
: 手動從工做區刪除後,用該命令清除全部已刪除文件的監控。git mv file_a file_b
: 把文件a重命名爲文件b。(該命令還能夠移動文件到指定文件夾)標籤有點相似於分支的感受shell
git tag
: 列出已有標籤。使用 git show [tagName]
查看指定標籤詳細信息。git tag [tagName]
: 給當前版本打個標籤,後邊可接版本號,給指定版本打。默認當前分支最後一次提交的版本。 -d
刪除該標籤。git tag -a [tagName] -m [message]
: 打附註標籤 message 爲附註,一樣可指定版本。git push origin [tagname]
: 推送指定標籤到遠端。--tags 推送所有標籤。git push origin :refs/tags/ [tagName]
: 刪除一個遠端標籤。刪除標籤要先刪本地再刪遠端。git branch
: 查看分支。-v
: 查看每一個分支的最後一次提交-d
: 刪除分支(合併後沒用的分支刪除之)後加 -r 刪除本地的遠程分支--no-merged
: 查看已經合併的當前分支的分支--merged
: 查看未合併到當前分支的分支-r
: 查看遠程分支-vv
: 查看本地分支及其跟蹤的遠程分支-u
: 後面接[remotename]/[branch],跟蹤該遠程分支,後面可接本地分支名,默認當前分支git branch [branchNameA]
: 建立分支A。後面可接該分支起點(版本號,標籤,分支名,遠程分支則自動跟蹤)。默認當前分支的最後一次提交。git checkout [branchNameA]
:指針(HEAD)切換到分支A,工做區也會切換到該分支最後一次提交的樣子。-b
: 新建分支並切換。和新建分支特性相同。git checkout --orphan [new_start]
:新建一個從零開始沒有提交歷史的分支。git merge [branchNameA]
:將分支A合併到當前分支。(只要當前分支是 A 提交歷史上的一個點就能夠了。)git git-cherry-pick
: 後接版本號(可接多個),在當前分支重演某(幾)次提交。(將某次提交的修改內容拉過來)git rebase
: 稱爲變基,後邊接要拉過來的分支,把兩條分支變一條。(會把本分支的commits頂到最頂端),遇到衝突會停頓,解決後 git rebase --continue
繼續,直到合併完成。-i
和要回到的提交歷史節點,成爲修改提交歷史神器(修改該節點後的提交歷史)。遠程分支格式爲[remotename]/[branch],至關於抓取遠程remotename倉庫的branch分支的快照到本地緩存
git checkout -b [branch] [remotename]/[branch]
: 從服務器上 fetch 下來的遠程分支若是沒有對應本地分支,能夠這樣建立並創建跟蹤關係。(branch 也同樣)git fetch origin
:從 origin 倉庫更新所有內容。不會自動合併到本地分支。後面可接遠程倉庫的分支名(可選,更新指定遠程分支)後面接 --prune
(-p
)時,刪除其追蹤的遠程分支已經被刪除的本地分支。git fetch --all
git reset --hard origin/master
git pull origin
:從本地當前分支跟蹤的 origin 倉庫上的分支更新併合併到當前分支,只有一個遠程倉庫可省略。至關於 fetch 後 當前分支 merge 對應的遠程分支,不推薦。指定分支拉取: git pull origin <遠程分支名>:<本地分支名>
git push origin <本地分支名>:<遠程分支名>
:若是本地分支與遠程分支同名,可只寫一個,若是計劃將當前所在本地分支推送到與其有追蹤關係的遠程倉庫的分支,可省略分支名,若是隻有一個主機有追蹤關係,可省略主機名。遠程無指定分支則建立(建立新遠程分支時,主機名分支名不可省,且不會自動創建跟蹤關係 加 --set-upstream 後會創建跟蹤關係)。git push origin --delete [branch]
:從 origin 倉庫刪除 branch 分支,還會刪除本地的遠程分支。(--force
會不解決衝突,強制覆蓋)git remote update origin
:在本地建立遠程分支的追蹤分支。git remote prune origin
:把已經無效的追蹤分支刪掉,加--dry-run
先查看要刪的分支先不刪。git remote show origin
: 查看遠程分支與本地分支之間的關係。上面 origin 均可以是其餘遠程倉庫名安全
git remote
: 列出遠程倉庫。-v
: 顯示遠程倉庫url。git remote add [shortname] [url]
: 添加遠程倉庫,並命名。git remote rename [nameA] [nameB]
: 把遠程倉庫A命名爲B。git remote rm
: 後接遠程倉庫名,僅斷開鏈接。git remote show
: 後接遠程倉庫名,查看詳情(分支及本地追蹤狀態等)。git remote set-url origin [url]
: 切換遠程倉庫地址。可用於 https 改 ssh 或相反。流程以下:服務器
git bisect start
: 啓動查找。git bisect bad
: 說明當前狀態是有bug的。git bisect good [good_commit]
: 聲明一個沒有該bug的版本。git bisect bad
來標記該版本有 bug, git bisect good
來標記該版本正常。重複該步驟,知道找到某版本最早引入該 bug ,返回版本號和相關信息。git bisect reset
: 回到最開始的位置。git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | grep -v 'public' | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done
git fetch --all && git reset --hard origin/master
git branch --merged master | grep -v '^\*\| master' | xargs -n 1 git branch -d
git clean -X -f