【问题标题】:Git rebase shows non-fast-forwardGit rebase 显示非快进
【发布时间】:2016-10-20 12:55:01
【问题描述】:

我深埋在一个 git 中。

我是如何到达那里的:

我不是 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

不是每个人都有写入权限将更改合并到主分支。对远程仓库有写权限的人告诉我有冲突,做一个 rebase 并再次提交。所以今天我按照确切的顺序运行了以下命令。

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.

所以我听从了同胞的建议

  1. https://stackoverflow.com/a/20467414/1431184
  2. https://stackoverflow.com/a/6897674/1431184

但问题仍然存在。

标签:

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

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

git rebase master

这让我回到了LABEL。这会一直持续下去。

请注意,如果我不使用 master 重新设置它的基础,我的 push 命令可以工作,但是远程 git 的所有者在尝试将我的分支 (redactor_changes) 合并到 master 时仍然会看到冲突。

【问题讨论】:

  • 我看到的一个问题是您在执行git rebase master 之后之后立即执行了git merge master。你为什么这样做?
  • 我的意图是与 master 合并更改以使我的分支保持最新,然后运行 ​​rebase 以将分支定位到 master。您认为这可能导致所有这些问题?

标签: git git-merge rebase git-push


【解决方案1】:

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

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

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

git checkout redactor_changes
git rebase master

你会得到下图

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

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

git push origin redactor_changes

会给你你一直看到的错误信息

! [拒绝] redactor_changes -> redactor_changes(非快进) 错误:未能将一些参考推送到“https://git..com/web/oblog.git”
提示:更新被拒绝,因为您当前分支的尖端落后 提示:它的远程对应物...

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

解决方案:

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

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

执行此操作,错误消息应该会消失。这假定 redactor_changes 是个人分支,并且您没有与任何人共享它。

我还注意到您的工作流程存在其他一些问题,例如在已经变基之后将master 合并到redactor_changes 中。但是进行强制推送至少应该会改善您的情况。

【讨论】:

  • 我提交的更改旨在与 master 合并,因为它们应该进入生产。运行上面的命令是否会导致 git 将我的分支视为个人分支,当远程 git 的所有者尝试将其与主分支合并时仍然会抛出错误?或者,是否有可能(或为时已晚)删除我的分支上的所有内容,即恢复所有更改以使我的分支与远程仓库完全匹配?我可以手动保存所有文件并稍后传输更改,因为更改集并不大。
  • 我认为您不了解 Git 工作流程,因为您的评论对我来说没有意义。
  • 如果您没有权限进行强制推送,那么您可能不应该使用变基工作流程。
  • @printfmyname,对您的后续问题都说不。首先,尝试合并您的更改的协作者将获得简单的快进合并。其次,现在删除所有内容并重新开始还为时不晚,但这也将是一个您可能无法逃脱的漩涡。
  • @Jaff 我刚刚做到了。一切似乎都很好。对于那些有同样问题的人,我删除了远程分支并做了一个 git pull。然后,一旦我将 redactor_changes 重新设置为 master(我也必须解决冲突),我执行了 git push origin redactor_changes。感谢蒂姆提供解决方案和视觉效果。我有点担心执行带有 --force 标签的命令,即使它可以把我拉到更安全的地方。
猜你喜欢
  • 1970-01-01
  • 2010-10-08
  • 1970-01-01
  • 2012-02-15
  • 2017-11-04
  • 2011-03-15
  • 2015-07-22
  • 2019-06-23
相关资源
最近更新 更多