Git rebase显示非快进

pri*_*ame 2 git rebase git-merge 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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

症状:

上面代码的最后一行引发了以下错误

! [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.
Run Code Online (Sandbox Code Playgroud)

所以我听了SO的建议

  1. /sf/answers/1432719011/
  2. /sf/answers/482837211/

但问题仍然存在.

图标:

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

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

git rebase master
Run Code Online (Sandbox Code Playgroud)

这让我回到了标签上.这一直在继续.

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

Tim*_*sen 5

每次重新启动redactor_changes分支时master,都会将后一个分支的最新更改带到前一个分支.通过图解说明:

master:           A -- B -- D
redactor_changes: A -- B -- C
Run Code Online (Sandbox Code Playgroud)

这个简单的图表假设您masterB提交时分支.从那时起,您已经向redactor_changes(C)提交了一个提交,而其他人已经提交了masterbranch(D).现在,如果您运行以下命令

git checkout redactor_changes
git rebase master
Run Code Online (Sandbox Code Playgroud)

你将得到下面的图表

master:           A -- B -- D
redactor_changes: A -- B -- D -- C'
Run Code Online (Sandbox Code Playgroud)

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

git push origin redactor_changes
Run Code Online (Sandbox Code Playgroud)

会给你你看到的错误信息

![rejected] redactor_changes - > redactor_changes(非快进)错误:无法将某些引用推送到' https:// git ..com/web/oblog.git'
提示:由于当前分支的提示,更新被拒绝落后的暗示:它的远程对手......

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

解:

您最想要的解决方案是强制您的redactor_changes分支到远程:

git checkout redactor_changes
git rebase master
git push --force redactor_changes
Run Code Online (Sandbox Code Playgroud)

这样做,错误消息应该消失.这假定这redactor_changes是一个个人分支,您不会与任何人分享.

我也注意到一些其他的问题,您的工作流程,如合并masterredactor_changes后已重订.但是,推动力量至少应该推进你的状况.