代碼版本管理的情景。
項目遠程倉庫中有兩個分支:
1】maseter分支作爲發佈分支,只接受要release到客戶手中的代碼,需要保證任何時候都能編譯通過
2】dev分支作爲開發分支,接受所有開發過程中的代碼,需要保證任何時候都可以編譯通過
你自己在本地以dev分支爲base進行開發,測試通過後merge進入master分支。在版本管理的時候你要面對的幾個主要問題:
1】保證自己的本地分支跟遠程分支同步
2】保證自己的commit跟分支整潔
3】合併代碼時候儘量少的衝突
4】自己的代碼合併進遠程倉庫後不會引起問題
下面從倉庫的建立開始,逐步進行介紹:
1】創建倉庫
git clone 遠程倉庫地址
2】切換到開發分支
git checkout dev
git pull # git pull 是定期的操作,需要時長進行,這是減少衝突的保證
3】以開發分支爲base,創建自己的開發分支
git checkout -b myDev
4】在自己的開發分支中進行開發,提交自己的commit
git add -u
git commit -m "commit1"
git add -u
git commit -m "commit2"
git add -u
git commit -m "commit3"
git add -u
git commit -m "commit4"
5】現在碰到一個場景,你的當前task還沒有開發完,但是你的代碼已經有一段時間沒有同遠程dev分支進行同步了,這讓你很忐忑,你可以通過如下操作進行同步
git checkout dev # 切換到本地的dev分支
git pull # dev 分支同遠程dev分支進行同步
git checkout myDev # 切換回自己的分支
git rebase dev # 讓自己的myDev分支同遠程的dev分支進行同步,並保證自己的commit1、commit2、commit3、commit4處於所有commit記錄中的最新位置,這個過程中可能會出現衝突,需要及時解決,如果過這個同步過程進行的比較頻繁(如每隔一兩天進行一次)及時的話,很少會出現衝突,就算有衝突也是很小的衝突很容易解決
6】在myDev分支上繼續開發
git add -u
git commit -m "commit5"
git add -u
git commit -m "commit6"
git add -u
git commit -m "commit7"
git add -u
git commit -m "commit8"
7】經過這8個commit你已經完成了task的開發,完成了各種測試,需要將代碼提交到遠程dev分支中
git checkout dev
git pull
git checkout myDev
git rebase dev # 將本地代碼與遠程代碼進行最後的同步
git rebase -i # 將本地的8個commit進行合併,以簡潔自己的版本管理,具體細節網上有很充足的教程
git push origin myDev:myDev # 將本地的myDev分支推送到遠程倉庫的myDev新分支
# 需要注意的是上面雖然將本地的分支推到了遠程倉庫,但是此時的遠程倉庫myDev分支跟本地的myDev分支之間並沒有跟蹤關係,要創建他們之間的跟蹤關係還需要 git --set-upstream origin myDev:myDev 指令操作
8】在遠程倉庫中創建merge request將代碼合併進dev分支就可以了。
9】你提交的代碼進入了遠程的dev倉庫之後,經過別人pull測試合格了,可以release了,後面你開始準備將你的開發代碼合併進入release分支
10】切換到本地的master分支pick對應的代碼
git log --author="你的賬號名字" # 查看你自己的提交記錄,獲取commitID
git checkout master
git pull
git cherry-pick commitID # 前面你已經將commitID進行了合併,而且將commitID移到了最新的位置,所以你這裏的這一步就會少很多麻煩,如果出現衝突解決衝突,不過前面你如果嚴格按照這個流程進行開發,這裏理論上不會出現衝突
11】本地master分支代碼測試通過,提交到遠程自己的新分支
git push origin master:master-自定義遠程新分支後綴
12】遠程倉庫中提交merge request 或者是cherry-pick請求,將自己分支中的代碼合併到master分支中
13】其他人獲取了你在master上的代碼,聯調測試通過,等待代碼release
補充場景:
在6或者4的過程中,你又接收了新的task,這個task可以在你commit3的基礎上繼續進行,分兩種情況:
1】新的task你可以非常快的完成,基本上不會影響你現在的工作進度
git stash # 將現在工作現場進行保護
git checkout commit3ID -b myDevNew # 以commit3ID爲base創建一個新的開發分支
# 完成開發工作,提交代碼
git checkout myDev # 回到原來的開發分支
git stash pop # 恢復原來的工作現場,繼續原來的開發工作
2】新的task是個長期的任務,且優先級比較高,需要停下手頭的task,首先完成新的task
git add -u
git commit -m "保存工作現場"
git checkout commit3ID -b myDevNew # 創建新的開發分支
# 完成新task的開發工作,提交代碼,流程如上面所本文所講
git checkout myDev # 切換回原來的開發分支,繼續原task的開發