【问题标题】:git pull --rebase upstream & git push origin rejects non-fast-forward?git pull --rebase upstream & git push origin 拒绝非快进?
【发布时间】:2012-03-12 02:30:56
【问题描述】:

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

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

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

我在这个 fork 上工作并推送一些提交,在推送我的最后一次提交并创建拉取请求之前,我更新了我的 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

现在,当我尝试推送到我的 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.

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

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

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 时,它充其量会将其他人的提交包含在我的拉取请求中(来自重置的那些),最坏的情况是它会给我带来合并冲突。

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

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

【问题讨论】:

    标签: git rebase


    【解决方案1】:

    当你

    git pull --rebase upstream master
    

    您正在重写您自己的历史记录,因为您将主分支重新基于更新的上游存储库。当你将你的 rebase repo 推送到你的 fork 时,git 会抱怨。你需要用 --force 推动

    git push --force origin master
    

    【讨论】:

      猜你喜欢
      • 2011-05-17
      • 2013-03-14
      • 2017-12-25
      • 1970-01-01
      • 2017-12-07
      • 2018-09-30
      • 2021-02-05
      • 2018-07-05
      • 2012-02-15
      相关资源
      最近更新 更多