9

Github 上的某个用户有一个带有单个主分支的存储库。我已经将该存储库分叉到我自己的帐户中。我在自己的分叉存储库上创建了一个新分支,并对其进行了一些更改。

上游用户已将更改提交给他们的主人。我希望用这些更改来更新我的主人。此外,如果我理解rebase正确,我想rebase在那个 master 上建立我的分支。我不想与 master 合并,因为我还没有完成我的分支的开发。注意:上游修改的文件与我在分支修改的文件不同,所以不应该有冲突。

我尝试了以下方法:

我将上游用户的更改提取到我的本地存储库中:
git pull upstream master

我将本地 master 的更改送到我的分叉 master 中:
git push origin master

我将本地分支重新建立在本地主节点上:
git checkout mybranch
git rebase master

我试图将我重新定位的本地分支送到我的分叉分支:
git push origin mybranch

但是,我收到以下错误:

To https://github.com/myusername/myforkedrepository.git
 ! [rejected]        mybranch -> mybranch (non-fast-forward)
error: failed to push some refs to 'https://github.com/myusername/myforkedrepository.git'
hint: Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull')
hint: before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.

请注意,这origin是我的分叉存储库,并且upstream是原始存储库。

stackoverflow 上有一个类似的问题,它提出了一个稍微简单的方法:

git fetch upstream
git rebase upstream/master

这没有给出任何错误,但它也没有向我的远程分叉推送任何内容。在尝试了上述之后,我再次尝试了

git push origin mybranch

但同样的错误仍然存​​在。

我将如何去做我想做的事?

4

2 回答 2

2

这就是我理解您的情况的方式:

[上游回购] ==> [分叉回购] <==> [本地回购]
   大师大师大师
                                          我的分支

箭头表示提交的方向流。

鉴于上述情况,您已经问过如何实现您想要的开发流程,以使您的更改始终处于领先地位。

总的来说,如果要合并mybranch主题分支上的更改,分叉和本地 repos 上的master不可避免地会偏离上游 master 。

但是,当更改完全不相交时,正如您在问题中概述的那样,当您合并或拉动时,您确实可以通过变基和快进将您的更改集保持在顶部。

    0] 本地主 $分支 mybranch 关闭主 
    1] 叉主 $ git pull --rebase
    2] 本地主 $ git pull --rebase
    3] local mybranch $ commit commit 提交
    4] 本地分支 $ git rebase master

在您的开发流程中根据需要重复 1-4 或仅 3-4 次。当您准备好将您的工作发布到分叉的 repo master时,上游 master分叉的 master将不同步,但只要您遵循 1-4,您应该能够永远保持您的更改在顶部。

    5] 本地主 $ git merge --ff-only mybranch
    6] 本地主 $ git push origin

然后根据需要再重复 1-4 次。

一个警告。为了使其正常工作,您可能需要将您的分支(或者可能重新克隆您的存储库)重置为“干净”状态,在这种状态下您尚未合并和/或将mybranch上的任何更改推送到本地或分叉大师

于 2014-01-21T12:21:41.210 回答
0

这是因为您mybranch在此之前已经发布了您的分支。

解决方案很简单:不要。您想更改已发布的历史记录,这绝不是一个好主意!mybranch对于已经在您的公共分支上工作的其他开发人员来说,这可能会导致非常丑陋的错误。


一个技术解决方案是:git push --force origin mybranch或删除远程分支并使用git push origin :mybranchand再次推送它git push origin mybranch

mybranch但是,如果已经发布,您不应该这样做。

于 2014-01-18T21:48:05.567 回答