突然想寫這一篇 Git 的使用心得,主要有幾個原因,其一是自己使用 Git 也有快3年時間了,其間自己經歷過一些坑,也有迷茫的時候,在呆過的大大小小的團隊中,其實每個人也都並不是 Git 專家,很多對於流程以及 Git 本身的理解,還處於一個比較混亂的地帶。自己寫這篇文章希望能拋磚引玉,在總結自己得失的同時,能給大家帶來更深層次的思考。
直接進入主題,經過這么多年的實踐,多次想避開 Git Flow 尋找更簡單的流程,每次自認為找到了捷徑,但事實上都發現有這樣或者那樣更多的問題,所以,我認為最佳的 Git 實踐,仍然得基於標准的 Git Flow,來看看 Git Flow 的標准模型,下面是大家非常熟悉的圖(來自非常經典的 Git Flow 奠基論文:http://nvie.com/posts/a-successful-git-branching-model/):
基於這個 Git Flow,我所認為的 Git 最佳實踐,補充和修復了這么幾點:
1. 分支規則
分支一共有5類,名稱用 / 來區分是因為 SourceTree 里面 / 可以作為一個文件夾使用,命名標准為下面這樣:
master
develop
feature/***
release/v13.5
hotfix/v13.2
本地的分支可以有一些其他的命名規則,沒關系,但是推到遠程的必須是這幾種命名規范,最好一字不差,比如不要把 release 寫成 Release
2. 特殊情況
此 Git Flow 唯一可以變通的地方為開發的時候非必須一定要用 feature 分支,比如說一個項目剛開始開發的時候,或者突然發現一個不是特別嚴重的 bug,我現在先修改下,想在下一個版本發的時候一起帶出去,這種情況就在 develop 上面改就行了。
3. 與標准Git Flow的差異
與 Git Flow 的論文略微不同,我倡導的是:一個版本開發完成,需要提測的時候,由各個 feature 合並到 develop,然后在 develop 上開發自測,修復 bug,正式提測的時候,由 develop 遷出 release 分支,提測
我個人認為這是一個非常良好的開發模型,伸縮性強,適用於各個規模的開發團隊,一個人開發,我也會這么干,20個人的團隊,也是沒有任何問題的。關於這個模型,如果有任何疑問和更好的建議,都可以關注我的公眾號(文章底部),大家一起學習。
關於一些常見的問題和疑問,我在這里做下解釋:
1. 最經常問的,為什么忽略文件無效
因為 Git 的忽略文件沒有辦法對已經納入版本庫的文件生效,解決辦法:gitignore 里面添加完之后,把本地文件刪了,然后 commit,push 上去,別人再更新,就OK了,下次還有這種類型的文件,就直接忽略了
2. Git 可以添加項目中的文件夾權限控制嗎
不行,問這個問題的原因是因為很多人把 svn 的思維搬到 Git 上來,Git 並不是以文件夾為單位來組織的,所以現在大多數公司中UI的圖片等資源,像 png,psd 等文件都是用的 svn 管理,代碼用 Git 管理。想要用這種權限控制的話,很多人另辟捷徑選擇用 Git 的子模塊和子樹來處理,我感覺也是不太好
3. 關於 Git 客戶端
我認為就兩種選擇,命令行和 SourceTree 等全局的客戶端軟件,TortoiseGit 根本不適用,原因就是 Git 不是以文件夾為組織單位的,TortoiseGit 是依托於文件管理器的操作,所以不對付。然后就是各種 IDE的插件,很多人用,我個人也是不喜歡,原因很簡單,Git 是一種生活方式,並不只是在項目中用用而已
4. 關於 Git 代碼回滾
豪放派 reset:
本地的分支先(reset)重置到一個 commit,然后:git push -f,強推,這種是屬於刪除 commit 歷史的行為,而且強推需要權限,一般來說 master 分支默認都不讓強推
優點:徹底清除版本庫上無用的代碼,干凈,但是做這種操作的同時,最好本地新建一個分支備份下代碼
缺點:誤操作的代價比較大
婉約派 revert:
git revert HEAD~1(1代表從0到1,回退包含當前 commit 的兩個 commit,然后會創建新的 commit)
優點:所有歷史都在,回退的做法為新建一個 commit 來回滾之前幾個 commit 的代碼
缺點:回退幾個 commit 這個需要手動計算,比較煩
5. cherry pick 合並單個提交
cherry pick 不能完全合並單個 commit,因為每個 commit 都是建立在前一個 commit 之上
關於我:Android 和 JavaEE 開發工程師,運營有微信公眾號"大土豆愛開發",原則“簡單,分享”,涉及的內容包括但不限於 JavaEE,Android,Git 等,歡迎大家關注,共同學習。
二維碼: