如何在TortoiseHg中删除意外创建的分支?

22

我是TortoiseHg的新手,请多包涵 :-) 我使用TortoiseHg在两台机器上连接我的远程代码仓库。我在一台机器上做了一些更改,提交了更改并试图将它们推送到远程仓库,但我忘记先执行拉取获取最新代码。推送给了我几行输出,建议我可能忘记先拉取(确实如此!),并提到类似“中止:推送创建了新的远程分支...”之类的内容。

所以我执行了一次拉取,仓库浏览器中添加了几个节点到我的图形顶部。问题是,我尝试执行的推送现在显示为仓库浏览器中的一个分支。从服务器端(codeplex)查看,它没有显示我尝试推送的任何迹象,表明这个意外的分支仍然存在于本地机器上。

我该如何删除这个意外的分支?我尝试选择图形中的那个节点,然后执行“还原”,但似乎没做什么。我在想是否最简单的方法就是放弃本地机器上的目录树,并从服务器进行全新、干净的拉取...

5个回答

18

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

这应该将您带回到一个单一的分支,重新连接两个头部。


7
听起来好像这个分支仍然会存在,是吗?我希望完全删除这个分支,因为我还没有在服务器上将其设置为永久分支。 - Michael Sorens
3
@msorens:我同意某件事情。使用Mercurial一段时间后,你会意识到试图保持你的修订历史记录干净整洁并不值得麻烦。如果你有多个人在一个项目上工作,服务器和本地仓库之间的变更集可能是无序的,或者你可能有一个短暂的匿名分支,这些都是可以预料的,但并不重要。 - Niall C.
@msorens: 唯一的缺点是这将给你带来更多的工作,包括手动将更改合并到新的本地存储库中。 - Niall C.
8
我同意大家的看法,就让它保持原样吧 :) 但我相信很多人会提出其他答案建议您使用'hg strip'或'hg clone -r'或histedit或mercurial queues。任何一个都可以,但当您发现它们是多么麻烦时,您肯定会说:“我不敢相信没有更简单的方法来做这件事”,然后每个人都会说“那是因为它不应该容易。”这是通常的模式,我们都经历过这个过程。从哲学上讲,mercurial是关于工作的不可磨灭记录,有点像科学家总是用钢笔写字一样。 - Ry4an Brase
1
注意事项已记录;感谢大家的反馈,我会更加小心我的“笔”! :-) - Michael Sorens
显示剩余3条评论

7
我有一个分支我不想要了,但是发现我不能合并该分支(或者很难弄清楚如何合并),因为它包含一个基于文件名大小写更改的冲突。
最终,我决定使用hg commit --close-branch。由于该分支仅存在于我的本地repo中,而不是我克隆的repo中,随后的hg push甚至没有费心将关闭的分支推送到主repo!非常方便。此时,我所要做的就是删除我的本地repo并从“master”重新克隆。

5

进行“合并”操作,并勾选“放弃合并目标(其他)版本的所有更改”。当然,在点击“合并”按钮之前,您应该确保所显示的目标是您想要丢弃的目标。


1
这将丢弃提问者的编辑,我认为这不是问题的意图。 - Clare Macrae
1
这正是我所想的,但请看修订代码引用,放弃操作针对的是您选择合并的那个。 - Hayden Thring

2
在“Repository Explorer”中,选择您本地更改的第一个版本,然后右键单击刚刚拉取的分支提示并选择“Rebase on top of selected”或“Modify history-> Rebase on top of selected”,具体取决于您的客户端版本。这将使您的版本基于已拉取的版本进行“重新基础”。
另外,为了帮助避免未来出现此问题...
在“Repository Explorer”中,选择“Tools-> Settings”。在左上角的下拉菜单中选择“User global settings”,以便所有存储库都适用。然后选择左侧的“Synchronize”。在“After Pull Operation”中选择“rebase”。这将导致您的本地修订版基于您刚刚拉取的修订版进行“重新基础”,而不是将它们留在不同的分支中。
这就是我所做的,可能是您通常想要的。有关更多信息,请参见rebase projectrebase extension

我喜欢这个想法。只有几件事情:首先,我的上下文菜单中没有这样的选项。RebaseExtension页面提供了答案——通过在配置文件中添加几行来启用它,可以在Mercurial手册的第5节中找到该文件。我这样做了,然后运行了一个rebase:它抱怨两个以.orig结尾的文件的不支持文件类型,这些文件是由rebase操作本身创建的!然后它指示我中止以便我可以解决冲突,并说在完成后运行“hg rebase --continue”... - Michael Sorens
[我分割评论的第二部分] 但是由于我正在TortoiseHg中运行而不是cmd行,所以不确定如何执行“rebase - continue”操作... 最后,确认消息说,在我的情况下,“将14重新定位到6之上?”这对我来说似乎是反过来的:14是拉取的主分支;6是我的本地分支。 - Michael Sorens
@msorens 关于上下文菜单 - 这有点尴尬。您必须首先通过左键单击选择一个版本,使其突出显示。然后通过右键单击选择下一个版本,这应该会显示两个版本都被突出显示,并给您提供变基选项。如果它没有出现在您的屏幕上,听起来可能是另一个问题。 - Kyle Heironimus
@msorens 关于“backwards” - 我告诉你的顺序是错误的。我已经更正了我的答案。抱歉。 关于“continue”,我不确定该怎么做。这一次,您可以运行Windows命令行。我相信TortoiseHg也会安装它。(如果没有安装,无论如何都应该安装它。有时候很方便。) - Kyle Heironimus
Kyle:你误解了我的评论,关于上下文菜单没有出现的问题——我试图解释这是一个问题,但我通过在配置文件中启用它来修复了它。 - Michael Sorens
在TortoiseHg 2.4.1中,我无法看到“在所选内容上重新设置基础”的选项。当您右键单击修订时,会出现“修改历史记录”->“重新设置基础...”。 - Clare Macrae

0

以下是使用命令行工具的方法。我猜它可以很容易地映射到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

现在的日子,不像以前那么复杂了,对吧?:)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接