Git rebase 显示非快进

标签 git git-merge rebase git-push

我深埋在 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

不是每个人都有写入权限将更改 merge 到master分支。对远程 repo 有写权限的人告诉我有冲突,做一个 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.

所以我听从了 SO 同事的建议

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

但问题依然存在。

标签:

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

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

git rebase master

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

请注意,如果我不将它与 master rebase ,我的推送命令会起作用,但是远程 git 的所有者在尝试将我的分支 (redactor_changes) merge 到 master 时仍然会看到冲突。

最佳答案

每次将 redactor_changes 分支 rebase 到 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'

Rebase 成功地引入了来自 master 的新提交,但它是通过重写 redactor_changes 分支的历史实现的。这是一件好事(可能),因为这意味着审阅者可以快进 master 分支进行您的更改(无 merge 提交)。但它确实有一个副作用。您不能再将 redactor_changes 推送到远程。尝试以下命令

git push origin redactor_changes

会给你你看到的错误信息

! [rejected] redactor_changes -> redactor_changes (non-fast-forward) error: failed to push some refs to 'https://git..com/web/oblog.git'
hint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart...

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

解决方案:

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

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

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

我还注意到您的工作流程存在其他一些问题,例如在已经 rebase 之后将 master merge 到 redactor_changes 中。但是用力 push 至少应该能改善你的处境。

关于Git rebase 显示非快进,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37902685/

相关文章:

git - 如何只保留 git rebase 中的头部更改

git - 在分支之间复制单个提交,保留 SHA-1 标签

Git:准备好真正的 merge 提交后,如何创建一个简单的提交?

git - rebase 后手动 merge 的 pull 请求不会在 Github 上显示为已 merge

git - 无法将文件添加到git存储库

Git卡在状态/添加/提交

git - 以下 Git 提交策略正确吗?

git 更改分支的起源(rebase)

Git:在一个命令中将一系列提交复制到其他提交,不涉及分支

python - 如何使用 GitPython 获取暂存文件?