Git強制覆蓋master分支

在開發中,一般會保持兩個分支master分支和develop分支,可是若是由於develop上面迭代太多而沒有及時維護master,最後想丟棄master而直接將測試確認過的develop強推到master,該怎麼操做呢?javascript

網上搜了一下,可是真正本身使用起來卻又暴露出各類問題。所以,作以下總結分享,但願對遇到一樣問題的人用幫助。java

  • 場景一:master下有a.txt文件,develop下有a.txt(和master保持一致),b.txt文件(追加文件),c/c.txt文件(追加文件夾和文件)。
  • 場景二:master下有a.txt文件,develop下有a.txt(追加本身內容),b.txt文件(追加文件),c/c.txt文件(追加文件夾和文件)。
  • 場景三:master下有a.txt文件(追加本身內容),develop下有a.txt(追加本身內容),b.txt文件(追加文件),c/c.txt文件(追加文件夾和文件)。其中master的a.txt和develop的a.txt不存在競合。
  • 場景四:master下有a.txt文件(追加本身內容),develop下有a.txt(追加本身內容),b.txt文件(追加文件),c/c.txt文件(追加文件夾和文件)。其中master的a.txt和develop的a.txt存在競合。

網上查找了一個操做步驟,以下:git

  1. 切換到develop分支下,並保證本地已經同步了遠端develop的最新代碼
    git checkout develop
    git pull
  2. 把本地的develop分支強制(-f)推送到遠端master。
    git push origin develop:master -f
  3. 切換到舊分支master。
    git checkout master
  4. 將本地的舊分支master重置成最新的develop分支。
    git reset --hard develop
  5. 再推送到遠端倉庫。
    git push origin master --force

    或使用下面的命令,將當前分支推送到遠程的同名分支。測試

    git push origin HEAD
    

      

針對上面的步驟,若是你使用的sourcetree管理的GitHub代碼,恭喜你,你成功中招了,場景一和場景二在沒有修改同一個文件的狀況下,上面的五部曲一點問題沒有。可是,凡是就怕可是。fetch

若是你對同一個文件進行過維護而致使差別,即使不是同一個代碼,都會致使問題產生。分析後發現,問題點主要在步驟4上面,當本地的舊分支master的a.txt文件與最新的遠端分支master的a.txt有衝突,須要你手動去判斷須要merge操做。spa

這在不多的文件與不多的修改點的狀況下,可能你還很好判斷,可是若是文件數量龐大,且修改點因時間久遠忘記了的狀況下,可能我就只能說呵呵了。這也就沒有達到標題所說的強制合併的效果。code

 

在知道了上面問題的癥結後,我將上面的步驟作了修正,以下:blog

  1. 切換到develop分支下,並保證本地已經同步了遠端develop的最新代碼。
    git checkout develop
    git pull
  2. 把本地的develop分支強制(-f)推送到遠端master。
    git push origin develop:master -f
  3. 切換到舊分支master。
    git checkout master
  4. 下載遠程倉庫最新內容,不作合併。
    git fetch --all
  5. 把HEAD指向master最新版本。
    git reset --hard origin/master
    

      

再執行上面的場景三和場景四,順利執行完,切換到sourcetree上面,也不會再提示有競合須要手動merge的操做,也沒有須要你push和pull的東西,完美。ip

 

分析上面的操做,雖然核心操做是步驟2,由於通過步驟2,遠端的master已經被你用develop強制替換了,目的是達到了,你徹底能夠在本地另起一個路徑再clone一份master進行管理。開發

可是,在通過了改良後的操做後,你徹底能夠不丟棄已經使用很習慣了的路徑,何樂而不爲呢。

再說改良後的修正點核心思想:就是獲取遠端的GitHub文件信息,而不作合併,而後直接丟棄本地舊的代碼,直接獲取遠端分支的代碼覆蓋到本地,OK,問題解決,但願對你們有用。

相關文章
相關標籤/搜索