Git将我的分叉分支在上游主服务器上

时间:2014-01-18 21:04:37

标签: git github push rebase git-fork

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

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

我尝试了以下内容:

从上游用户更改为我的本地仓库:
git pull upstream 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

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

我将如何做我想做的事?

2 个答案:

答案 0 :(得分:2)

这就是我理解你的情景的方式:

[upstream repo] ==> [forked repo] <==> [local repo]
   master               master            master
                                          mybranch

箭头表示提交的方向流。

考虑到上述情况,您已经问过如何实现所需的开发流程,让您的更改始终保持最佳状态。

总体而言,分叉和本地存储库上的不可避免地偏离上游主服务器,如果它们是要在中包含更改> mybranch 主题分支。

然而,当您在问题中勾勒出更改完全不相交时,您可以确实在合并或拉动时通过重新定位和快进来保持您的更改集。

    0] local master   $ branch mybranch off master 
    1] fork  master   $ git pull --rebase
    2] local master   $ git pull --rebase
    3] local mybranch $ commit commit commit
    4] local mybranch $ git rebase master

在开发流程中根据需要重复1-4或3-4次。当您准备将工作发布到 forked repo master 时,上游主服务器分叉主服务器将不同步,但是只要你遵循1-4,你应该能够永远保持你的变化。

    5] local master $ git merge --ff-only mybranch
    6] local master $ git push origin

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

谨慎一点。为了实现这一点,您可能需要将分支(或者可能重新克隆您的存储库)重置为“干净”状态,此时您还没有合并和/或推送 mybranch <上的任何更改< / em>到本地或分叉

答案 1 :(得分:0)

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

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


技术解决方案是:git push --force origin mybranch或删除远程分支并使用git push origin :mybranchgit push origin mybranch

再次推送它

但如果已发布mybranch,则不应该这样做。