9

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

    •-•-• < topic
   /
•-•       < master

我推送主题分支

$ git push origin topic

其他人将更改推送到 master

    •-•-• < origin/topic
   /
•-•-•—•   < origin/master

如何更新我的本地 master 和 rebase 我的主题?

历史应该是这样的

        •-•-• < topic
       /
•-•-•—•       < master

我正在尝试什么

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

; rebase topic
$ git checkout topic
$ git rebase master

问题

我所有的提交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.

解决方案?

请注意,我不想将我的topic分支与master. 我只想更新我的本地存储库,而不必不必要地合并分支。

4

3 回答 3

13

为了清楚起见,让我重新编写您的示例。

    C-D-E < topic, origin/topic
   /
A-B < master, origin/master

然后有人工作。

    C-D-E < topic, origin/topic
   /
A-B-F-G < origin/master
  ^
master

您从原点获取 F 和 G,然后将主题重新定位到主节点。所以现在你的存储库看起来像这样。

    C-D-E < origin/topic
   /
A-B-F-G < master, origin/master
       \
        C'-D'-E' < topic

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

  1. 停止推送主题分支。如果只有你一个人在研究这个话题,那就没有必要推动它。只需将主题重新定位在 master 之上,完成后,将 master 快速合并到 topic 并推送 master。删除本地主题分支。瞧!

  2. 合并主题和大师。如果您需要在主题分支上进行协作,您可能应该将其吸收并合并。

  3. 强制远程变基:

    git 推送原始主题 -f

    这将强制原点/主题为 E'。除非在远程存储库中重写历史,否则你会遇到火与硫磺、人祭、狗和猫住在一起、集体歇斯底里……而且你的开发人员伙伴们不太喜欢你。完全不推荐。

于 2012-12-18T02:16:51.420 回答
4
; update master
git checkout master
git pull --rebase origin master  

; rebase topic
git rebase master topic

; push topic (force)
git push -f origin topic
于 2012-12-17T17:57:19.370 回答
0

你的问题有一些问题。

  1. 推送时不会出现合并冲突。这只会发生在你合并、变基、cherry-pick 或 stash pop/apply 时。
  2. 如果其他人同时更改与您相同的内容,您将无法避免冲突(即使可能只是您在处理 repo 的另一个副本)。
  3. “我所有关于主题的提交都被视为未提交”没有意义。您可能的意思是“我的主题分支提交引入的所有更改”由于我尝试变基时的冲突而尚未提交。

您的步骤是正确的,只是您忽略了 rebase 已因冲突而停止,而您只是忽略了它。您必须解决冲突,然后:

git add confilctedfile1.txt conflictedfile2.txt
git rebase --continue

您可能需要对主题分支中的所有提交执行此操作。只有当变基完成时,你才应该推送。

另一个注意事项:因此,rebase 不是日常工作的首选工作流程。合并在代码库中发生的事情更容易、更准确。有很多理由支持合并而不是变基。

于 2012-12-17T19:17:29.143 回答