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

9
我已经在 Github 上为公司项目实施了经典的 OSS 维护者 / 贡献者 git 工作流,然而有一个边缘情况会产生一些奇怪的结果,我不确定如何解决。
假设有一个典型的项目,我 fork 了它并添加了 upstream 远程仓库以保持最新状态。
git clone git@github.com:kozhevnikov/<project>.git
git remote add upstream git@github.com:<company>/<project>.git

为了举例说明,这个分支落后了几次提交。

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

我在这个分支上工作并推送了一些提交,在推送我的最后一次提交和创建拉取请求之前,我更新了我的分支的克隆,以确保没有冲突。

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操作时,拉取请求中包含了重复的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

当我使用pull命令时,如果我改为使用git pull --rebase,最好的情况是它会将其他人的提交(来自重置)包含在我的拉取请求中,最坏的情况是它会导致合并冲突。
当我使用git push --force命令而没有使用pull--rebase时,它可以完美地工作。但是,我不确定是否应该告诉每个人都使用强制推送或将其作为标准工作流程的一部分,因为我可以想象几个人或一个小子团队正在共同协作一个单一的派生仓库并可能会发生强制推送的冲突。
有什么想法吗?我漏掉了什么吗?
1个回答

18

当你

git pull --rebase upstream master

您正在重写自己的历史记录,因为您正在将主分支与更新后的上游存储库进行变基。当您将重新基于的存储库推送到您的派生分支时,Git会发出警告。您需要使用--force选项进行推送。

git push --force origin master

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接