git pull --rebase upstream& git push origin拒绝非快进?

时间:2012-03-12 02:30:56

标签: git rebase

我已经为github上的公司项目实现了经典的OSS维护者/贡献者git工作流程,但是一个边缘案例会产生一些奇怪的结果,我不知道如何解决这个问题。

让我们说有一个典型的项目,我分叉并添加上游远程以保持最新。

git clone git@github.com:kozhevnikov/<project>.git
git remote add upstream git@github.com:<company>/<project>.git

出于本示例的目的,这个fork后面有几个提交。

git reset --hard HEAD~5 && git push --force

我在这个fork上工作并推送一些提交,然后再推送我的最后一次提交并创建一个pull请求我更新我的fork的克隆以确保没有冲突。

touch foo && git add foo && git commit -m foo && git push
touch bar && git add bar && git commit -m bar

git pull --rebase upstream master

From github.com:<company>/<project>
 * branch            master     -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: foo
Applying: bar

现在,当我试图推到我的叉子时,我被拒绝了。

git push

To git@github.com:kozhevnikov/<project>.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@github.com:kozhevnikov/<project>.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing again.  See the
'Note about fast-forwards' section of 'git push --help' for details.

接下来我该怎么办?我想要的只是拉请求包含foo和bar提交,但是......

当我pull时,pull请求包含重复的foo提交以及额外的合并提交。

git pull
Merge made by the 'recursive' strategy.

git push

在github上拉请求看起来像这样。

Showing 4 unique commits by 1 author.
12345  
kozhevnikov  foo    4 minutes ago
67890  
kozhevnikov  foo    4 minutes ago
abcde  
kozhevnikov  bar    2 minutes ago
fghij  
kozhevnikov  Merge branch 'master' of github.com:kozhevnikov/<project>    just now

当我git pull --rebase而不是pull时,最好将其他人的提交包含在我的拉取请求中(来自重置),最糟糕的是它会给我合并冲突。

当我git push --force没有任何pull--rebase它完美无缺时,我会非常不安地说每个人都使用武力或者让它成为标准工作流程的一部分想象一下,很少有人或一个小团队在一个岔路口合作,并用强迫推动踩到对方的脚趾。

有什么想法吗?我错过了什么?

1 个答案:

答案 0 :(得分:16)

当你

git pull --rebase upstream master

您正在重写自己的历史记录,因为您在更新的上游存储库上重新设置了主分支。当你把你的rebased repo推到你的fork git抱怨时。你需要推动--force

git push --force origin master