git管理復雜項目代碼

背景

我初學前端的時候接觸git,那時候只要會add/commit什么的就好了,網上的教程大多都停留在從頭到尾一個個介紹git的命令,關于各種用法,特別是多個分支來回交叉沖突的實際處理,很少有這方面的介紹,經過很多次的實踐(踩雷?),想分享一點經驗,給剛進入前端的同學做過渡用,但畢竟一千個人有一千個使用git的方式,所以不保證對所有人都是有用的?

現在在公司開發維護一個比較大的項目,有公司自己實現的各種npm包、框架代碼、各種業務公共代碼和業務實現代碼,總行數五六十萬行,頻繁的git提交經常導致代碼翻車,經歷過多次車禍現場也算有點心得?。我司前端代碼庫主要有dev/test/release環境分支(分別對應后端三個環境),幾個大的項目/特性分支和小百個業務分支,主要的規則就是自己開發的特性分支合并到dev(和后端聯調)=>合并到test(提交測試同學測試,改bug)=>合并release(測試同學模擬線上環境測試,準備發布線上),說出來感覺非常清晰簡單,實際操作會有各種問題,有天災(臨時改需求,后臺改字段),有人禍(提交代碼不規范)。

外部的可視化工具

如果不是特別熟悉git,還是先老實選一款git可視化工具吧,推薦SourceTree(安裝后需要免費注冊,注冊要翻墻),之前用過GitHub Desktop,輕量的git工具,不能滿足復雜的需求,后來用了SourceTree,隨著版本的更新,越來越好用。 有關SourceTree的使用可以寫一篇文章,但是如果對git有稍深一點的理解,非常容易上手,節省了記命令的腦容量,節點圖也非常直觀。剛使用的同學建議多探索一下,很多操作如解決沖突、重置等比命令行要快,絕大部分命令都能用簡單的操作代替。如果git倉庫分支多而且關系復雜,純寫命令行的git老司機也容易翻車?

本地和遠程origin

提交代碼之前請三思,如果是使用SourceTree,請不要在提交上點擊同時推送到遠端(非常重要

這樣提交以后,如果發現自己提交有問題還可以選擇更正上一次提交。我們公司的遠程倉庫除管理員無法回退,所以每次提交要非常謹慎,據說很久以前沒那么多限制,大家在release/test上也隨意resetpush -f,回退的同時把這中間別人提交的代碼也干掉了,于是公司就禁止了除管理員以外對遠程倉庫的修改。理論上說在這三個環境分支release/test/dev上大家不應該直接提交,應該從其他分支改完merge過來,但是畢竟直接提交更方便,有個精度/樣式小bug之類的直接改掉,比切到相應業務分支改掉提交,切回環境分支,merge過來更加的快,但是萬一提交出錯,就比較尷尬,所以還是不能懶。

提取單次提交cherry-pick

cherry-pick這個命令非常強大,也是我習慣SourceTree后唯二在命令行使用的git命令(還有revert merge),它是提取出某個分支的特定的那次提交應用到其他分支上,精準的操作,對其他代碼不會造成任何影響。假如有個緊急bug,即將上線,我直接在release上改了,那么事后一定要同步到自己的特性分支和test等其他環境分支,這時候又不想merge過去,就需要用到cherry-pick了,具體使用命令 git cherry-pick xxxxx,(xxxxx可以取簡略的那個commitId)

回退revert及回退某次合并

分支多,合并也多,先說合并merge,merge xxx1 into xxx2這個命令中,xxx1是傳入分支,xxx2是當前分支,把xxx1分支上的代碼合并到xxx2這個分支上,xxx1上新的代碼就到了xxx2上了。比如我自己新開發的一個業務分支開發測試都搞得差不多,那我就準備合并到release,很好理解,但是合并完過一段時間被告知不對,不應該上去,產品還有別的想法?,那就revert吧,(由于前面的原因,reset是被禁止的)revert有優點,會只影響那一次提交的的代碼,但是缺點是會產生一個新的節點,revert merge又有不同,還拿上面的例子,假如提前合并上了不該上的代碼,那只能revert,具體代碼git revert xxxxx -m 1 xxxxx還是commitId,1表示當前分支為準,2表示傳入分支為準,一般都是1,然后自己的特性分支又改了很多,等到了要上release的時候是沒法在直接merge的,因為revert是一個比較新的節點,這樣就要再次revert那個revert提交的commit(和第一次commit不一樣,是revert的commit),完了再進行merge自己特性分支最新的代碼就可以了(來回merge加revert超亂的,下次誰出問題直接打死他?)

分支污染

分支污染這個問題主要是針對多個開發任務并行的情況,比如這個優惠券功能打算下周上,那個價格比對功能下下周上,那么這兩個分支千萬不能互相合并,或者間接合并,道理很簡單,但是任務一多很容易亂,還有,多個特性任務分支可以隨時把release合并進來(最好經常合并以保持同步),因為這是最終版本,但是不能合并除release之外的其他分支,特別是test/dev分支,test/dev分支上存在了許多各種橫死的/半死的項目,這些千萬不能出到其他分支,要不然其他分支上到release就把這些垃圾內容帶過去上線。總之,各公司情況不同,但是大致結構差不多,把握好單向的代碼流就好。

復雜場景

實際情況可能很復雜,因為我們公司用json來保存用戶級的各種配置,tsx對某些大型組件里面字段類型做校驗,這些都是自動生成的,有時候只改了一點配置,就生成了一大堆更改,這樣的反復多人在不同分支修改以后,一合并沖突的連它媽都不認識了,這個仍是當前項目的痛點,有可能每次合并就要花去單人半天一天的工作量,這樣的只能手動修改合并,借助編輯器內部工具,如果后期有時間可能會把node層json配置改為mongoDB,但是本地json配置還沒有好辦法,歡迎留言區提出方案。

編輯器內部git工具(vscode的gitlens和webstorm)

vscode里面的必裝插件gitlens最近進行了更新,合并等功能已經快趕上webstorm了,合并的三欄式布局適合修改一些復雜沖突,左右是當前以及傳入的代碼,中間是自己的修改,非常的科學,還有很多功能如查看當前這個文件所有的歷史更改,與某個分支的某個文件的快速比對等等功能,解決了復雜項目的很多痛點。

提交鉤子及繞過

公司對git有很多規范,禁止了push -f,對commit提交的備注信息做了限制,這個是在自己項目的.git/hooks/里面有限制,可以自己修改,我們統一是必須攜帶JIRA任務號,便于JIRA統計或者提交的是merge信息,但如果想跳過的話(規則就是用來打破的,?),可以在SourceTree提交里設置繞過鉤子提交

tag的問題

實際在多人協作項目里使用git,基本沒有打過tag,tag的問題就在于如果和分支名字一樣,切換/合并分支容易到tag,而且打了錯誤的不合適的tag,必須遠程和所有本地一起刪除tag,要不然只要有一個人本地有tag,一push又到了遠程,難以去除,一般都是在運維用jenkins部署時打個上線日期tag,便于回退(但是如果jenkins部署打的tag不規范、重名,也會引發前端代碼庫提交各類問題)。

總結

git這東西說簡單也簡單,說難有的問題直撓頭皮,但是我覺得,最重要的是要養成一個好的提交習慣,提交本地前先三思,提交到遠程前再想一遍,避免翻車,對團隊代碼造成災難型的后果,影響他人工作。 純手敲出這么多字,如果感覺有些幫助,那我就很滿足了,如果有問題盡管提,共同進步!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/449914.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/449914.shtml
英文地址,請注明出處:http://en.pswp.cn/news/449914.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實現一個通用的生產者消費者隊列(c語言版本)

背景:筆者之前一直從事嵌入式音視頻相關的開發工作,對于音視頻的數據的處理,生產者消費者隊列必不可少,而如何實現一個高效穩定的生產者消費者隊列則十分重要,不過按照筆者從業的經驗,所看到的現象&#xf…

美媒:小米新浪達成合作 采取行動對抗騰訊

來自美媒的報道稱,兩家中國最具發展潛力的科技公司,新浪和小米將會共同合作,結合各自的通信應用程序來共同對抗移動通信的挑戰,尤其是擁有2億用戶的強勁對手微信。 來自中國的消息稱,這次新浪與小米的合作將會涉及到新…

Linux expr命令、Linux wc命令、Linux let 命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 expr命令是一個手工命令行計數器,用于在UNIX/LINUX下求表達式變量的值,一般用于整數值,也可用于字符…

【English】六、am,is,are 分別用在什么地方

is:第三人稱單數am:第一人稱單數are:第二人稱單數,第一、二、三人稱的復數 用于第一人稱, I am ......(我是.......)用于第三人稱, He is ......(他是......) 或She is ......(她是......), It is ......(它是.......)用于第二人…

誤刪了公司數據庫,但我還是活下來了

專欄 | 九章算法 網址 | www.jiuzhang.com 上周我與同事們進行了一次關于職業生涯中搞砸了一些事情的簡短談話。這確實會淪為他人笑柄,卻更給我們帶來了珍貴的教訓。重要的是,我們應該分享那些曾經的錯誤,這樣其他人就可以從其中學習。下文是…

改良程序的11技巧

有很多理由都能說明為什么我們應該寫出清晰、可讀性好的程序。最重要的一點,程序你只寫一次,但以后會無數次的閱讀。當你第二天回頭來看你的代碼時,你就要開始閱讀它了。當你把代碼拿給其他人看時,他必須閱讀你的代碼。因此&#…

歷時四年,給Google提交的Android Framework Bug終于被Fixed了

歷時四年,Google終于修復了一個我發現的Android Framework Bug 2014年在做一個Android終端設備開發過程中,發現了一個Android Framework層的Bug,給Google提交了issue和解決方案,和外界傳言一致Google一般不太在意個人開發者提交的…

Linux ping命令、Linux kill命令、Linux logname命令、 Linux logout命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Linux ping命令用于檢測主機。 執行ping指令會使用ICMP傳輸協議,發出要求回應的信息,若遠端主機的網絡功能沒有…

前端布局神器display:flex

2009年,W3C提出了一種新的方案--Flex布局,可以簡便、完整、響應式地實現各種頁面布局。目前已得到所有現在瀏覽器的支持。 flex瀏覽器支持一、Flex布局是什么? Flex是Flexible Box的縮寫,翻譯成中文就是“彈性盒子”,用…

bind簡單轉發實驗

2019獨角獸企業重金招聘Python工程師標準>>> *主配置文件內容// [rootlocalhost /]# cat /etc/named.conf // // named.conf // // Provided by Red Hat bind package to configure the ISC BIND named(8) DNS // server as a caching only nameserver (as a local…

數據結構:塊狀鏈表

一、概述 有時候我們需要設計這樣一種數據結構:它能快速在要求位置插入或者刪除一段數據。先考慮兩種簡單的數據結構:數組和鏈表。數組的優點是能夠在O(1)的時間內找到所要執行操作的位置,但其缺點是無論是插入或刪除都要移動之后的所有數據&…

記賬本開發小計(四)

今天處理的是記賬本小軟件中的查詢功能,由于賬目的要求就是準確性,所以對于記賬本程序來說,模糊查詢并不適用,所以在這里只能是按照指定的條件來進行查詢所以我做的事按照時間進行查詢,為了方便進行處理,這…

Linux ps命令、Linux top命令

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。 Linux ps命令用于顯示當前進程 (process) 的狀態。 語法 ps [options] [--help][options] [--help] 參數: ps 的參數非常…

Prime Distance POJ - 2689 線性篩

一個數 $n$ 必有一個不超過 $\sqrt n$ 的質因子。 打表處理出 $1$ 到 $\sqrt n$ 的質因子后去篩掉屬于 $L$ 到 $R$ 區間的素數即可。 Code: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const…

給定a和n,計算a+aa+aaa+a...a(n個a)的和(大數據處理)

題目描述&#xff1a;給定a和n&#xff0c;計算aaaaaaa...a(n個a)的和。 輸入&#xff1a;測試數據有多組&#xff0c;輸入a&#xff0c;n&#xff08;1<a<9,1<n<100&#xff09;。 輸出&#xff1a;對于每組輸入,請輸出結果。 樣例輸入&#xff1a;1 10 樣例輸出&…

ssh和rsh的區別、Linux rsh命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 ssh 和 rsh的區別主要有: 1 安全級別不同, 主要是ssh的密碼等都是加密傳輸,而且還有密鑰認證的機制, rsh明文傳輸. 而且沒有密鑰的機制.…

Java并發編程(多線程)中的相關概念

眾所周知&#xff0c;在Java的知識體系中&#xff0c;并發編程是非常重要的一環&#xff0c;也是面試中必問的題&#xff0c;一個好的Java程序員是必須對并發編程這塊有所了解的。 并發必須知道的概念 在深入學習并發編程之前&#xff0c;我們需要了解幾個基本的概念。 同步和異…

4、容器虛擬化網絡概述

Docker 網絡 Docker 的網絡實現其實就是利用了 Linux 上的網絡名稱空間和虛擬網絡設備&#xff08;特別是 veth pair&#xff09;。 Linux 網絡命名空間&#xff1a;https://www.jianshu.com/p/369e50201bce Linux虛擬網絡設備之veth&#xff1a; https://segmentfault.com/a/1…

Linux whoami命令、Linux su命令、Linux w命令

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Linux whoami命令用于顯示自身用戶名稱。 顯示自身的用戶名稱&#xff0c;本指令相當于執行"id -un"指令。 語法 whoami […

Weekly 10

Algorithm 1.Remove Element What 移除數組中的指定元素,返回處理后的長度sum,并且數組前sum長度的元素為處理后的元素,不用額外數組&#xff0c;O(1)。How 用快慢指針,快指針遍歷,遇到不等于指定元素的替換掉慢指針,然后慢指針前進一位即可。Key Codesclass Solution {public …