前段時間在工作中同事在rebase時遇到一個問題來問我,今天突然想起來覺得有必要記錄一下。
在我們日常工作中,經常使用git座位代碼管理工具,而且一個項目通常由多人開發,我當時所在組的git管理策略是master分支作為主干的無bug分支(測試驗證通過),每個開發在自己的個人分支上進行開發,當開發完畢時rebase master分支,然后進行提測,測試通過后,再發起merge request合並到maste分支,這樣就可以保證master分支一直是無bug分支,而且其他分支可以放心的進行rebase操作。
接下來才是重點。。
而在這過程中就遇到了如下問題,舉一個簡單的例子說明如下: 最開始分支只有一個master上面有A<--B<--C三個分支,在C提交上開出了一個新的feature分支 並在其上進行了開發,而在feature分支進行開發並commit兩次后,master分支也發生了變化,當前git倉庫如下圖所示:
A<--B<--C<-------F<--G (master)
D<--E (feature)
此時如果你在master分支上,可以直接進行 git push origin master 操作更新master分支;如果你在feature分支上,可以直接進行 git push origin feature 操作更新feature分支
但是接下來,按照前文所說的的工作場景,你現在完成開發,需要在feature分支上rebase master分支之后進行提測,所以你在本地的feature分支上執行了 git rebase msater 命令,於是你現在本地的分支結構變成了下圖所示的樣子:
A<–B<–C<–F<–G (master)
D’<–E’(feature)
但是由於進行了rebase操作,現在遠端和本地的feature分支的狀況是這樣的:
A<–B<–C<—F<–G<–D’<–E’ (本地feature分支)
D<–E (遠端feature分支)
解決辦法
- feature分支只有你一個人在開發
此時沒有其他人會進行提交操作,那么可以直接進行強制推送 git push --force origin feature ,–force可以直接理解為用你本地分支的狀態區覆蓋掉遠端origin分支的狀態,也就是執行過后,本地的分支什么樣,遠端分支就什么樣
- feature分支有多人開發
此時如果你貿然的使用–force命令,會有覆蓋掉其他人提交代碼的風險。比如,小明和小紅兩個人同時在feature分支上進行開發,小明已經在feature分支上提交了一部分代碼,而小紅此時執行了rebase操作,所以如果想要推送到遠端倉庫就必須使用 - -force 參數,而小紅推送成功之后就會覆蓋掉小明提交的代碼(前面說過–force就是用本地狀態覆蓋掉遠端狀態)。在這種情況下,推薦另外一種更安全的命令 git push --force-with-lease origin feature 使用該命令在強制覆蓋前會進行一次檢查如果其他人在該分支上有提交會有一個警告,此時可以避免福改代碼的風險。