合并从上游更新的冲突

时间:2012-05-27 11:11:23

标签: git github branching-and-merging

我正在尝试在github项目上开始使用git。 (我多年来一直在使用CVS,SVN和hg; git很难让我理解。)我尽可能准确地按照说明操作,根本无法使其正常工作。

我克隆我的分叉项目:

git clone git@github.com:davidgiven/linux-allwinner.git

根据建议,我添加一个“上游”遥控器,用于跟踪我的分支项目:

git remote add upstream https://github.com/amery/linux-allwinner.git

我从中取出:

git fetch upstream

这一切都很好。但是,自从我分叉项目以来,它已经过了一周左右,上游已经进行了改变。所以我想引入这些变化。我现在在正确的分支--- allwinner-v3.0-android-v2 ---所以我从上游合并到我的分支:

git merge upstream/allwinner-v3.0-android-v2

...我遇到了合并冲突。

CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/common.h
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby/Makefile
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/standby.S
CONFLICT (add/add): Merge conflict in arch/arm/mach-sun5i/pm/Makefile
[etc]

现在,我已经检查了没有;我还没有开始工作,我的项目完全没有动过,因为我分叉了。因此,不应该有任何冲突。但也有一些;发生了什么,我该如何解决?

更新

git show-branch HEAD upstream/allwinner-v3.0-android-v2显示了这一点,我不得不说我不明白:

! [HEAD] arm: sun3i: add getioaddr macro
 ! [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0
--
 + [upstream/allwinner-v3.0-android-v2] arm: sun3i: updated irq handling and machine_desc to 3.0
 + [upstream/allwinner-v3.0-android-v2^] arm: sunxi: renable early_printk in all _defconfig except crane's
+  [HEAD] arm: sun3i: add getioaddr macro
+  [HEAD^] arm: sun3i: add dummy machine type

2 个答案:

答案 0 :(得分:12)

可能是,上游改写了历史(改变,修改......) - 他们不应该这样做,但你永远不会知道。

由于您说您没有任何本地更改或提交,因此您应该通过重置分支将存储库恢复到干净状态:

git reset --hard upstream/allwinner-v3.0-android-v2

这将丢弃任何本地更改并提交当前HEAD无法访问的内容!


以上假设您将(强制)将分支的新重置状态推送到远程存储库,否则当您尝试从origin提取时会再次遇到冲突。

git push origin +allwinner-v3.0-android-v2

如果您已经在本地提交过,那么您必须在上游分支之上重新设置(或挑选)您的提交,然后进行原始推送。这样,您将以与上游相同的方式重新编写本地历史记录,并在顶部应用您的更改,即:

git rebase --onto upstream/branch \
  last-original-upstream-commit-before-yours \
  your-branch

答案 1 :(得分:2)

show-branch输出意味着upstreamHEAD自从它们的共同祖先(假设它是完整输出)以来每个都添加了两次提交。 (另请参阅:http://www.gitguys.com/topics/git-show-branch-to-see-branches-and-their-commits/)如果您自己没有提交任何内容,那就意味着上游推送了一个rebase(或其他改变了历史的东西)。由于你没有做任何事情,knittl的回答正是你想要的。

为了它的价值,我也很喜欢git log --oneline --graph --decorate --remotes --branches。你会得到一个包含所有分支和遥控器的ASCII图,这样你就可以看到发生了什么。