iT邦幫忙

0

git Squash commit 問題

  • 分享至 

  • xImage

Hello 大家好:

我目前碰到一個問題,是關於 github 的 squash 的問題
在下的 code
https://github.com/p81061473525/test-commit

我有四個分支 main, main-dev,main-devops,main-devops
main 穩定分支
main-dev 從 main 拉出來的分支,會把一堆測試放上去
main-devops 從 main 拉出來的分支,devops 的分支,devops 在上面開發,開發完成會 PR 進 main-dev , CI/CD 觸發是在 main-dev 上面,demo repo 這隻被砍掉了,可以參考 PR close 的地方

由於 CI/CD 會有問題,所以會來來回回 commit 與 PR

main-devops 最後會有三四個 commmit "TEST 1" "TEST2" TEST3"
最後PR到 main 分支裡面去
為了 main 審核乾淨,
從 devops PR into main 模式選擇 squash and merge,
把 commmit "TEST 1" "TEST2" TEST3" 變成 commit -m "TEST"
並且把 main-devops 砍掉

於是 main 只有兩個 commit
這時再從 main 拉出 main-devops2 去開發 CI/CD 新的功能,
假設 commit "TEST4" PR 進去 main-env 這時候就會出現衝突。

雖然可以解衝突,但我不想每次拉新的分支
main-devops3
main-devops4
main-devops*
一直要解衝突


update 5/25
Sorry, 我一直打錯,因為要保護公司分支名稱,所以腦袋沒轉過來。

四隻分支是
main (主要的乾淨的 code) 主要是開發lead管理的
main-dev 這個是開發lead 從 main拉出來的分支
main-devops 這個是我可以從 main拉出來的分支名稱,合併進main這個分支就會被砍掉。
main-devops2 這個是我為了這個問題,特別用2來標示,平常我 CI/CD 合併進去,開新的分支名稱還是main-devops

開發者平常也是從 main 拉 功能分支 main-dev-featureX 把代碼提交進 main-dev

devops 也是從 mainmain-devops 去做開發把 CI/CD 提交進main-dev
跑了沒問題 main-devops PR main

我一定有 main push -f 的權限,可以要強制推要知會開發 lead,但是每一次強推都要開通知開發 lead 這顯然不是一個好作法。

我只是想不透為什麼開發端的成員可以 squash and merge
,開發端成員操作跟我是一樣的,從 main 拉功能分支出來,提交亂亂的 commit,
發 PR 可以 squash
,而我沒辦法 squash
而我做的 demo 也證實我這樣的操作肯定會有衝突
----。

by sourcetree,#4 是 devops squash 合併的
https://ithelp.ithome.com.tw/upload/images/20230525/20160038GLFhPmIfFs.png

https://ithelp.ithome.com.tw/upload/images/20230525/20160038Ep4mDrbeoU.png

實際上 main-dev 是不會回到 main 上的,但是會定期砍掉,
所以關於 devops 的不跟開法端 code 有影響。

可是如果我沒有 Squash 就會正常,Squash pr 後就會異常。
但我們開發也是 github 提交給開發 lead,開發lead 也是 squash mr .
阿就我的會出conflict

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

1
alien663
iT邦研究生 4 級 ‧ 2023-05-25 15:32:36
最佳解答

小弟才疏學淺,有請靈魂小畫師上線。

https://ithelp.ithome.com.tw/upload/images/20230525/20153982mukZWL76JV.jpg

如果跟圖一樣的話,我感覺應該是main的node 2跟main的node 1有衝突,你會需要先在本地將main merge進main-devops,這樣main node 2的部分就可以成功了。

看更多先前的回應...收起先前的回應...

有點出入,我晚點補圖,也晚點測試。

https://ithelp.ithome.com.tw/upload/images/20230525/20160038Fp79RiWD4N.png

實際上 main-dev 是不會回到 main 上的,但是會定期砍掉,
所以關於 devops 的只有你圖的上半部。

可是如果我沒有 Squash 就會正常,Squash pr 後就會異常。

2 的部分是肯定成功的,出問題的點是你圖 3 的位置

alien663 iT邦研究生 4 級 ‧ 2023-05-26 09:02:52 檢舉

可是如果我沒有 Squash 就會正常,Squash pr 後就會異常。

根據這句,我查的結果如下,因為我在版控時,會強調保留commit 紀錄,因此我平常日不用Squash的
Stack Overflow:Why does git-rebase give me merge conflicts when all I'm doing is squashing commits?

不過既然沒有Squash是正常的,那為何乾脆就不要Squash,直接merger呢?
medium:為什麼我不用 Squash and merge

原因,一個字,醜。
因為 main-devops -> main-dev
常常會有
commit4 "test1"
commit3 "test2"
commit2 "test3"
commit1 "test4"
main-devops
main-devops 回到穩定的 main 提交上面 commit 超醜。

main 當然要美美的該長這樣
commit4 "[devops] - env:prod add test stage"
commit3 "[devops] - PR codereview add assign codereviewr"
commit2 "[devops] - build docker images build"
commit1 "[devops] - PR codereview add static test"

不想長成這樣
commit101 "[devops] - env:prod add deploy stage "
commit5~100 "test"
commit4 "[devops] - env:prod add test stage"
commit3 "[devops] - PR codereview add assign codereviewr"
commit2 "[devops] - build docker images build"
commit1 "[devops] - PR codereview add static test"

alien663 iT邦研究生 4 級 ‧ 2023-05-26 12:01:52 檢舉

commit message其實比起美醜,更重要的是內容完整度,有人根據Angular團隊的規範有篇文章可以參考看看。
都已經使用版控了,其實做好這些文件訊息還是比較重要的。
另外,Stack Overflow的方法有幫助到你嗎?
Git Commit Message 這樣寫會更好,替專案引入規範與範例

謝謝你, Stack Overflow 其實沒有幫助,
他其實是用 rebase 與 cheery pick 的作法。去處理的。
main 分支只是穩定版本,穩定版後面還有要合併的情況的。
rebase 我測試過還是沒有辦法,還是會衝突
cheery pick 算不上是 devops team 常規用法
哪一天換其他的團隊成員維護就會覺得怪怪的。

內容完整度我認為確實是每一個 commmit 要清楚,但把一堆"test"丟進去 commmit 肯定不是合理做法。

這個連結 commit 的開頭與寫法我知道,只是寫法規寫法,還是不知道為甚麼衝突的原因
Git Commit Message 這樣寫會更好,替專案引入規範與範例

目前還沒解決,但有一點曙光
最後,我回去比對了一下開發 team 成員 commit,
我想說我那個 demo 很乾淨都會有衝突。
開發 team 怎麼不會沒衝突。

檢查一番後,應該是開發 team 有人定期把 main-dev 砍掉重新把 main 重拉。
所以它們開發分支 merge 進 main-dev 與 main 才不會衝突。

因為找到突破點,我想應該很快會解決。

0
janlin002
iT邦好手 1 級 ‧ 2023-05-25 11:12:40

前面只提到四個分支(main, main-dev,main-devops,main-devops),怎麼後來又殺出一個 dev-env

這問題要解的話,可以考慮找一個最新的分支(裡面東西最全),然後 push -f main,確保 main 也是最新的,這樣再拉分支應該就不會有衝突了

看更多先前的回應...收起先前的回應...

寫錯 dev-env -> main-env

會有權限上的問題,
不方便直接 push -f main
main 是 dev 跟 devops 都會合併並進去的,
我能控制的只有從 main 拉 devops 出來的動作
main-dev , main 跟 main-dev 是開發管的。

janlin002 iT邦好手 1 級 ‧ 2023-05-25 13:54:34 檢舉

main-env ?
所以四支分支是 main, main-dev,main-devops,main-env ?
那這樣的話,先不要拉新的分支,等到把現有的 main-devops 都合併回去以後,再拉新的分支,確保新的分支是最新的分支

janlin002 iT邦好手 1 級 ‧ 2023-05-25 13:56:59 檢舉

不過奇怪的是你可以發 PRmain,但沒有權限 push -f

Sorry, 我一直打錯,因為要保護公司分支名稱,所以腦袋沒轉過來。

四隻分支是
main (主要的乾淨的 code) 主要是開發lead管理的
main-dev 這個是開發lead 從 main拉出來的分支
main-devops 這個是我可以從 main拉出來的分支名稱,合併進main這個分支就會被砍掉。
main-devops2 這個是我為了這個問題,特別用2來標示,平常我 CI/CD 合併進去,開新的分支名稱還是main-devops

開發者平常也是從 main 拉 功能分支 main-dev-featureX 把代碼提交進 main-dev

devops 也是從mainmain-devops 去做開發把 CI/CD 提交進main-dev
跑了沒問題 main-devops PR main

我一定有 main push -f 的權限,可以要強制推要知會開發 lead,但是每一次強推都要開通知開發 lead 這顯然不是一個好作法。

janlin002 iT邦好手 1 級 ‧ 2023-05-25 16:30:27 檢舉

這樣解釋有比較清楚~~

這樣的話,可以靠慮先不要拉新的分支,等到把現有的 main-devops 都合併回去以後,再拉新的分支

然後不是 push -f 以後,之後每次都要 push -f,只是強制更新目前的 main而已,所以只會做一次,除非你常常把 git 搞壞,要拿其他分支去擋...

janlin002 iT邦好手 1 級 ‧ 2023-05-25 16:32:08 檢舉

然後確認一下,你應該知道 squash 完,一定要 push -f 吧?

不太懂,先不要拉新的分支 是什麼意思,我晚點補圖好了。
main-devops 本來就會合併到 main
合併完成之後才會拉新的 main-devops

不知道,從網路的資料來看,也不需要 push -f
https://gitbook.tw/chapters/rewrite-history/merge-multiple-commits-to-one-commit

一般開發者應該都是從 main 這樣的穩定分支拉一條出來做 feature branch 完成後合回 main 再拉一隻 feature branch
繼續開發新功能,沒聽過一定要 push -f
不然的話如果一個公司假設5個後端都需要壓縮 commit
codereviewer 幫忙 squash 的話,不就 squash 一次 push -f 一次嗎

我要發表回答

立即登入回答