使用git rebase和未提交更改的Mercurial线性历史记录

时间:2011-10-14 11:14:42

标签: version-control mercurial dvcs tortoisehg

假设我在本地仓库中有多个提交,并且在工作目录中有一些未经修改的更改。 在hg pullhg update之后,我从中央仓库获得了一些新的变更集,这些变更集在本地仓库中创建了一个新的头。

现在假设,我不想将这两个头合并并推送,在这种情况下,当我尝试合并时,我会得到消息,即我在工作目录中有未经修改的更改。

同样,假设我不想使用hg shelve来搁置未经修改的更改并合并没有问题,但是想使用hg rebase创建线性历史记录,所以我把我的在提交的提交之上提交。当我进行rebase时,实际上我会在hg rebase章节下进行合并,如here所示。

现在我的问题是,我是否会收到相同的错误消息:“无法进行合并,存在未经修改的更改”,因为hg rebase是否隐式合并?

如果是,那么我将不得不在两种情况下使用hg shelve:两个头的显式合并和变基的隐式合并,没有?

提前致谢,
干杯

2 个答案:

答案 0 :(得分:5)

简单的答案是肯定的。如果您有未提交的修改,hg rebase将不允许您执行rebase。有一些解决方案,其中没有一个是完美的:

  • 提交您的优秀工作,进行变基,然后hg export tip > foo.patchhg strip tiphg import --no-commit foo.patch

  • 使用hg shelve。我没有详细评论,因为我没有尝试过。

  • 使用hg branch <branch-name>创建一个新的命名分支,并在命名分支上提交您的杰出工作。然后,您可以使用hg rebase --keepbranches --base <branch-name> --dest default在新更改的基础上重新设置工作分支。我个人认为使用命名分支(从不将我的克隆转移到上游)是一种管理这种工作流的非常好的方法,因为它可以很容易地在上游和我当前的项目之间来回移动,并且承担分支机构不会受到处罚。

答案 1 :(得分:4)

  

假设我在本地仓库中有多个提交,并且在工作目录中有一些未经修改的更改。在hg pull,hg update之后,我从中央仓库获得了一些新的变更集,这些变更集在本地仓库中创建了一个新的头部。

如果您在工作目录中有未提交的更改,并且hg pull为您提供了来自上游的新头,hg update会告诉您:

abort: crosses branches (merge branches or use --clean to discard changes)

如果您尝试合并,则会收到有关无法与未提交的更改合并的消息。

所有这些都是有充分理由的:如果没有提交更改,那么当合并机制启动时,它们将永远丢失。您应该在尝试合并或重新绑定之前提交或搁置您未提交的更改。上游代码。

您也可以考虑使用MQ来帮助您解决这个问题。 MQ和rebase旨在协同工作,因此如果您的本地未完成的更改由MQ管理,您所要做的就是hg qrefresh; hg pull --rebase