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

标签 git rebase

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

假设有一个典型的项目,我 fork 并添加了上游远程以使其保持最新。

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

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

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

现在,当我试图 push 我的 fork 时,我被拒绝了。

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.

接下来我该做什么?我只想让 pull 请求包含 foo 和 bar 提交,但是......

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

git pull
Merge made by the 'recursive' strategy.

git push

在 github 上 pull request 看起来像这样。

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 时,最好的情况是它会将其他人的提交包含到我的 pull 请求中(那些来自重置的),最坏的情况是它给了我 merge 冲突。

当我 git push --force 没有任何 pull--rebase 时它工作得很好,但是我很不安地说每个人都使用力或使其成为标准工作流程的一部分,因为我可以想象很少有人或一个小的子团队在一个 fork 上进行协作并在强制 push 时踩到彼此的脚趾。

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

最佳答案

当你

git pull --rebase upstream master

你正在重写你自己的历史,因为你正在更新的上游存储库上重新设置你的 master 分支。当你将你的 rebased repo 推送到你的 fork 时,git 会提示。你需要用 --force 来 push

git push --force origin master

关于git pull --rebase upstream & git push origin 拒绝非快进?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9661059/

相关文章:

version-control - Mercurial 功能工作 - 保持定制工作干净的最佳实践?

已恢复的精选提交的 Git rebase 可以将其设置为 "lose"

git - 移动 git commit 到新分支

git - grgit: check out 远程分支

Git rebase --continue 不打开编辑器

git - 是否可以阻止 git pull/fetches?

git - 如果您处于集中式模型并且从不强制执行, git pull --rebase 是否安全?

git cherry-pick 说 "...38c74d is a merge but no -m option was given"

xcode - Git Push 是通过终端工作的,但不是通过 Xcode 工作的

windows - Git : remove totally nonexistent file from. ..好吧......来 self 不知道在哪里