Git rebasing问题 - 我应该“推动 - 强制起源”

时间:2012-09-21 12:03:33

标签: git

我似乎搞砸了我的git repo,可能是犯下了“不要将你已经推送到公共存储库的提交。”

情景如下:

  • 我跟踪主分支中上游存储库的更改,我将自己的更改保存在名为devel的分支中。
  • 当上游存储库发生变化时,我将其拉入主分支。
  • 然后我结帐devel并对其进行rebase master,以便在主分支之上进行自己的更改。这会导致原因冲突,在几个提交中出现以下错误消息(我在下面只包含其中一个作为示例):
  

回到修补基础和3向合并...自动合并   公共/斯卡拉/ qscript /组织/ broadinstitute /刺痛/队列/ qscripts / AlignWithBWA.scala   冲突(内容):合并冲突   公共/斯卡拉/ qscript /组织/ broadinstitute /刺痛/队列/ qscripts / AlignWithBWA.scala   无法合并更改。修补程序在0038失败。添加了检查   索引文件。

     

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

  • 然后我使用git rebase --skip跳过导致问题的提交,最后我得到了我想要的代码。

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

3 个答案:

答案 0 :(得分:1)

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

冲突持续发生的原因是你每次都在跳过它们。

执行git push --force会为使用分支的其他人重写公共历史记录(您可以删除或重新排序他们已经下拉并在其上工作的提交)。最好避免这种情况。

答案 1 :(得分:1)

推力应该只在最严峻的情况下进行。

如果您开始工作后其他人对远程分支进行了任何更改,您将完全覆盖它们。

所以你最好手动解决冲突。

如果代码在同一行上有更改,则需要手动解决。使用武力不是“解决”它们的方法。

你不会每次都得到冲突,如果这是你的经历,那就是你正在学习的时候,在你做这件事,试验和学习的时候可能会有一些事情发生。

另一个需要考虑的选择可能是只需要获取代码,制作副本,删除-r .git目录并为其创建一个新的git repo(git init)。

答案 2 :(得分:1)

我认为git push --force在这里不是一个好主意。在任何情况下,在使用git push --force之前,您应该执行git fetchgit diff devel origin/master之类的操作来查看您添加的内容以及通过推送移除的内容,并请注意--force之后的其他内容开发人员将收到警告,可能需要重新调整并重新推动他们的更改。

  1. 我希望git rebase --skip你正在跳过你的devel的提交,而不是取得主人的提交;
  2. “rebase”应该能够在没有“--force”的情况下推送(除非新的提交很快到达那里需要另一个fetch / rebase循环)。
  3. 一些注意事项:

    • 如果您不想一遍又一遍地解决相同的冲突,可以使用“git rerere”
    • Git自动将远程内容镜像为“origin / master”,您可以使用“git fetch”来更新它。然后你可以在你的开发中使用“git rebase origin / master”,而无需来回转换为“master”分支。