Git提交規(guī)范流程和解決沖突實際使用

前言:GIT對于我們程序員來說是吃飯的工具构眯,本篇主要是針對提交和分支以及對于大多數(shù)程序員聞風喪膽的沖突一些個人見解俏讹,如果有啥不對的或者你們公司git提交流程歡迎下方評論秸弛。

在討論規(guī)范之前裁厅,我們需要定最基本的要求

1.團隊內(nèi)保持良好的代碼格式便于易讀和維護柔昼,最主要減少不必要的代碼沖突(建議統(tǒng)一使用開發(fā)工具(idea)的代碼格式化)馍乙。

2.提交任何代碼必須確認代碼可運行

3.提交的代碼必須移除無用的包路徑引用和無用的依賴布近,盡量不要使用過期的方法或者類

1 .?commit message規(guī)范?

規(guī)范格式:

type??

feature: 新功能(feature)

fix: 修補bug、style等

refactor: 重構(即不是新增功能丝格,也不是修改bug的代碼變動)

test: 增加測試 chore: 構建過程或輔助工具的變動

subject

? 提交目的的簡短描述撑瞧,描述做了啥或者改了啥,如果有團隊管理工具(issue ,JIRA)或者產(chǎn)品需求显蝌,必須以內(nèi)部命名的需求代號作為描述信息的一部分预伺,方便查看日志,合并和cherry-pick曼尊。

舉例:?

feature:開發(fā)完成#代號?XXX.XXX需求? ?

fix:修改?#代號?XXXX查詢問題


2. 提交規(guī)范以及GIT開發(fā)流程


Git分支?

master??? ? ? (生產(chǎn)環(huán)境)? ? 部署某個uat功能到準生產(chǎn)的時候合并到master酬诀,只允許uat分支合并/cherry-pick。

uat? ? ? ? ? ? ? (測試環(huán)境)? ? 部署某個feature分支到測試的時候合并到uat骆撇,只允許feature分支合并瞒御。

feature/xxxx? (特性分支)? ? ? 開發(fā)一個功能或者修改bug的時候合并/提交到feature

dev/xx? ? ? ? ? ?(本地開發(fā)版本)


在開發(fā)之前,需要在master分支上切一個以需求,BUG,重構.......命名feature分支 神郊,比如?feature/項目編號(BUG的代號)

2.1? 本地沒有項目葵腹,克隆代碼的并切換到開發(fā)分支

克隆并在需要開發(fā)的feature分支上創(chuàng)建本地dev開發(fā)分支高每,本地分支可以以dev/自己標識的英文命名。

gitclone-b dev/xx? feature/項目編號

2.2? 本地有項目践宴,切換開發(fā)分支

為了避免本地分支與遠程不一致鲸匿,需要切換到?feature/項目編號分支,更新一下阻肩。

git checkout feature/項目編號

git pull

再在?feature/項目編號上切出自己的開發(fā)分支

git checkout dev/xx

2.3 提交代碼

注意:必須把不需要提交的后綴或者文件添加到和.git同目錄的 .gitignore文件中

添加修改的文件到暫存區(qū)(staging area)

git add .? ?

將修改后的文件提交到本地的版本庫中

git commit -m'fix:修改了XXXXX'

也可以兩步合成一步操作

git commit -am'fix:修改了XXXXX'


提交代碼我個人是建議最好使用idea或者其他git圖形化界面來操作勾選需要添加的文件带欢,或者操作。

git后面的圖標對應的意思

? ? 第一個是 git 拉代碼操作按鈕

? ? 第二個是 git 提交操作按鈕

? ? 第三個是 git log操作按鈕

? ? 第四個是 git revert操作按鈕

首先點擊git提交按鈕

點擊提交按鈕就能清楚的看到git status的情況烤惊,有修改的有哪些文件乔煞,哪些文件需要提交git,哪些文件不需要提交git柒室。如果臨時或者不小心動的地方可以使用revert恢復到修改前渡贾。

如果這個文件不需要修改,或者不小心空格等操作雄右,直接使用 revert恢復

如果這個文件是項目啟動時候生成的空骚,比如項目導出的excel或者log日志,直接使用 delete刪掉


小技巧:大家在開發(fā)過程中擂仍,可以隨時進入上圖的提交界面直觀的看到哪些文件有變動囤屹,更方便和更高效的管理自己修改的內(nèi)容,其他桌面圖形化也可以逢渔,比如? TortoiseGit肋坚,Source Tree,以及git自帶的兩個 gitk 和 git-gui (在git目錄里輸入命令)肃廓。


2.4 推送到遠程分支

在推送本地分支dev到遠程dev的時候智厌,需要先切換到?feature/項目編號分支,merge遠程分支代碼。

git checkout feature/項目編號

git pull

再切換到自己的開發(fā)分支dev/xxx?

git checkout dev/xxx

rebase?feature/項目編號到自己dev/xxx盲赊,主要作用就是檢查是否有沖突峦剔。

git rebase feature/項目編號

沒有沖突,直接push dev/xxx到遠程 dev/xxx

git? push? origin dev/xxx


如果有沖突角钩,可以在合并沖突后的任意時刻使用 git status 命令來查看那些因包含合并沖突而處于未合并(unmerged)狀態(tài)的文件

git status

所有合并中沖突而待解決的文件,都會以未合并狀態(tài)標識出來呻澜。 Git 會在有沖突的文件中加入標準的沖突解決標記递礼,這樣你可以打開這些包含沖突的文件然后手動解決沖突。

<<<<<<contact : email.support@github.com=======please contact us at support@github.com>>>>>>> dev/xx:index.html

以上文件內(nèi)容表示head指向的(也就是rebase的那個分支)版本和下面dev/xx指向的版本有沖突

=======為分割線羹幸,上半部分是head指向的分支的版本的代碼脊髓,下半部分是dev/xx分支所指向的版本的代碼

上述的沖突解決方案僅保留了其中一個分支的修改,并且<<<<<<< , ======= , 和 >>>>>>>?這些行需要被完全刪除栅受。

修改完成之后需要操作

git add .

?使用 git add 命令來將其標記為沖突已解決将硝。 一旦暫存這些原本有沖突的文件恭朗,Git 就會將它們標記為沖突已解決

然后繼續(xù)rebase操作:

git rebase --continue

一直循環(huán)rebase --continue,直到rebase成功

然后push

git? push? origin dev/xxx

最后登錄gitlab或者coding的web管理依疼,提交合并請求痰腮,將遠程分支dev/xxx和遠程分支feature/項目編號分支合并,合并之后才能表示你的提交完成了律罢。等feature分支所有的人開發(fā)完成并測試通過之后膀值,再將feature合并到uat進行上線測試。


現(xiàn)在我們看看借助我們神器idea來解決沖突误辑。

在操作 merge沧踏,rebase,cherry-pick? ?,當有沖突的會彈出conflicts

最好不要直接選擇采用遠程還是采用自己修改的代碼,還是單獨點擊文件選擇每一行的變動

解決完成之后apply之后直接push就可以了巾钉。



總結:


對于git而言翘狱,只有push和pull操作才會和遠程打交道,其他的命令都是本地完成的砰苍,也就是說只有pull,push或者在git平臺上直接發(fā)起遠程分支和遠程分支合并請求的時候才真正知道有木有沖突潦匈。即使本地rebase feature ,但還是沒有辦法保證dev和feature沒有沖突师骗,因為你rebase的時候不能代表你當前本地feature分支和你發(fā)起合并請求時候的feature分支的代碼完全一致历等,所以rebase feature 只是提前降低了合并feature時候的沖突。


對于git操作的流程辟癌,大家使用習慣有些不一樣寒屯,實際上怎么操作都沒有錯,如果公司黍少,團隊有所認可的規(guī)范寡夹,還是按照規(guī)范來。

常見的提交方式?:

? ? ? ?1.直接在feature分支開發(fā)厂置,每個人在commit之前pull(git fetch + git merge)一下新的feature的代碼菩掏,然后有沖突一次性解決之后 add.?commit? push。

? ? ? ?2.直接在feature分支開發(fā)昵济,每個人先commit到本地分支虱黄,然后pull --rebase (git fetch + git rebase)當前新的feature的代碼适刀,然后有沖突解決之后 add.? ??push。

? ? ? ?3.就是我上面寫的嚴格操作,每個人都有一個自己命名的本地開發(fā)分支宗挥,通過和本地的將要合并的本地分支merge或者rebase來解決沖突烘豌,然后通過web平臺的請求來合并盐杂。

? ? ? ?4.歡迎大家提供更多牛逼哄哄的方式踪少。。卧斟。殴边。憎茂。。锤岸。


??第一種竖幔,是最簡單的,最常見的操作的方式能耻,這種方式容易在解決沖突的時候把自己修改的代碼弄丟赏枚,操成無法挽回的結果。(大家可以借助idea本地的歷史回滾也是可以)

? 第二種晓猛,先提交饿幅,再拉代碼rebase,可以保證自己的代碼提交到了本地分支戒职,不管之后怎么瞎操作改代碼都不會丟失這條已提交的commit栗恩。

? 第三種,操作有點復雜洪燥,雖然繞了一點彎路磕秤,但是和第二種相比較,主要區(qū)分就是feature分支允不允許直接提交捧韵。如果允許市咆,那feature合并的權限控制就放在合并到uat的這個環(huán)節(jié)。


簡單的理解:GIT的操作無非就是拉代碼再来,推代碼蒙兰,合并代碼,在每一步和遠程分支打交道的操作才會真正出現(xiàn)沖突芒篷。但是什么時候提前解決沖突或者以什么方式解決沖突有很多種搜变。

不管你用什么圖形化工具,但是我們需要先搞清楚git的基本命令针炉,以及每一步圖形化工具操作的背后git操作的命令挠他。

警告:有沒push的代碼不要刪.git目錄,你懂得篡帕。


沒有解決沖突然后強行push的后果殖侵,哈哈哈,我笑了

彩蛋;?

上面提交的知識講完了镰烧,我們拓展一下知識

1.reset怎么用拢军?

用法:

git reset --mixed/--hard/--soft c27894c06a2cc23e4097a93013cf640cc4fd527d

git reset –mixed HEAD~1

回退一個版本,且會將暫存區(qū)的內(nèi)容和本地已提交的內(nèi)容全部恢復到未暫存的狀態(tài),不影響原來本地文件(未提交的也

不受影響) ,也就是恢復到add之前

git reset –soft HEAD~1

回退一個版本,不清空暫存區(qū),將已提交的內(nèi)容恢復到暫存區(qū),不影響原來本地的文件(未提交的也不受影響),也就是恢復到commit之前

git reset –hard HEAD~1

回退一個版本,清空暫存區(qū),將已提交的內(nèi)容的版本恢復到本地,本地的文件也將被回退的版本替換,也就是恢復到?jīng)]開發(fā)之前

?首先強調(diào)已上線的項目reset不建議使用拌滋,也禁止使用,為啥這么說呢猜谚?

?git本身就是存儲代碼所有歷史記錄败砂,不管你是錯誤提交還是提交的代碼有BUG赌渣,應該是在錯誤的基礎上再commit一條你修正的提交,而不是撤銷你已經(jīng)提交到遠程分支的代碼昌犹。

?如果你不小心把一部小電影提交到了GIT坚芜,或者你想“刪代碼跑路“,再或者你的改動操成了成千上萬的BUG斜姥,?reset之后鸿竖,需要強制push到遠程分支,reset點之后的遠程分支的提交的記錄將永久消失铸敏。

2.我想合并uat分支的某次提交之前的代碼

?git ?checkout -b uat20190711 c27894c06a2cc23e4097a93013cf640cc4fd527d?

?可以push到遠程再和其他分支合并或者切換其他分支rebase直接push

3.cherry-pick這么用缚忧?

git? cherry-pick -x -n 017822ece3049d3f46c72cabf32dee9f44dd15cc

將某一次提交的改動直接在當前分支上做修改,然后提交即可杈笔,所以提交的commit就需要寫清楚你提交的意圖闪水。

-x 保留原作者? -n 不自動提交


圖形化工具截圖,自己摸索蒙具,都一個樣球榆,找到某一條commit的記錄直接操作即可。

博客地址:https://my.oschina.net/wangnian

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末禁筏,一起剝皮案震驚了整個濱河市持钉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篱昔,老刑警劉巖每强,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異旱爆,居然都是意外死亡舀射,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門怀伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脆烟,“玉大人,你說我怎么就攤上這事房待⌒细幔” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵桑孩,是天一觀的道長拜鹤。 經(jīng)常有香客問我,道長流椒,這世上最難降的妖魔是什么敏簿? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上惯裕,老公的妹妹穿的比我還像新娘温数。我一直安慰自己,他們只是感情好蜻势,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布撑刺。 她就那樣靜靜地躺著,像睡著了一般握玛。 火紅的嫁衣襯著肌膚如雪够傍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天挠铲,我揣著相機與錄音冕屯,去河邊找鬼。 笑死市殷,一個胖子當著我的面吹牛愕撰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播醋寝,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼搞挣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了音羞?” 一聲冷哼從身側(cè)響起囱桨,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎嗅绰,沒想到半個月后舍肠,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡窘面,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年翠语,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财边。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡肌括,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出酣难,到底是詐尸還是另有隱情谍夭,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布憨募,位于F島的核電站紧索,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏菜谣。R本人自食惡果不足惜珠漂,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一晚缩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧媳危,春花似錦橡羞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽莺债。三九已至滋觉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間齐邦,已是汗流浹背椎侠。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留措拇,地道東北人我纪。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像丐吓,于是被迫代替她去往敵國和親浅悉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355