如何使用master上的上游更改更新主题分支?

Tha*_*you 8 git git-rebase

我在一个主题分支上开始做一些工作

    •-•-• < topic
   /
•-•       < master
Run Code Online (Sandbox Code Playgroud)

我推动主题分支

$ git push origin topic
Run Code Online (Sandbox Code Playgroud)

其他人将更改推送到主人

    •-•-• < origin/topic
   /
•-•-•—•   < origin/master
Run Code Online (Sandbox Code Playgroud)

如何更新我的本地主人并重新定义我的主题?

历史应该是这样的

        •-•-• < topic
       /
•-•-•—•       < master
Run Code Online (Sandbox Code Playgroud)

我在想什么

; update master
$ git checkout master
$ git fetch origin
$ git merge --ff-only origin/master

; rebase topic
$ git checkout topic
$ git rebase master
Run Code Online (Sandbox Code Playgroud)

问题

我的所有提交topic都被认为是未提交的.所以,当我尝试时git push origin topic,我得到了

 ! [rejected]        topic -> topic (non-fast-forward)
error: failed to push some refs to '/path/to/repo.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.
Run Code Online (Sandbox Code Playgroud)

解决方案?

请注意,我希望我的合并topic与分支master.我只想更新我的本地仓库,而不必不必要地合并分支.

Mik*_*icz 11

让我清楚地重复你的例子.

    C-D-E < topic, origin/topic
   /
A-B < master, origin/master
Run Code Online (Sandbox Code Playgroud)

然后有人工作.

    C-D-E < topic, origin/topic
   /
A-B-F-G < origin/master
  ^
master
Run Code Online (Sandbox Code Playgroud)

你从原点获取了F&G,然后将主题重新设置为主人.所以现在你的存储库看起来像这样.

    C-D-E < origin/topic
   /
A-B-F-G < master, origin/master
       \
        C'-D'-E' < topic
Run Code Online (Sandbox Code Playgroud)

这就是问题所在.E的原点/主题无法快速转发到E'的主题.Rebase实际上仅适用于未被推送到源的提交.由于您已经将C,D和E推送到源/主题,因此您必须在远程存储库上重写历史记录.因此错误.所以你真的有三个选择:

  1. 停止推动局部分支.如果只有你正在研究主题,那么就没有必要推动它了.只需在master上保留rebased主题,完成后,快速将master合并到topic&push master.删除本地主题分支.瞧!

  2. 合并主题和主人.如果你需要在一个主题分支上进行协作,你应该把它搞砸并合并.

  3. 强制远程rebase:

    git push origin topic -f

    这将迫使原点/主题为E'.除了在远程存储库中重写历史记录之外,你将拥有火与硫磺,人类牺牲,生活在一起的狗和猫,大规模的歇斯底里......以及你的开发人员并不喜欢你.根本不推荐.

  • 主题分支重新定位然后强制推送是相当常见的。你需要确保人们理解你的主题分支是你的私人历史,这主要是 GitHub 分支的情况,例如 (2认同)

the*_*olm 5

; update master
git checkout master
git pull --rebase origin master  

; rebase topic
git rebase master topic

; push topic (force)
git push -f origin topic
Run Code Online (Sandbox Code Playgroud)