與 AI 的 Pair Programming - 打造方便的 git 複雜指令
在第一次學習到 Git Merge 功能時,覺得很反直覺,當自己開發的 branch 要合併至 develop 或是 master 時,還要 checkout 過去在做 merge。
只做一次倒還好,但這是每天都會用不只一次的指令,真的是蠻浪費的時間的,所以我想做 git 複雜指令是
將當前 Branch 合併至目標 Branch 並 push
聽起來很簡單,但其實隱含了幾個 git 指令
- git checkout {target_branch}
- git reset —hard origin/{target_branch}
- 取代 git pull
- git merge {origin_branch}
- git push
- git checkout {origin_branch}
分為不 push 和要 push 兩個指令
- Git Merge Into (gmi)
- Git Merge Into and Push (gmip)
用起來會像是1
2gmi {target_branch}
gmip {target_branch}
最簡單的實作方法 Git Alias
這是我同事分享的 Git Alias
git config --edit --global
1
2
3
4
5
6
7
8
9[alias]
co = checkout
br = branch
st = status
l = log --oneline --graph
ph = push
pl = pull
mi = !sh -c '_CURRENT_BRANCH=$(git symbolic-ref --short HEAD) && git checkout $1 && git pull && git merge $_CURRENT_BRANCH && git checkout $_CURRENT_BRANCH' -
mip = !sh -c '_CURRENT_BRANCH=$(git symbolic-ref --short HEAD) && git checkout $1 && git pull && git merge $_CURRENT_BRANCH && git push && git checkout $_CURRENT_BRANCH' -
使用 git mi {target_branch}
就能最簡單達到目的,但指令執行時有個前提是
指令執行過程要一切順暢
也就是這指令沒有防呆,也沒有 error handle,當 pull, merge, push 中間哪一段失敗了,就會強制中斷。
且會斷在 target branch 上,不會再 checkout 回來你原來的 branch,我使用了一陣子 Git Alias 才覺得這樣的體驗少了一個 UX 很重要的 undo 功能。
Amazon Q (前身 Fig) CLI Completion
CLI Completion 是個很好用的功能,可以提示指令下一個有什麼選擇,當他遇到 Alias 的話,會 Alias 的去做提示
像是上述的 git co
會以 git checkout
去提示
可是如果過於複雜是一個 script 就會認不得 (請忽略 develop 那是 zsh 的 autocomplete)
所以基於 git alias 體驗不好,且沒有 Completion 的情況下,我打算來自己打造 CLI
語言與 Library 選擇
記得我好久以前有寫過 CLI,但好久以前了,決定從零開始,並且與目前最會寫 code 的 AI Pair,一起來完成這項任務。
起初我請 AI 推薦要用哪個語言給我
AI 還是一樣熱情多話呢,推薦了我使用 Python 或是 Go,我是先選擇了我比較熟悉的 Python
再請 AI 起個頭,寫個範例程式,第一次 AI 使用了 argparse 這 Library
但是 AI 沒教我們怎麼 build 可立即執行的 bin,再請教他一次,這次他使用了 Click 來寫範例
我就想說怎麼兩次推薦的不一樣,就去找了一下 Python 的 Cli Library。
結果找到 argparse、docopt、click、fire …
也太多選擇了吧!這也太為難有選擇困難的人了。
只好問候一下最熟悉的 Google,看了一陣子,感覺最容易上手的就是 click,最終就選擇由 Python + Click 開始實作我的 CLI 工具
現有程式轉換
我原本就有個 script 版本的程式,直接餵給 AI 請他幫我轉換
試著跑了一下…恩…不能用呢…
當然第一版會有問題是很常見的,畢竟我的 AI 智慧只有 3.5,只好叫他再檢查一下
恩…還不能用呢…
算了,我還是手動 debug,不然怎麼算是 Pair 呢
debug 完算是完成基本功能
之後就是
- 程式可以動
- 有要加功能請 AI 產生 code
- 複製貼上
- debug 和測試
- 程式可以動
這樣反覆迭代後就完成了 CLI,前前後後大概只花了 3 個小時
https://github.com/iml885203/gmip
成果
Success
Error Handle - Uncommitted changes
Error Handle - Merge conflict
結語
與 AI pair 的過程要避免直接相信他的程式碼,主導權還是要在自己身上,對於不熟悉的程式碼還是一段一段套用測試比較安全,直接整個貼上 AI 給的程式碼誰知道哪個功能又壞掉。
目前使用的還只是免費的 GPT 3.5,用得好的話已經能節省很多時間,將來 AI 只會越來越進步,產生出來的程式碼錯誤率也會越來越低,相信不久的將來 AI 能成為最好的夥伴。