2

我和我的同事最近实现了 git,并且刚刚尝试实现变基。所以,我们有一个远程master分支,在本地克隆,我有一个本地(和远程)分支,名为changes. 在本地,我们在 上做了一些工作changes,所以它看起来像这样:

master: A
        \
changes: B-C-D

因此,通过来自其他地方的不相关合并,master得到了升级,所以我们有:

master: A-E
        \
changes: B-C-D

所以,我做了一个变基:

git checkout changes
git rebase E (via a tag)

所以,在我的本地仓库中,我有:

master: A-E
           \
changes:    B-C-D

所以,我试图然后做一个推动,但得到:

remote: error: denying non-fast-forward refs/heads/changes (you should pull first)

似乎,传统的智慧是大力推动我的工作changes回到origin/changes

git push -f origin changes

其中回应:

remote: error: denying non-fast-forward refs/heads/changes (you should pull first)
To /opt/git/online.git
 ! [remote rejected] changes -> changes (non-fast-forward)
error: failed to push some refs to '/opt/git/online.git'

所以,我现在有点困惑。我认为工作流程是在对我的 local 进行 rebase 之后changes,我可以origin/changes排队。我误解了这个吗?

4

2 回答 2

1

使用push -f命令请求您的 Git 客户端无论如何都尝试推送 ref,即使它不是当前远程分支的后代。但是,上游存储库仍然可以拒绝该请求。

您可以通过更改上游存储库config文件中的配置选项来允许这样做:

[receive]
        denyNonFastforwards = false

Git book对此选项有以下说法:

receive.denyNonFastForwards
如果你重新设置你已经推送的提交然后尝试再次推送,或者尝试将提交推送到不包含远程分支当前指向的提交的远程分支,你将否认。这通常是好的政策;但在变基的情况下,您可能会确定您知道自己在做什么,并且可以使用-f推送命令的标志强制更新远程分支。

于 2013-09-27T05:03:39.050 回答
1

问题是你的最后一张图并不准确,因为 B、C 和 D 都是新提交,所以它们更像 B'、C' 和 D':

        大师:AE
                |\
       变化:\B′-C′-D′
起源/变化:BCD

从这个新的、正确的图可以看出,changes(D') 不是origin/changes(D) 的孩子。git merge-base origin/changes changes您可以通过查看它是 A来验证这一点,并git merge-base --is-ancestor origin/changes changes返回 1(假)。

于 2013-09-27T04:35:33.170 回答