【问题标题】:How to remove accidental branch in TortoiseHg?如何删除 TortoiseHg 中的意外分支?
【发布时间】:2010-06-03 04:03:05
【问题描述】:

(我是 TortoiseHg 的新手,所以请耐心等待 :-) 我在两台机器上使用 TortoiseHg 来与我的远程源存储库通信。我在一台机器上进行了更改,提交了它们,并试图将它们推送到远程存储库,但我忘了先拉取最新的代码。 push 给了我几行输出,表明我可能忘记了先拉(真的!)并提到了诸如“中止:push 创建新的远程分支......”之类的内容。

所以我做了一个拉动,它在存储库浏览器中的图表头部添加了几个节点。问题是我试图做的推送现在显示为存储库资源管理器中的一个分支。从服务器端(codeplex)看,它没有显示我尝试推送的迹象,表明这个意外分支仍然在我的机器上。

如何删除这个意外分支?我尝试在图中选择该节点然后执行“还原”,但它似乎没有做任何事情。我想知道在我的本地机器上丢弃我的目录树并从服务器上做一个全新的、干净的拉取是否是最简单的......?

【问题讨论】:

    标签: mercurial tortoisehg


    【解决方案1】:

    首先确保您已提交所有本地更改。然后通过调用hg merge 合并分支并提交结果。

    这应该会让你回到一个分支,重新组合两个头。

    【讨论】:

    • 听起来分支还会在那里,是吗?我希望完全删除分支,因为我还没有将它永久保存在服务器上。
    • @msorens:“并行”提交的两个变更集将保持这种状态,但这有关系吗?通过合并,两个分支将在一个顶级修订版中连接在一起。从那时起,将再次只有一个最新版本,即使它在其前辈中有一个短叉分为两个分支。
    • @msorens:我同意某事。使用 Mercurial 一段时间后,您会意识到试图让您的修订历史保持干净是不值得的。无论您的服务器和本地存储库之间的变更集是否无序,或者您有一个短暂的匿名分支(如果您有多个人在一个项目上工作,这两者都是可以预料的)都没有关系)。
    • @msorens:我同意这些人的观点,别说了。 :) 但是,我敢肯定,很多人会提出其他答案,建议您使用“hg strip”或“hg clone -r”或 histedit 或 mercurial 队列。任何一个都可以,但是当你看到它们有多么麻烦时,你总是会说,“我不敢相信没有更简单的方法可以做到这一点”,每个人都会附和“那是因为它是应该不容易。”无论如何,这是通常的模式,我们都经历过。哲学上的反复无常是关于工作的不可磨灭的记录,有点像科学家总是用钢笔写作。
    • 注意点;感谢大家的反馈,我会更加小心我的“笔”! :-)
    【解决方案2】:

    我有一个我不想要的分支,但发现我无法合并该分支(或者我很难弄清楚如何合并),因为它包含基于文件名大小写更改的冲突。

    最终,我决定hg commit --close-branch。由于该分支仅存在于我的本地存储库中,而不是我从中克隆的存储库中,因此后续的 hg push 甚至都懒得将关闭的分支推送到主存储库!很方便。那时,我要彻底消除它,只需删除我的本地 repo 并从“master”重新克隆。

    【讨论】:

      【解决方案3】:

      执行“合并”并选中“放弃合并目标(其他)修订版中的所有更改”。当然,在单击“合并”按钮之前,您应该确保显示为合并目标的目标确实是您要丢弃的目标。

      【讨论】:

      • 这会丢弃提问者的编辑,我认为这不是问题的意图。
      • 这就是我的想法,但是查看修订代码引用,丢弃是对您选择合并的那个完成
      【解决方案4】:

      在 Repository explorer 中,选择本地更改的第一个 rev,然后右键单击刚刚拉出的分支的尖端并选择“Rebase on top of selected”或“Modify history->Rebase on top of selected”取决于您的客户端版本。这将使您的转速“重新建立”在拉动的转速上。

      另外,为了避免以后出现这种情况...

      在存储库资源管理器中,选择工具->设置。在左上角的下拉菜单中,选择“用户全局设置”,这适用于所有存储库。然后选择左侧的同步。在“拉操作后”中选择“变基”。这将导致您的本地修订“重新基于”您刚刚提取的修订,而不是将它们留在不同的分支中。

      这就是我的做法,可能也是您通常想要的。

      有关详细信息,请参阅 rebase projectrebase extension

      【讨论】:

      • [由于 SO 限制,我将其分成 2 个 cmets。] 我喜欢这个概念。只有几件事:首先,我的上下文菜单上没有这样的选项。 RebaseExtension 页面提供了答案——通过在配置文件中添加几行来启用它,可以通过参考 Mercurial 手册的第 5 节找到。我这样做了,然后运行了一个 rebase:它抱怨两个以 .orig 结尾的文件不受支持的文件类型,这些文件是由 rebase 操作本身创建的!然后它表明它已中止,因此我可以解决冲突,并说完成后运行“hg rebase --continue”......
      • [我的拆分评论的第 2 部分] 但是由于我在 TortoiseHg 而不是 cmd 行中运行,所以不确定我将如何执行“rebase -- continue”操作...最后,确认说,在我的情况下,“在 6 之上重新设置 14?”。这对我来说似乎倒退了:14 是拉出的主分支; 6 是我的本地分支。
      • @msorens re:上下文菜单 - 有点尴尬。您必须首先通过左键单击选择一个转速,使其突出显示。然后通过右键单击选择下一个,然后它应该会突出显示两个转速并为您提供 rebase 选项。如果它没有为您显示,听起来可能是另一个问题。
      • @msorens re:倒退-我告诉你错误的顺序。我现在已经通过答案更正了。对不起。我不知道该怎么办继续。这一次,您可以运行 Windows 命令行。我相信 TortoiseHg 也安装了这个。 (如果没有,你还是应该安装它。它有时会派上用场。)
      • kyle:你误解了我对没有出现上下文菜单的评论——我试图解释这是一个问题,但我通过在配置文件中启用它来修复它。
      【解决方案5】:

      这是使用命令行工具的方法。我想它可以很容易地映射到 TortoiseHg (虽然我不确定,因为我从不使用它......)无论如何,因为它应该只是偶尔做一次,我认为在这里使用终端没有问题.

      示例设置

      假设你的远程仓库是这样的:

      @  changeset:   3:a4c18a1fba12
      |  tag:         tip
      |  summary:     commit 4
      |
      o  changeset:   2:91c5dbfba15c
      |  summary:     commit 3
      |
      o  changeset:   1:4c77cb7952ea
      |  summary:     commit 2
      |
      o  changeset:   0:085dae46f27e
         summary:     commit 1
      

      在本地,您没有提交 4,因此您直接在提交 3 上提交了一些内容:

      @  changeset:   3:39526003350f
      |  tag:         tip
      |  summary:     commit 4 made locally
      |
      o  changeset:   2:91c5dbfba15c
      |  summary:     commit 3
      |
      o  changeset:   1:4c77cb7952ea
      |  summary:     commit 2
      |
      o  changeset:   0:085dae46f27e
         summary:     commit 1
      

      所以你尝试推送它,然后得到这个消息:

      $ hg push
      pushing to ssh://hg@bitbucket.org/brandizzi/mercurial-test-repo
      searching for changes
      remote has heads on branch 'default' that are not known locally: a4c18a1fba12
      abort: push creates new remote head 39526003350f!
      (pull and merge or see "hg help push" for details about pushing new heads)
      

      按照要求,你拉它:

      $ hg pull
      pulling from ssh://hg@bitbucket.org/brandizzi/mercurial-test-repo
      searching for changes
      adding changesets
      adding manifests
      adding file changes
      added 1 changesets with 1 changes to 1 files (+1 heads)
      (run 'hg heads' to see heads, 'hg merge' to merge)
      

      你现在拥有它......

      o  changeset:   4:a4c18a1fba12
      |  summary:     commit 4
      |
      | @  changeset:   3:39526003350f
      |/   summary:     commit 4 made locally
      |
      o  changeset:   2:91c5dbfba15c
      |  summary:     commit 3
      |
      o  changeset:   1:4c77cb7952ea
      |  summary:     commit 2
      |
      o  changeset:   0:085dae46f27e
         summary:     commit 1
      

      ...但您宁愿不按要求合并。你想要这个:

      o  changeset:   4:a4c18a1fba12
      |  summary:     commit 4 made locally
      |
      o  changeset:   3:a4c18a1fba12
      |  summary:     commit 4
      |
      o  changeset:   2:91c5dbfba15c
      |  summary:     commit 3
      |
      o  changeset:   1:4c77cb7952ea
      |  summary:     commit 2
      |
      o  changeset:   0:085dae46f27e
         summary:     commit 1
      

      然后你想把它推送到远程仓库。

      你是怎么知道的?

      解决它

      要做到这一点,您不能已推送“本地提交 4”。此外,没有办法将它放在 新的远程提交之后。这么说,我们可以得到我们所要求的。

      也就是说,您只需要将本地提交重新设置为新的远程提交即可:

      $ hg rebase --source 3 --dest 4
      

      如果你够幸运,那就足够了。

      处理冲突

      如果运气不好,可能会发生一些冲突:

      $ hg rebase --source 3 --dest 4
      rebasing 3:39526003350f "commit 4 made locally"
      merging test.txt
      warning: conflicts while merging test.txt! (edit, then use 'hg resolve --mark')
      unresolved conflicts (see hg resolve, then hg rebase --continue)
      

      然后,只需解决冲突(通过手动编辑):

      $ hg st
      M test.txt
      $ nano test.txt # Edit and save
      

      ...将文件标记为已解决...

      $ hg resolve --mark
      (no more unresolved files)
      continue: hg rebase --continue
      

      ...并继续进行变基:

       $ hg rebase --continue
      rebasing 3:39526003350f "commit 4 made locally"
      saved backup bundle to /home/adam/software/mercurial-test-repo/.hg/strip-backup/39526003350f-64863882-backup.hg
      

      这是你的新历史:

      @  changeset:   4:ca31fe8a15f0
      |  summary:     commit 4 made locally
      |
      o  changeset:   3:a4c18a1fba12
      |  summary:     commit 4
      |
      o  changeset:   2:91c5dbfba15c
      |  summary:     commit 3
      |
      o  changeset:   1:4c77cb7952ea
      |  summary:     commit 2
      |
      o  changeset:   0:085dae46f27e
         summary:     commit 1
      

      现在,推送它:

      $ hg push
      pushing to ssh://hg@bitbucket.org/brandizzi/mercurial-test-repo
      searching for changes
      remote: adding changesets
      remote: adding manifests
      remote: adding file changes
      remote: added 1 changesets with 1 changes to 1 files
      

      那些日子,它不像以前那么复杂了,对吧? :)

      【讨论】:

        猜你喜欢
        • 2016-05-27
        • 2016-10-03
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 2021-12-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多