为了账号安全,请及时绑定邮箱和手机立即绑定

功能分支rebase后Git推送被拒绝

功能分支rebase后Git推送被拒绝

Git
拉莫斯之舞 2019-09-06 17:22:08
好吧,我认为这是一个简单的git场景,我错过了什么?我有一个master分支和一个feature分支。我做了一些工作master,一些工作,feature然后再做一些工作master。我最终得到这样的东西(词典顺序暗示了提交的顺序):A--B--C------F--G  (master)       \            D--E  (feature)我没有问题要git push origin master保持远程master更新,也没有git push origin feature(当打开时feature)为我的feature工作维护远程备份。到目前为止,我们很好。但是现在我想在主人feature的F--G提交之上重新定义,所以我git checkout feature和git rebase master。还好。现在我们有:A--B--C------F--G  (master)                 \                  D'--E'  (feature)问题:当我想要备份新的rebased feature分支时git push origin feature,推送被拒绝,因为树由于变基而发生了变化。这只能通过解决git push --force origin feature。我讨厌使用--force而不确定我是否需要它。那么,我需要它吗?重新定位是否必然意味着下一个push应该是--force完美的?这个功能分支不与任何其他开发者共享,所以我事实上没有问题,推力,我不会丢失任何数据,问题更具概念性。
查看完整描述

3 回答

?
千巷猫影

TA贡献1829条经验 获得超7个赞

而不是使用-f或--force开发人员应该使用


--force-with-lease

为什么?因为它检查远程分支的更改,这绝对是个好主意。让我们想象一下,詹姆斯和丽莎正在研究同一个功能分支,丽莎已经推动了提交。詹姆斯现在重新调整他的当地分支,并在试图推动时被拒绝。当然,詹姆斯认为这是因为改变并使用--force并且会改写所有Lisa的变化。如果詹姆斯曾经使用过--force-with-lease,那么他会收到一个警告,告知其他人已做过提交。我不明白为什么有人会在推销一个rebase之后使用--force而不是--force-with-lease。


查看完整回答
反对 回复 2019-09-06
?
GCT1015

TA贡献1827条经验 获得超4个赞

对此的一个解决方案是执行msysGit的rebasing合并脚本所做的事情- 在rebase之后,在旧的head中feature合并-s ours。你最终得到了提交图:


A--B--C------F--G (master)

       \         \

        \         D'--E' (feature)

         \           /

          \       --

           \    /

            D--E (old-feature)

...而你的推动feature将是一个快速前进。


换句话说,你可以这样做:


git checkout feature

git branch old-feature

git rebase master

git merge -s ours old-feature

git push origin feature

(未经测试,但我认为这是正确的......)


查看完整回答
反对 回复 2019-09-06
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

问题是git push假设远程分支可以快速转发到本地分支,即本地和远程分支之间的所有区别在本地有一些新的提交,如下所示:


Z--X--R         <- origin/some-branch (can be fast-forwarded to Y commit)

       \        

        T--Y    <- some-branch

执行git rebase提交时,D和E将应用于新基础,并创建新的提交。这意味着在rebase之后你会有类似的东西:


A--B--C------F--G--D'--E'   <- feature-branch

       \  

        D--E                <- origin/feature-branch

在那种情况下,远程分支无法快速转发到本地。虽然,理论上本地分支可以合并到远程(显然你在这种情况下你不需要它),但是git push只执行快进合并它会引发错误。


什么--force选项只是忽略远程分支的状态并将其设置为您正在推送它的提交。所以git push --force origin feature-branch简单地origin/feature-branch用本地覆盖feature-branch。


在我看来,master只要您是唯一一个在该分支上工作的人,就可以将功能分支和强制推送回远程存储库。


查看完整回答
反对 回复 2019-09-06
  • 3 回答
  • 0 关注
  • 1150 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信