前段时间在工作中同事在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分支推送到远端,此时执行 git push origin feature 会报错。这是因为git的push操作默认是假设远端的分支和你本地的分支可以进行fast-forward操作,换句话说就是这个push命令假设你的本地分支和远端分支的唯一区别是你本地有几个新的commit,而远端没有,比如下图这种情况:

1<–2<–3 (远端)\4<–5  (本地)

但是由于进行了rebase操作,现在远端和本地的 feature分支 的状况是这样的:

A<–B<–C<—F<–G<–D’<–E’  (本地feature分支)\D<–E  (远端feature分支)

这种情况下是不能进行fast-forwad模式的合并操作的,所以当执行 git push origin feature 命令时会报一个错误。

解决办法

1、feature分支只有你一个人在开发

此时没有其他人会进行提交操作,那么可以直接进行强制推送 git push --force origin feature ,–force可以直接理解为用你本地分支的状态区覆盖掉远端origin分支的状态,也就是执行过后,本地的分支什么样,远端分支就什么样

2、feature分支有多人开发

此时如果你贸然的使用–force命令,会有覆盖掉其他人提交代码的风险。比如,小明和小红两个人同时在feature分支上进行开发,小明已经在feature分支上提交了一部分代码,而小红此时执行了rebase操作,所以如果想要推送到远端仓库就必须使用 - -force 参数,而小红推送成功之后就会覆盖掉小明提交的代码(前面说过–force就是用本地状态覆盖掉远端状态)。在这种情况下,推荐另外一种更安全的命令  git push --force-with-lease origin feature  使用该命令在强制覆盖前会进行一次检查如果其他人在该分支上有提交会有一个警告,此时可以避免福改代码的风险。

总结:不管当前分支是否只有自己在使用,在rebase之后,需要强制推送到远端分支时,使用  git push --force-with-lease origin feature  参数来保证分支安全。

git rebase后无法push远程分支的问题解决相关推荐

  1. git rebase 后找回消失的commit

    git rebase 后找回消失的commit 在git rebase操作时,存在冲突时,使用git rebase --abort处理后,结果发现commit的修改和记录都没有了.(使用git reb ...

  2. Git笔记(15) 远程分支

    Git笔记(15) 远程分支 1. 远程引用 2. 远程跟踪分支 2.1. 本地的 master 2.2. 分叉本地与远程的工作 2.3. 同步数据 2.4. 多个远程分支 3. 推送 4. 跟踪分支 ...

  3. Git branch -r 无法获取远程分支,ui可以看见分支但是git 命令无法查看解决方案

    Git branch -r 无法获取远程分支,ui可以看见分支但是git 命令无法查看解决方案 参考文章: (1)Git branch -r 无法获取远程分支,ui可以看见分支但是git 命令无法查看 ...

  4. git branch -a无法显示远程分支解决办法

    阅文时长 | 0.2分钟 字数统计 | 330.4字符 主要内容 | 1.引言&背景 2.git fetch拓展 3.声明与参考资料 『git branch -a无法显示远程分支解决办法』 编 ...

  5. Eclipse中的集成Git插件删除线上远程分支

    Eclipse 的忠实党,在使用Git 多人协作以分支的形式开发应用时分支合并到主干后往往再没什么用(我的做法是保留一两周再干掉),在此记录使用Eclipse的Git 插件来删除无用的分支. 操作步骤 ...

  6. git branch --set-upstream 本地关联远程分支

    最近使用git pull的时候多次碰见下面的情况: There is no tracking information for the current branch. Please specify wh ...

  7. git恢复被删除的远程分支

    1.使用reflog,找到最后一次commitid git reflog --date=iso 2.找到目标分支最后一次的commit ID 298dax2 HEAD@{2019-05-13 15:3 ...

  8. git批量删除没用的远程分支

    开发服务器上远程分支狠多,以下是需要删除的分支,命令行如下: git branch -r| grep -v -E 'master|feat/scenic_vr|change/reserve_apply ...

  9. git强行让本地分支覆盖远程分支

    学习笔记,仅供参考 参考自:https://www.imooc.com/wenda/detail/542766 如果远程分支上的提交都不需要了,可以强行让本地分支覆盖远程分支: git push or ...

  10. Git删除不存在对应远程分支的本地分支

    远程分支已经删除,对应的本地分支还存在 # git remote show origin * remote origin Fetch URL: git@github.com:xxx/xxx.git P ...

最新文章

  1. 太骚了!Python模型完美切换SAS,还能这么玩。。
  2. 在腾讯云控制台上对域名进行续费
  3. 从零开始在 Windows 上部署 .NET Core 到 Kubernetes
  4. LeetCode 592. 分数加减运算(字符串+最大公约数)
  5. 《LINUX与UNIX SHELL编程指南》学习笔记
  6. php serialize和json_encode哪个更快_学习PHP的10个技巧
  7. 进程互斥的硬件实现方法
  8. android编译单独image
  9. 力扣-797. 所有可能的路径
  10. 说几个打工人要避开的坑
  11. python中缀表达式_中缀表达式变后缀表达式、后缀表达式(逆波兰)求值(python版本)...
  12. 五笔字根表识别码图_86版五笔字根表及口诀(最新图文版)
  13. php和composer关系_使用Composer管理PHP依赖关系
  14. 20个常用模拟电路(嵌入式硬件篇)
  15. 如何正确的获得一个view的宽和高
  16. 智慧职教云Java题库_智慧职教作业的答案,云课堂智慧职教java职业证书题库答案,职教云智慧职教题库答案...
  17. 实验五:py求函数驻点极大小值凹凸区间拐点
  18. 考研英语 - word-list-44
  19. oracle多次发运,EBS 发运管理操作实例11——延迟交货(Backorder)
  20. AutoCAD如何方便截图放到Word文档,改成白底黑字

热门文章

  1. SpringBoot 修改仓库
  2. 关闭蜂鸣最简单的方法
  3. Re0:DP学习之路 01背包如何打印路径?
  4. codevs3044 线段树+扫描线
  5. POJ1061 青蛙的约会 扩展欧几里得
  6. Mac OS X10.11下CocoaPods的安装过程
  7. Redis配置文件解读
  8. 在windows下把txt文件改为utf8格式
  9. 首个万人远程培训项目顺利启动
  10. k8s Deployment