Git rebase显示非快进

时间:2016-06-18 23:58:37

标签: git git-merge rebase git-push

我被埋在一个混蛋中。

我是如何到达那里的:

我不是git专家。如果我没有任何细节,请问我澄清一下。 几天前我运行了以下命令将我的更改推送到远程分支。

% git checkout master
% git pull
% git checkout redactor_changes <-- this is the branch that I made my changes 
% git commit -m "changes" # I added my changes previously
% git rebase master
% git push origin redactor_changes # pushed changes to remote branch

并非每个人都具有将更改合并到主分支的写入权限。拥有远程回购的写入权限的人告诉我存在冲突并进行改变并再次提交。所以今天我按照确切的顺序运行了以下命令。

vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git add oblog/static/css/styles-custom.css
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git add oblog/static/js/redactor.upload_image.js
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git add oblog/static/images/loading.gif
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git commit -m "Throw a toast when user upload an non-image file with image extension"
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git branch
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git checkout master
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git pull
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git checkout redactor_changes
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git rebase master
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git merge master
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git branch
vagrant@vagrant-ubuntu-trusty-64:~/oblog$ git push origin redactor_changes

看起来这套命令把我吸进了一个我无法逃脱的漩涡。

症状:

上述代码的最后一行会抛出以下错误

! [rejected]        redactor_changes -> redactor_changes (non-fast-forward)
error: failed to push some refs to 'https://git.<domain>.com/web/oblog.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Integrate the remote changes (e.g.
hint: 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

所以我按照SO的建议

  1. https://stackoverflow.com/a/20467414/1431184
  2. https://stackoverflow.com/a/6897674/1431184
  3. 但问题仍然存在。

    LABLE:

    当我使用master(本地)重新绑定我的分支时,它会引发一些冲突,然后我手动修复并执行rebase - continue。 Rebase成功了。然后我再次将我的分支推到原点,它向我显示了同样的错误,! [拒绝]。

    正如git和SO所建议的,我继续将我的远程分支上的更改拉到我的本地分支(redactor_changes)。然后执行

    git rebase master
    

    让我重新回到 LABEL 。这一直在继续。

    请注意,如果我没有使用master对其进行rebase,那么我的push命令会起作用,但是当他尝试将我的分支(redactor_changes)合并到master上时,远程git的所有者仍然会看到冲突。

1 个答案:

答案 0 :(得分:5)

每次在redactor_changes上重新设置master分支时,您都会将后一个分支的最新更改带到前一个分支。通过图表解释:

master:           A -- B -- D
redactor_changes: A -- B -- C

这个简单的图表假设您在master提交时分支B。从那时起,您已对redactor_changesC)进行了一次提交,而其他人已对master分支(D)进行了提交。现在,如果您运行以下命令

git checkout redactor_changes
git rebase master

您最终会得到以下图表

master:           A -- B -- D
redactor_changes: A -- B -- D -- C'

Rebasing成功引入了来自master的新提交,但它是通过重写 redactor_changes分支的历史记录来实现的。这是一件好事(可能),因为这意味着审阅者可以快进 master分支与您的更改(没有合并提交)。但它确实有一个副作用。您无法再将redactor_changes推送到遥控器。尝试以下命令

git push origin redactor_changes

将为您提供您所看到的错误消息

  

! [已拒绝] redactor_changes - &gt; redactor_changes(非快进)   错误:未能将某些参考文献推送到&#39; https://git .. com / web / oblog.git&#39;
  提示:更新被拒绝,因为您当前分支的提示落后   提示:它的远程对应物......

因为你重写了redactor_changes Git的历史,不再知道如何在远程分支上播放提交。

<强>解决方案:

您最想要的解决方案是强制您的redactor_changes分支到遥控器:

git checkout redactor_changes
git rebase master
git push --force redactor_changes

执行此操作,错误消息应该消失。这假设redactor_changes是个人分支,您不会与任何人分享。

我还注意到您的工作流程存在其他一些问题,例如:在已经重新定位后将master合并到redactor_changes。但是,推动力量至少可以推进你的状况。