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

好吧,我认为这是一个简单的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完美的?


这个功能分支不与任何其他开发者共享,所以我事实上没有问题,推力,我不会丢失任何数据,问题更具概念性。


拉莫斯之舞
浏览 1155回答 3
3回答

千巷猫影

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

GCT1015

对此的一个解决方案是执行msysGit的rebasing合并脚本所做的事情- 在rebase之后,在旧的head中feature合并-s ours。你最终得到了提交图:A--B--C------F--G (master)       \         \        \         D'--E' (feature)         \           /          \       --           \    /            D--E (old-feature)...而你的推动feature将是一个快速前进。换句话说,你可以这样做:git checkout featuregit branch old-featuregit rebase mastergit merge -s ours old-featuregit push origin feature(未经测试,但我认为这是正确的......)

凤凰求蛊

问题是git push假设远程分支可以快速转发到本地分支,即本地和远程分支之间的所有区别在本地有一些新的提交,如下所示:Z--X--R&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<- origin/some-branch (can be fast-forwarded to Y commit)&nbsp; &nbsp; &nbsp; &nbsp;\&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; T--Y&nbsp; &nbsp; <- some-branch执行git rebase提交时,D和E将应用于新基础,并创建新的提交。这意味着在rebase之后你会有类似的东西:A--B--C------F--G--D'--E'&nbsp; &nbsp;<- feature-branch&nbsp; &nbsp; &nbsp; &nbsp;\&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; D--E&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <- origin/feature-branch在那种情况下,远程分支无法快速转发到本地。虽然,理论上本地分支可以合并到远程(显然你在这种情况下你不需要它),但是git push只执行快进合并它会引发错误。什么--force选项只是忽略远程分支的状态并将其设置为您正在推送它的提交。所以git push --force origin feature-branch简单地origin/feature-branch用本地覆盖feature-branch。在我看来,master只要您是唯一一个在该分支上工作的人,就可以将功能分支和强制推送回远程存储库。
打开App,查看更多内容
随时随地看视频慕课网APP