CRPER
https://juejin.im/post/5de8d8...
彙總下我在項目中高頻使用的git命令及姿式。git
不是入門文檔,官方文檔確定比我全面,這裏是結合實際業務場景輸出。github
使用的 Git版本:git version 2.24.0npm
查看日誌,常規操做,必備segmentfault
# 輸出概要日誌,這條命令等同於 # git log --pretty=oneline --abbrev-commit git log --oneline # 指定最近幾個提交能夠帶上 - + 數字 git log --oneline -5 # 提供相似 GUI 工具的 log 展現 git log --graph --date=relative --pretty=tformat:'%Cred%h%Creset -%C(auto)%d%Creset %s %Cgreen(%an %ad)%Creset'
查看工做區狀態的東東,不如GUI直觀,可是命令行也有一些用的緩存
# 等同 git status --long,查看當前工做區暫存區變更 git status # 概要信息 (--short) git status -s # 查詢工做區中是否有stash存在(暫存的東西),有則提醒該工做區有幾個 stash git status --show-stash
用來切換到對應記錄的,能夠基於分支,提交,標籤。架構
切提交和標籤通常用來熱修復或者老版本須要加新特性。app
# 分支切換 git checkout dev # local branch # 切換遠程分支 git checkout origin/test # remote branch # 基於遠程分支建立本地分支,並跟蹤對應來自 'origin' 的遠程分支 git checkout --track origin/feature-test # new local branch wih remote branch # 基於本地分支開出新分支 git checkout -b testbranch # new local branch with current branch # 完全丟棄某個文件的改動 git checkout -- file # 放棄本地全部改動 git checkout . # 切換上一個分支 git checkout -
每天打交道的命令,這裏說一些很常見的姿式機器學習
# 新修改的內容,添加到上次提交中,減小提交的日誌 # --no-edit:是跳過進入編輯器,直接提交 # git commit --amend這條命令等同於 # $ git reset --soft HEAD^ # $ ... do something tree ... # $ git commit -c ORIG_HEAD git commit --amend --no-edit # 跳過校驗直接提交,包括任何 githooks git commit --no-verify -m "xxx" # 帶提交概要信息 git commit -m "xxx" # 指定目錄格式提交 # -t <file>, --template=<file> # 也能夠從全局或者項目級別指定提交的模板文件 # git config [--global] commit.template xxx # 如今通常都是 用社區的npm規範包,commitizen 和 commitlint 來規範提交 git commit -t templateFile # 提交信息從文件讀取,能夠結合上面的一塊兒用 git commit -F
不得不說,代碼回滾中這個命令也是用的不少,並且是 --hard
編輯器
# 硬性回滾,簡單粗暴,直接拋棄回滾以後改動(log 仍是有保留,內容不要而已) git reset --hard commit_sha1 # 軟性回滾, 跟 rebase 常規用法差很少的效果,能夠把提交的東西丟回暫存區和工做區, # HEAD 的指向改變會對應的 commit,以後再考慮怎麼 commit git reset --soft commit_sha1 # 軟回滾一個版本,能夠理解爲撤銷最近一次的 commit git reset --soft HEAD~1 # 清除暫存區但保留工做區變更。 git reset --mixed commit_sha1 # 保留工做區和暫存區之間的差別。 git reset --merge commit_sha1 # 保留工做區和HEAD之間的差別 git reset --keep commit_sha1
通常用於master 的代碼回滾,由於多人在上面協做,工具
revert
能夠平穩的回滾代碼,但卻保留提交記錄,不會讓協做的人各類衝突!
# 回滾到某個 commit git revert commit-sha1
變基在項目中算是很頻繁的,爲何這麼說。
好比你開發一個新的 feature, 遵循最小化代碼提交的理念。
在整個功能開發完畢的時侯,會有很是多的 commit,用 rebase
可讓咱們的commit記錄很乾淨
# 帶 -i 能夠進入交互模式,效果以下 git rebase -i git-sha1|branch(HEAD) # 如果中間毫無衝突,變基則一步到位,不然須要逐步調整。 git rebase --continue # 提交變動後繼續變基下一步 git rebase --skip # 引發衝突的commits會被丟棄,continue提示沒有須要改動的也能夠用這個跳過 git rebase --abort # 如果變基改殘廢了,可是走到一半,能夠完全回滾變基以前的狀態
忽然發現截圖還有幾個新的行爲,估計是新版本帶來的,從字面上就能夠看出來大致的意思, 就是把回滾和打標籤這些放到變基中簡化操做。
# --ff 是指fast-forward命令,當使用ff模式進行合併時,將不會創造一個新的commit節點。 # --no-ff,保留合併分支的提交記錄,通常主幹用的比較多. # --ff-only 除非當前HEAD節點爲最新節點或者可以用ff模式進行合併,不然拒絕合併並返回一個失敗狀態。 # --squash 則相似 rebase squash,能夠把合併多個 commit 變成一個 git merge --no-ff branchName
git pull中用的最可能是帶--rebase(-r)
的方式(變基形式拉取合併代碼),保持分支一條線。
默認的pull會走ff模式,多數狀況會產生新的commit,部分參數與 merge提供一致。
當本地分支存在,遠程分支不存在的時侯,能夠這樣推送關聯的遠程分支
# 這樣會直接新建一個同名的遠程分支 git push origin localbranch # 刪除遠程分支(--delete) git push -d origin branchName # 推送全部標籤 git push --tags # 推送 commit 關聯的 tags git push --follow-tags # 強制推送(--force) git push -f origin branchName # 通常合理的項目,主幹都作了分支保護,不會容許強推行爲 # 有時候真的須要強推的時侯,但可不能夠柔和一點呢? # 就是當前遠程分支和你本地一致,沒有別人提交的狀況下能夠強推 # --force-with-lease: 如果遠程有人提交,這次強推失敗,反之成功 git push --force-with-lease
這個東西用在你須要考慮維護多個地方倉庫的時侯會考慮,或者修改倉庫源的時侯
# 常規關聯本地 git init 到遠程倉庫的姿式 git remote add origin url # 新增其餘上游倉 git remote add github url # 修改推送源 git remote set-url origin(或者其餘上游域) url
該命令用的最多的就是刪除本地分支,重命名分支,刪除遠程分支了
# 分支刪除,拷貝,重命名,參數如果大寫就等同多了--force,強制執行 # -c, --copy : 複製分支, # -C:等同於 --copy --force # -d, --delete: 刪除分支 # -m, --move:移動或者重命名分支 git branch -d branchName git branch -M oldBranch newNameBranch # 手動指定它的當前分支的上游分支,兩個寫法一致的 # 有關聯通常也有取消關聯,--unset-upstream git branch --set-upstream-to=origin/xxx git branch --set-upstream-to origin xxx
暫存用的最多時侯就是你擼代碼擼到一半,忽然說有個緊急 BUG 要修正。
或者別人在你這裏須要幫忙排查代碼,你這時候也會用到。
強烈建議給每一個 stash 添加描述信息!!!
# 緩存當前工做區的內容到stashName, save 這個如今不怎麼推薦用,圖方便也能用 # -a|--all: 除了未跟蹤的文件,其餘變更的文件都會保存 # -u|--include-untracked:包括沒有添加到暫存區的文件 git stash save stashName git stash -u save stashName # 如今基本推薦用 push,由於有 pop,語義上和維護上更清晰 # 上面有的參數,它也有,還有-m 來備註這個 stash 的大概狀況 git stash push -m "更改了 xx" # 有保存那確定也有取用的 # pop: 取會刪除對應的保存記錄 # apply: 取但保留記錄 # 0就是--index,這個東西哪裏來的呢? git stash apply stash@{0} git stash pop stash@{0} # 查看stash 保存記錄 # eg: stash@{0}: On dev: 測試 git stash list # 只想刪除暫存記錄怎麼辦: # clear : 清空全部 stash # drop: 清除指定的 stash git stash clear # 慎用! git stash drop stash@{0} # 想看 stash 作了什麼改動,相似簡化版的git diff git stash show stash@{0}
這個命令的強大之處,是記錄了全部行爲,包括你 rebase
,merge
, reset
這些
當咱們不當心硬回滾的時侯,或變基錯了均可以在這裏找到行爲以前的commit,而後回滾。
固然這個時間回溯也只在本地有用,你推送到遠程分支的破壞性改動,該涼仍是得涼。
# 最近五次行爲,不帶-n 則默認全部 git reflog -5
這個東西你能夠理解爲你去買橘子,你會專門挑一些符合心意的橘子放到購物籃中。你能夠從多個分支同時挑取部分須要的 commit 合併到同一個地方去,是否是賊騷。這貨和變基有點相似,可是僅僅相似,挑過來的 commit 如果沒有衝突則追加。有衝突會中斷,解決後 --continue
# 在當前分支挑其餘分支的 commit,把那部分的變更那過來 git cherry-pick commit-sha1 # 支持一次性拿多個 git cherry-pick master~4 master~2 # 支持區間, 區間中間是 .. git cherry-pick startGitSha1..endGitSha1 # --continue:繼續 pick,通常有衝突解決後才須要這樣 # --skip:跳過此次進入隊列下一次行爲 # --abort : 徹底放棄 pick,恢復 pick 以前的狀態 # --quit: 未衝突的自動變動,衝突的不要,退出此次 pick # 這幾個狀態跟變基差很少,解決衝突繼續,跳過處理,放棄此次pick,不輸出錯誤
這個命令在舊的版本用的比較最多的姿式是爲了從新索引.gitignore 的範圍
# 刪除某個文件的索引 # --cache 不會刪除硬盤中的文件,只是 git 索引(緩存)的關係!!! git rm --cache -- file # 遞歸清除所有全部索引(也能夠理解爲緩存吧),這個姿式適合從新讓.gitignore 新範圍生效 git rm -r --cached . git add . git commit -m "xxx"
這個估計通常人用的不是不少,能夠經過這個快速獲取部分git 倉庫的信息
我在弄腳本的時侯就會從這裏拿東西
# 獲取最新有效的commit # --short:顯示七位的 sha1,不帶就是所有 # --verify: 校驗是否有效commit # HEAD: 當前分支的head 指向 git rev-parse --short HEAD --verify # 顯示倉庫的絕對路徑 git rev-parse --show-toplevel #eg: /Users/linqunhe/Code/aozhe/thinking-ui # 顯示版本庫.git 目錄所在的位置 git rev-parse --git-dir # 顯示全部關聯引用的 git sha1 git rev-parse --all
對於這個命令,在終端比對用的不是很頻繁,除了少許改動的時侯可能會用這個看看。
其餘狀況下我更傾向於用 GUI 工具來看,由於比對更加直觀。
git 的經常使用命令其實很好掌握,不少命令都有 Linux 的影子。
列出來的命令都是高頻使用的,或許有一些更騷的姿式沒有摸索到,
有更好建議的,或者發現不對之處的請留言,會及時修正,謝謝閱讀。
天天一篇架構領域重磅好文,涉及一線互聯網公司應用架構(高可用、高性能、高穩定)、大數據、機器學習、Java架構等各個熱門領域。