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,问题解决,但愿对你们有用。

相关文章
相关标签/搜索