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年能有一些驚喜發生吧,加油!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/17760.html
標籤:其他
