将我的分支在上游主分支上进行Git rebase

10

某位Github用户在其仓库中只有一个主分支。我将该仓库fork到了我的账户。我在自己的fork仓库上创建了一个新分支,并进行了一些更改。

上游用户已经将更改提交到他们的主分支。我希望使用这些更改更新我的主分支。此外,如果我正确理解rebase,我想要在这个主分支上对我的分支进行rebase。我不想与主分支合并,因为我还没有完成对我的分支的开发。注意:上游更改的文件与我在我的分支中更改的文件不同,因此不应该出现冲突。

我尝试了以下步骤:

我从上游用户那里拉取了更改到我的本地仓库:
git pull upstream master

我将本地主分支的更改推送到我的forked主分支:
git push origin master

我在本地主分支上对我的本地分支进行了rebase
git checkout mybranch
git rebase master

我尝试将我的重新基于主分支的本地分支推送到我的forked分支:
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

但是相同的错误仍然存在。

我应该如何做到我想要的呢?


你能提供一下你的 .git/config 文件吗? - Малъ Скрылевъ
2个回答

4
这是我理解你的情况的方式:
[upstream repo] ==> [forked repo] <==> [local repo]
   master               master            master
                                          mybranch
箭头表示提交的方向流动。鉴于以上情况,您询问如何实现您期望的开发流程,使您的更改始终处于顶部。
总体上,如果要合并mybranch主题分支的更改,则forked 和 local repos的master不可避免地会偏离upstream master。然而,当更改完全不相关时,就像您在问题中概述的那样,您确实可以通过重新设置和快进来保持自己的一组更改在顶部,当您合并或拉取时。
    0] local master   $ 从master分离出分支mybranch 
    1] fork  master   $ git pull --rebase
    2] local master   $ git pull --rebase
    3] local mybranch $ 提交提交提交
    4] local mybranch $ git rebase master
在您的开发流程中重复1-4或只重复3-4多次。当您准备将工作发布到forked repo master时,upstream masterforked master将不再同步,但只要您遵循1-4,您就应该能够永远保持更改在顶部。
    5] local master $ git merge --ff-only mybranch
    6] local master $ git push origin
然后再次重复1-4多次。
一个警告。为了使此方法起作用,您可能需要将分支重置(或重新克隆存储库)到“干净”状态,在该状态下,您尚未将mybranch上的任何更改合并和/或推送到本地或派生出的master

1
这是因为您在此之前已经发布了您的mybranch分支。
解决方案很简单:不要这样做。您想要更改已发布的历史记录,这从来不是一个好主意!这可能会导致其他开发人员基于您公共的mybranch分支进行工作时出现非常丑陋的错误。
一种技术解决方案是:git push --force origin mybranch 或者用 git push origin :mybranchgit push origin mybranch 删除远程分支并重新推送它。 但是,如果mybranch已经发布,您不应该这样做。

那我该怎么做呢?我想继续在我的分支上工作,但是我想使用上游最新的更新。 - golddove
1
只需合并最新的更改即可。 - musicmatze
哦,我可以将master合并到mybranch中,而不是相反吗? - golddove
1
我真的鼓励你阅读一篇Git教程!一个不错的起点是gitready.com! - musicmatze

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