程式碼管理的 Git:應對百變的需求
需求變更主要涉及到時間安排的變化,上線內容的變化,版本回退等。
分支
git 可以使用多個分支同時進行開發。一般情況,在開發團隊中會有開發版本分支(dev),釋出版本分支(release)。再日常專案中,我一般還會新增一個預釋出分支(pre-release)。作為預釋出程式碼的測試。
開發分支用於做日常開發。釋出分支用於釋出線上程式碼,預釋出分支用於預釋出測試。正常開發流程,在開發分支完成測試環境測試之後,會合併到預釋出分支上,在預釋出環境進行測試。預釋出環境測試完之後,再合併到釋出分支上。
如果在新版本開發的過程中,線上程式碼有個bug需要修復,可以從預釋出分支上檢出一份程式碼,修復bug之後再合併到預釋出分支上,在預釋出環境測試。測試沒問題再發布到線上分支。
整個過程流程圖如下:
以下是實際開發的一個截圖
分支相關命令如下:
## 建立新分支 git branch newbranchname ## 切換到新分支 git checkout newbranchname ## 建立並切換到新分支 git branch -b newbranchname ## 將新分支推送到遠端伺服器(先進入到分支中) git push --set-upstream origin newbranchname ## 刪除分支(本地分支) git branch newbranchname ## 強制刪除(本地分支) git branch -D newbranchname ## 刪除遠端分支(不會刪除本地分支) git push origin --delete newbranchname ## 檢視本地分支 git branch ## 檢視所有分支(會把遠端分支列出來) git barnch -a ## 檢視本地分支與遠端分支關聯關係 git branch -vv
分支解決了開發環境,測試環境,預釋出環境程式碼問題。有了分支之後,開發人員可以在不同的情況下切換到不同分支進行開發。
合併指定內容
一般的版本開發都需要一個週期。但是有的時候,前期評估週期是一個月,但是在剛開發到半個月的時候就在想能否部分功能先上線。開發過程提倡的是頻繁提交,因此一些功能散落在多次提交當中,並且每次提交都是相對的功能專一。這種情況下,比較適合單獨合併指定commit。
git中cherry-pick就可以實現這個功能。cherry-pick會把commit的變更內容"複製"過來,同時在當前分支生成一個新的commit。commit hash與原來的不再相同。如果沒有衝突,則commit msg 是一樣的。如果有衝突,則需要自己手動解決衝突,編輯提交資訊
## 合併指定的commitid到本分支 git cherry-pick commit-hash ## 合併連續的多個commit git cherry-pick commit-start..commit-end
在測試分支上的version1的提交
在預釋出分支上,使用cherry-pick version1
使用cherry-pick之後,預釋出版本上的內容有了version1的提交。同時建立了一個新的commit。
找回歷史的一個版本
需求變更是常事,經常做了一圈之後發現還是第一個版本好,這個時候想要找到以一個版本的內容。
恢復指定檔案到指定版本。首要任務是先找到指定版本。可以使用git log查詢指定版本。
## 檢視提交記錄 ## (包含提交資訊,時間,提交人) ## 只會顯示當前分支記錄 git log ## 檢視所有分支記錄 git log -g ## 按commit msg 查詢 git log -g --grep="查詢關鍵字" ## 按時間查詢 git log --after="2019-02-27 00:00" --before="2019-02-27 12:00" ## 顯示指定檔案的歷史記錄 ## (會顯示檔案變更內容) git log -p filename ## 按檔案內容變化查詢 git log --all -S "檔案內容關鍵字" filename
使用git log 查詢到需要恢復的commitid。一般情況,由於版本開發過程,檔案之間相互引用,不會直接替換成舊版本,而只是把一部分功能恢復成舊版本。
可以使用checkout將舊版本和當前版本合併。
## checkout 檔案 ## -p引數顯示commit變更內容 ## 然後根據提示合併內容 git checkout commit-id filename -p
也可以使用git show將舊版本輸出到一個檔案,然後手動合併內容
git show commit-id:filename > old_version_savepath
以下是演示截圖
對於線上版本,如果真的不幸,上線之後又bug無法修復,那隻能是進行版本回滾。回滾到上一個釋出版本的commit-id。
## 將版本回退到指定commit git checkout commit-id
以上內容就是在需求變更使用頻繁的命令。主要設計到分支操作,git log的操作,以及checkout 歷史的操作。
開發過程中除了上述命令之外,還有一些其他操作,可以很好的幫助開發人員提高程式碼管理的效率。比如整理commit,使得釋出版本變得乾淨。更換,新增遠端地址,修改提交資訊,放棄提交內容等。避免篇幅過長,放在下一篇文章寫。