git-workflow[工作流]

martist發表於2018-08-23

下面向大家分享下我所在的小公司所使用的git工作流,有更好的建議可以評論補充,謝謝。

原理

分支

安卓端,ios端,web端各為一名開發工程師,是各自專案的負責人。要保證程式碼不丟失,程式碼可回滾,可維護,提交資訊清晰,功能分支可回溯。

web端有後端和前端開發共同負責,幾個專案都是多人協同開發,下面的規範主要就是web端開發需要遵循的。

分支型別

master分支
feature分支
hotfix分支
develop分支
release分支(預釋出,暫時不用)
複製程式碼
最新的穩定上線分支【master分支】

master分支同時是開發伺服器和測試伺服器本地的當前分支。生產上的版本切換也是在master進行的。

開發新功能【feature分支】

在master分支上進行切feature分支,開發完之後合併進master分支(注意儲存master上一版本的標籤),部署在測試伺服器上進行測試,此時測試伺服器的版本是領先於生產伺服器的,

出現bug或者改文案【hotfix分支】

在master分支上切出來一個hotfix分支來改bug,然後生產伺服器本地當前分支回滾一個版本。 靜靜的等待bug改好了進行單元測試,有時間的條件下還要回歸測試下。然後master合併這個hotfix分支。

以功能為最小粒度的分支【開發分支】

從此,在develop branch上進行切feature branch進行功能模組的開發,合併程式碼,測試,測試成功後切出穩定預釋出版本release branch。

省略的最新未上線穩定版本分支【預發分支】

因為我們幾乎沒有新功能做好了,不上線需要等待的時候,所以這個分支暫且不用了,以保證開發和版本控制的時效。

實際意義:當我們在develop branch測試通過功能之後,切出一個預釋出分支,這個分支是穩定的,可以保障生產安全的一個分支。當線上升級版本是,master branch merge它。

使用指南

部署專案環節

git clone專案後,根據忽略檔案的描述補全配置

cat .gitignore
複製程式碼

部署php7+fpm+nginx,即可啟動專案, 推薦ezhttp工具。

開發功能環節

在開發某個功能的過程中,流程如下: 先從master切出一個新功能命名的新分支,開發這個分支的幾個人共同去維護這個新分支對應的遠端倉庫。期間可以合併master程式碼,但不要合併其他分支的程式碼。

git branch
# 確定在master分支下,不是就切過去
git checkout -b gong_neng_1
# 一頓開發之後,提交,推送對應遠端倉庫,第一次推送將建立新的遠端分支
git add .
git commit -m 'xxxxxxx'
git pull origin gong_neng_1
git push origin gong_neng_1:gong_neng_1
複製程式碼

每個地方可能因為暫存區未提交,網路 等原因產生error,肯定是會造成未成功執行的,要注意看命令列的返回資訊,不急於進行下一步。

處理衝突環節

提交了原生程式碼之後,需要先拉取遠端對應分支程式碼的程式碼,才能提交,此時容易產生衝突。檔案路徑為綠色字樣為正常更新檔案,紅色字樣即為衝突。

git diff 
# 需要處理的時候到了
git add .
git commit -m '處理xx衝突'
git push
複製程式碼

pull或者fetch操作發生程式碼衝突,找衝突程式碼部分的編寫者來一起處理程式碼的刪除或保留,由於這種情況的程式碼刪除後恢復極為困難,所以衝突程式碼的合併要謹慎,其二,要保證處理完專案中所有的衝突,才可以提交。

推測試環節

什麼時候把功能分支推送到測試環境

開發完成單個功能分支,完成自測之後
複製程式碼

具體流程如下

功能分支名字叫 gong_neng_1,先拉取合併master的程式碼,畢竟你可能很久不拉master的東西了,拉取之後,才能保證你的功能分支版本領先於master分支。

git pull origin master
git push origin gong_neng_1 : gong_neng_1
複製程式碼

不需要管測試環境的當前分支是什麼,直接拉取程式碼,命令如下

git pull origin gong_neng_1
複製程式碼

這樣就可以開始測試啦。

版本穩定環節(許可權)

功能分支經過測試之後,確認沒有bug的功能分支程式碼合併到本地的master分支。(此處簡化了一些流程,以保證上線流程的時效)

上線環節(許可權)

首先切出來一個當日日期版本號的分支,然後在這個新分支上 拉取,合併 準備上線的版本。即使測試,如果有問題可按照branch回滾。 有問題的情況下,新切的分支刪掉,等補完bug後,再切新分支,去拉取新程式碼。

問題和解決方案

如果某遠端分支推不上去,怎麼辦?

可以先推到遠端倉庫的其他一個分支,讓master來合併。

git push origin question:ques
複製程式碼

刪除遠端分支命令:

git push origin --delete question
複製程式碼

從此ques取代question分支,作為開發題庫模組的功能分支。 工作重要善用切分支進行操作。以保護master不會受到汙染,保證在網路不穩定或其他情況下處理版本產生的問題。

怎麼在專案開始/專案中正確的新增忽略檔案或目錄?

當我們需要刪除暫存區或分支上的檔案, 同時工作區也不需要這個檔案了, 可以使用

git rm file_path
git commit -m 'delete somefile'
git push
複製程式碼

當我們需要刪除暫存區或分支上的檔案, 但本地又需要使用, 只是不希望這個檔案被版本控制, 可以使用

git rm --cached file_path
git commit -m 'delete remote somefile'
git push
複製程式碼

往往你需要的是最後這個----> 忽略一個已經被跟蹤的檔案/目錄(再也不管它了):

echo dir/ >> .gitignore
git add .gitignore
git commit -am 'ignore dir ok'
git rm -r --cached dir
git commit -am 'ignore dir forever'
複製程式碼

怎麼給git命令建立快捷方式?

第一種方法:

通過配置git本身,

git config --global alias.s status
複製程式碼

從此,git s就是git status

第二種方法:

vim ~/.gitconfig
複製程式碼

第三種方法;

vi ~/zssrc
vi /etc/profiles
複製程式碼

配置系統的別名

規範&禁用

在微信開發或者必要的bug查錯等等在伺服器上改程式碼之後,絕對不能提交測試/生產伺服器的程式碼,要把改動的程式碼拿回本地,在本地提交,推送遠端倉庫。

撤銷伺服器上的修改,一條命令還原

git checkout -- .
#還原所有
git checkout path/filename
#還原單個檔案
複製程式碼

原則上只能對測試的伺服器的程式碼進行修改,不能直接修改生產伺服器程式碼。

禁用git push -f 強制覆蓋遠端

少用git reset --hard進行回滾

首先,我們儘量依賴branch或者tag去迴歸之前的版本,而不是commitid。

如果確實需要版本回滾,建議首先切出一個與現分支(master或功能分支)的測試分支出來,對這個分支進行reset或者各種操作,如果成功就merge回原分支,如果操作後得到的效果和計劃的不一樣,銷燬這一測試分支即可。

根據commitid建立分支,可以用這個命令來還原始碼。

git checkout -b 新分支名稱 commitId
複製程式碼

從標籤建立分支

git checkout -b newbranch v1.0
複製程式碼

每次板本升級通過切分支來完成不同版本程式碼的記錄

當線上出現問題時git checkout回上一個分支來完成程式碼回滾,不會影響新版本,同時清晰保留了每個版本的版本號和程式碼。

git checkout -b v1.2
git pull
#從v1.1版本切出來1.2分支,然後合併v1.2版本的功能程式碼
複製程式碼

儲存功能分支的程式碼

在完成每天的開發任務後,專案組內下班時間前一小時進行程式碼合併,然後推送程式碼到遠端倉庫。

參考

因團隊精簡,不需要過多的分支維護版本的清晰和可維護。但是可以參考正規的workflow,學習學習。

doc.martist.cn/364292

doc.martist.cn/398083

求關注,求喜歡