2012-09-21 29 views
1

我似乎搞乱了我的git回购,可能是因为犯了“不要重新提交已提交到公共存储库的提交”的罪名。Git重新发布的问题 - 我应该“推动原点”

的情况是这样的:

  • 我跟踪从我的主分支中的上游资源库的变化,我把我自己的变化在一个名为devel的分支。
  • 当上游存储库发生更改时,我将其拖入主分支。
  • 然后,我签出devel并对其执行rebase master,以在主分支上获取我自己的更改。这产生原因的冲突,给下面的错误消息上来在几个提交的(I包括以下仅它们中的一个作为示例):

回落到修补基和3路合并。自动合并 public/scala/qscript/org/broadinstitute/sting/queue/qscripts冲突 公共/ scala/qscript/org/broadinstitute/sting/queue/qscripts/AlignWithBWA.scala 冲突/AlignWithBWA.scala 未能在更改中合并。 0038补丁失败为索引文件添加了检查 。

当你解决了这个问题,运行“git rebase --continue”。如果 你宁愿跳过这个补丁,而是运行“git rebase --skip”。 查看原始分支并停止重新分配运行“git rebase --abort”。

  • 然后我用git rebase --skip跳过产生这些问题的提交,最后我结束了我想要的代码。

现在,问题是,每次我想rebase我必须经过这个过程。我有什么方法可以避免未来发生同样的冲突?我的想法是使用push --force origin devel来覆盖远程回购中的历史记录,而不用提交导致冲突的提交。这是要走的路吗?或者有其他方法可以解决这个问题吗?

回答

1

假设上游并未重写公共历史记录,您应该调整您的提交以使其在master的最新代码之上工作。相反,您正在跳过提交冲突。您需要改为解决冲突,然后使用git add,然后git rebase --continue(而不是--skip)将其标记为已解决。

冲突继续发生的原因是因为您每次都跳过它们。

做一个git push --force会重写其他人使用该分支的公共历史记录(你可能会删除或重新排序他们已经提交并提交的提交)。这是最好的避免。

1

推力只能在最严峻的情况下完成。

如果任何人在开始工作后对远程分支进行了任何更改,您将会从字面上覆盖它们。

因此,您最好是手动解决冲突。

如果代码具有在同一行的变化,你需要手动解决这些问题。使用武力并不是解决问题的方法。

你不会每次都遇到冲突,如果已经被你的经验,这只是你在学习和几件事情可能是关闭你正在做的,虽然,实验和学习。

另一种选择要考虑可能是只取码,做一个拷贝,删除-r的.git目录,并作出新的git回购它(GIT INIT)。

1

我不认为git push --force这里是一个不错的主意。在使用git push --force你应该做的事情一样git fetchgit diff devel origin/master审查要补充哪些东西,并与推动消除和记住,以后--force其他开发商将收到警告,可能需要重订和重新推动他们改变之前的任何情况下。

  1. 我希望git rebase --skip你跳过你的开发提交,而不是取得主人的提交;
  2. 后“变基”应该是能够推动无“--force”(除非有新的提交过来有足够快的速度需要获取/底垫的另一周期)。

一些注意事项:

  • 如果你不想一遍又一遍地解决同样的冲突,你可以使用“混帐rerere”
  • Git的自动镜像远程内容为“产地/主“,你可以使用”git fetch“来更新它。然后你可以在你的devel中使用“git rebase origin/master”,而不需要在“master”分支之间来回切换。