Git 从上游更新合并冲突
我正试图在github项目上开始使用git。(我多年来一直在使用CVS、SVN和hg;git很难让我动脑)。我正在尽可能精确地遵循指示,但我无法让它正常工作 我克隆了我的分叉项目:Git 从上游更新合并冲突,git,github,branching-and-merging,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.g
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
可能是上游已经重写了历史(重新基址、修改等)——他们不应该这么做,但你永远不会知道 因为您说您没有任何本地更改或提交,所以应该通过重置分支将存储库恢复到干净状态:
git reset --hard upstream/allwinner-v3.0-android-v2
(这将放弃任何本地更改,并使当前头的提交无法访问!)
以上假设您将(强制)将分支的新重置状态推送到远程存储库,否则当您尝试从
源
提取时,将再次遇到冲突
git push origin +allwinner-v3.0-android-v2
如果您已经在本地提交了自己的请求,那么您必须在上游分支上重新设置(或选择)提交的基础,然后推送到源代码。这样,您就可以像上游一样重新编写本地历史记录,并在顶部应用您的更改,即:
git rebase --onto upstream/branch \
last-original-upstream-commit-before-yours \
your-branch
show branch
输出意味着upstream
和HEAD
自它们的共同祖先(假设这是完整的输出)以来,各自添加了两个提交。(另请参见:)如果您自己没有做出任何承诺,这确实意味着上游推动了重新基准(或其他改变历史的事情)。既然你没有做出任何承诺,奈特的回答正是你想要的
值得一提的是,我也喜欢git日志--单线--图形--装饰--远程--分支。您将得到一个包含所有分支和远程的ASCII图,这样您就可以直观地看到在哪里发生的事情。听起来像是您希望重新设置基础而不是合并。
git show branch HEAD upstream/allwinner-v3.0-android-v2
可能会显示一些有趣的内容。这是show branch
的完整输出吗?我希望它以一行开头,结尾是++
是的,没有++
,我已经试过了。不幸的是,它没有帮助。。。现在,git push
失败,告诉我需要先git pull
;但是,git pull
产生的合并错误与我之前遇到的相同。这就是我所期望的;我的理解是,git reset
将当前分支更改为指定的分支,因此我现在只需在本地签出一份上游/allwinner-v3.0-android-v2
。但是由于冲突发生在origin/..
和upstream/..
之间,所以唯一改变的是冲突发生的时间。@DavidGiven:git push to where?它将失败,因为你的推动不再是快进。您在问题中提到您没有做出任何承诺,因此可能需要一次强制推送?在rebase
文档中有一个关于从上游rebase恢复的完整部分,如果您希望得到真正彻底的治疗,这可能会有所帮助:另外,如果您在回答中添加push-f
,我会接受。非常感谢。@Chris:是的,+branchname
转化为强制推送。当时(2012年)gitpush
不支持-f
/-force
选项,后来添加了该选项。