Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
作為開源世界最優秀的作品之一,Git已經成為目前進行項目版本控制的最佳方案,也逐漸成為程序員必備的基礎技能。“遷個新分支開發”,“提交一下代碼”,“合到QA分支進行提測”,“提個上線的MR”等等這些Git工作流成為我們日常工作的重要部分。
我在這里總結了日常開發中最常用到的10余條git命令,並且通過命令行別名的方式做到敲一個鍵就能執行它們。
閑話少敘,開始git之旅吧!
我修改了哪些文件 —— git status
alias s='git status'
用於查看文件變更情況。
這里取 s 鍵,即 git status
切到某個分支 —— git checkout
alias c='git checkout'
用於切換分支。
這里取 c 鍵,即 git checkout
搞個新分支開始開發 —— git checkout -b
alias cb='git checkout -b'
這里取 cb 鍵,即 git checkout -b
其實也可以直接使用上條命令 c -b <branch>,但我遷新分支的頻率比較高,所以就單獨搞了一個命令嘿嘿
我們開發新功能時通常需要基於線上分支(一般是master)遷出一個新分支來開發。
提交我的修改 —— git commit
alias C='git commit'
修修改改終於做了一部分功能,提交一下自己修改的文件
這里取大寫 C 鍵(因為小寫 c 已經給 git checkout 啦),即 git commit
拉取最新的代碼 —— git pull
alias q='git pull'
用於拉取最新代碼,比如別人在你工作的分支上修改了代碼並推到了遠端,那么你在git push之前就得先把最新的代碼拉下來跟你本地的代碼合並。
這里取 q 鍵,而不是 p 鍵,完全是因為個人偏好😁,我想把按鍵都集中在鍵盤左半部分。而且q和p很像鴨,並不會增加記憶難度。
git pull 其實等於先 git fetch 再 git merge,兩步操作合成一步完成啦
把本地代碼推到遠端 —— git push
alias Q='git push'
你寫了一段非常優美的代碼,別人想欣賞一下。此時就需要推到遠端。
這里取 Q 鍵,git pull 和 git push 是最常用的一對操作,綁到一個按鍵上是非常方便的(用大小寫對應)。
如果是新建的分支第一次推到遠端,會報
The current branch has no upstream branch錯誤
執行下git push --set-upstream origin <branch>就行啦你還可以用這個命令刪掉一個遠端分支(--delete)
Q -d origin <branch>,謹慎操作喔!
這里只是刪掉了遠端的分支,本地對應的分支還在喲,雙重保險,不怕手誤嘿嘿。配合下面的
b -d <branch>效果更佳哦~
把別的分支合到我的分支上來 —— git merge
alias m='git merge'
我們將個人開發分支的代碼合到線上分支之前,往往需要把線上分支的最新代碼先合到自己的個人開發分支,以確保沒有沖突
這里取 m 鍵,即 git merge
合個分支誰曾想有100多個沖突🥴,特么不合了
m --abort玩歸玩,鬧歸鬧,別拿沖突開玩笑,吐血解決了100多個沖突,接着合並
m --continue假如有個文件沖突了1000多行,實在懶得看,直接用某個分支的文件就行啦
C <wantted-branch> -- the/path/of/file.js
--是為了隔開分支名和文件名,后面跟上文件路徑就行啦
把我的分支合到別的分支上去 —— 🧐
git 只提供了 git merge 把別的分支合到我的分支上來,並沒有提供把我的分支合到別的分支上的命令
通常為了把當前工作分支合到別的分支上去(比如提測需要合到測試分支,上線需要合到線上分支),需要依次進行以下幾步:
# 比如說我正在my-branch分支工作,需要合到test分支進行提測
1. git checkout test # 先切到目標分支test
2. git pull # 拉取test最新的代碼
3. git merge my-branch # 把我的分支合到test上
4. git push # 把test推到遠端
5. git checkout my-branch # 切回我的分支繼續工作
之后你解決了一個bug,又要重復一遍上面的5步操作。一天下來可能要重復 N 遍這枯燥且無聊的合並過程。
既然git沒提供(我猜是出於安全考慮),那就擼起袖子自己搞一個
function consoleLog(){
echo "\033[33;1m$1\033[0m"
}
function consoleError(){
echo "\033[31;1m$1\033[0m"
}
local error=0
function checkError(){
((error)) && consoleError "🚨 出現錯誤"
}
# 合並當前分支到指定分支
function mt() {
if (($#==0)) {
consoleError "缺少參數"
} else {
local source=$(current_branch)
consoleLog "🔦 git checkout $1"
git checkout $1; error=$?
{checkError} && return error
consoleLog "⬇️ git pull origin $1"
git pull; error=$?
{checkError} && return error
consoleLog "🔗 git merge $source --no-ff"
git merge $source --no-edit --no-ff; error=$?
{checkError} && return error
consoleLog "⬆️ git push origin $1"
git push; error=$?
{checkError} && return error
consoleLog "🔦 git checkout $source"
git checkout $source; error=$?
{checkError} && return error
consoleLog "🎉🎉🎉 done!"
}
}
上面是zsh語法。上面代碼的主要作用是把上面的5個合並步驟串行執行,加了一些錯誤處理和進度提示。
這里取 mt,因為是merge to的縮寫鴨
現在只需要執行
mt test
即可完成把當前工作分支合並至別的分支,合並完成后,你依然在當前的工作分支。
來體驗一下這一鍵操作的暢快吧

上面gif動圖里git pull和git push時的停頓是在我家訪問github時的龜速網絡導致的,不影響實際使用
溫馨提示:上線時合到線上分支最好還是老老實實在GitLab上提merge request吧,安全起見二次確認一下文件變更🤓
看一下提交記錄 —— git log
alias v='git log --pretty=format:"%C(auto)%h %s %C(italic dim white)%an[%ad]%Creset%C(auto)%d%Creset%n"'
辛辛苦苦忙了一天,看看自己今天提交了哪些commit
追查真凶:線上出bug啦,是這個文件導致的,看看誰改了這個文件
git log 后面那一大串 --pretty=format: 是為了美化log的輸出格式

具體占位符含義可參考 git log pretty formats
這里取了 v 鍵,意為 view git log,而且 v 鍵的位置比較不錯 😎
當前項目都有哪些分支 —— git branch
alias b='git branch'
用於顯示本地有哪些分支
這里取 b鍵,即 git branch
也可以查看有哪些遠程分支(--remotes)
b -r還可以列出本地和遠程所有分支(--all)
b -a🎉功能開發完上線啦,本地分支可以刪啦(--delete)
b -d <branch>
尼瑪手抖分支刪錯了腫么辦,不要怕,這里只是刪掉了本地分支,分支在遠端還好好的呢
shit,合錯代碼了,我要回滾代碼 —— git reset
alias r='git reset'
這里取 r 鍵,即 git reset
只見你十指在鍵盤上快速飛舞,修改代碼,暫存,拉最新,提交一氣呵成。看着git命令一行行執行,log日志隨之在bash里閃爍跳動。趁這間隙,你隨手拿起手邊的養生水杯,嘴角開始微微上揚,准備補充一下生命的源泉。你似乎想起了什么,神情倏地變得緊張起來,你的手開始顫抖,杯具里的水也跟着泛起了水花,突然一拍腦門:我尼瑪忘切分支了,全提到線上分支去了!
此時你可以 r @^
@是 HEAD 的縮寫,指向最新的commit。^表示之前的一個commit,和 @ 連起來就是:上一個commitgit reset 只是重置了 HEAD 指向的位置,你的修改都還在,只是回到了未提交的狀態,就像剛才你從沒提交過一樣!
然而在另一個陽光明媚的下午,你竟然一不小心又把測試分支合到線上分支啦,還特么推到遠端了
不要慌,此時只需要 r --hard @^,就會回到合測試分支之前的commit節點,並且丟掉所有相關的修改(參數--hard的奇效)
但此時你是 git push 不了的,因為你的本地分支HEAD落后遠端分支,git會提示你要先 git pull
不要理它,直接 Q -f (Q 是git push 還記得么🤪),來個霸王硬推(--force),這樣遠端分支和本地分支就同步啦
最后的家底兒
看看這個項目誰提交的最多
git shortlog -sn
提交最多的不一定是最勤勞的,也可能只是個強迫症喲~
獲取當前分支名稱
git rev-parse --abbrev-ref HEAD
一般在編寫git程序時會需要用到
撤銷提交歷史上的某次 commit
git rebase -i --onto <commit-ish>^ <commit-ish>
比如你前天不小心把測試分支合到了自己的分支上(實際上是萬萬不該滴),然而你當時並沒有注意到。你又寫呀寫,提交呀提交,今天功能要上線了,和線上分支一比對,尼瑪出現10000+個變更,這才反應過來。此時你需要把合test那次commit剔除,就像醫生從中彈傷者體內取出子彈一樣。如果你改動的文件在test上也被別人改動啦,那就像子彈在體內又爆炸成了碎片,只能說Good luck啦😄
查看自己的命令使用排行
zsh_stats
配置完上面這些一鍵操作后,最近一段時間我的命令行記錄

最后的最后
臨近春節,票還沒搶到,北漂真心不易。最近又趕上租房的地方要拆遷,需要重新找地方。再看一下自己的現狀,眼見年將三十,家未成,業未立,渾渾噩噩,庸庸碌碌,每想至此,既焦慮又迷茫。今年的一個目標就是能每周寫一篇高質量文章,總結梳理自己的知識體系。雖然不知道轉機何時出現,但不能停止努力鴨😊
希望2020年能有一些驚喜發生吧,加油!
