一個按鍵搞定日常git操作


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 鍵,完全是因為個人偏好😁,我想把按鍵都集中在鍵盤左半部分。而且qp很像鴨,並不會增加記憶難度。

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,和 @ 連起來就是:上一個commit

git reset 只是重置了 HEAD 指向的位置,你的修改都還在,只是回到了未提交的狀態,就像剛才你從沒提交過一樣!

然而在另一個陽光明媚的下午,你竟然一不小心又把測試分支合到線上分支啦,還特么推到遠端了

不要慌,此時只需要 r --hard @^,就會回到合測試分支之前的commit節點,並且丟掉所有相關的修改(參數--hard的奇效)

但此時你是 git push 不了的,因為你的本地分支HEAD落后遠端分支,git會提示你要先 git pull

不要理它,直接 Q -fQ 是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年能有一些驚喜發生吧,加油!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM