我已经使用 Git 一段时间了,我想将我通常的工作流程转换为 Mercurial。特别是,我对转换用于为 Git 项目做出贡献的工作流程感兴趣,以便能够为 Mercurial 项目做出贡献。

通常,对于 GitHub 上的项目,我会从原始项目中 fork GibHub 上的项目,然后在本地获取两个不同的远程名称:

# Clone the initial repository and call the remote repository 'github-origin'
git clone -o github-origin git://github.com/orig_author/project.git

# Add the forked GitHub repo as an additional remote repo ('github-mine')
cd project
git remote add github-mine git://github.com/me/project.git
git fetch github-mine

当我用 git branch -a 列出分支时,我得到如下信息:
* master
  remotes/github-mine/some_feature
  remotes/github-mine/master
  remotes/github-origin/HEAD -> github-origin/master
  remotes/github-origin/some_feature
  remotes/github-origin/master

我可以使用 git checkout -b new_feature 创建自己的本地分支,然后将其推送回我的 GitHub 存储库,从而添加两个引用:
* my_feature
  remotes/github-mine/my_feature

然后我可以联系原作者讨论这个功能,提交 pull 请求等等。
所有这些工作流程实际上完全独立于原作者的工作时间线。这使得在不污染主项目存储库的情况下讨论实验特性变得非常容易。

如果原作者提交了更多更改,我可以跟上 git fetch github-orig 并可能相应地 merge 或重新设置我的本地更改。作为一个快速测试(假设当前分支是 my_feature ):
git fetch github-origin
git checkout -b temp
git rebase github-origin/master

这个工作流程的一个要点是能够知道与我自己的分支相比每个存储库的分支所在的位置。特别是,重要的是要知道我的分支与具有相同名称的远程分支不同(例如,即使在两个 GitHub 存储库之间,两个 master 分支也不需要相同)。使用 gitk --all 可以很容易地看到这一切。

我不确定如何在 Mercurial 项目(例如在 BitBucket 上)上做同样的事情。

这是我尝试做的,基于这个 Command Equivalence Table :
hg clone https://bitbucket.org/orig_author/project

# Edit .hg/hgrc and add 'bb-mine=https://bitbucket.org/.../project' to [paths]

# Apparently equivalent to git fetch.
hg pull bb-mine

这似乎有效,并且它会提取远程提交(实际上,我已经在我已经推送了我的一个分支的存储库上尝试了此操作)。我可以使用 hg branches 看到所有分支,但没有说明它们来自哪里。 hg view 并没有真正显示任何内容。更重要的是,我的 tip 现在是我提交的最新版本,但我没有我应该拥有的 github-origin/master 标签(无论是在我自己提交之前还是在其他作者进行了更多更改之后)。

我希望能够在 future 的任何时间点执行 hg pull (相当于 git fetch ),以查看我的本地副本与其他作者所做的新更改之间的差异,而不必更改任何内容我的本地存储库或我的 BitBucket 存储库中(至少在我修复了由于这些更改导致的潜在冲突之前)。

最重要的是,当我使用 Git 时,我也倾向于拥有自己的 backup 存储库(这是一个 SSH 服务器,我可以在其中推送所有分支,甚至是尚未发布的正在进行的工作)。

我意识到 Mercurial 的分支方式与 Git 方式并不完全相同。但是,Mercurial 是否有等效的工作流程,或者我是否只需要改变我的方法?我如何才能看到我正在使用的每个存储库与它们各自的分支(其中一些可能有共同之处)的位置?

最佳答案

这是一个很大的问题,所以我将选择几点。我认为你应该到 IRC channelmailinglist 寻求更多建议——我预测你的(进一步的)问题将是一种讨论性质的,最好在那里讨论事情。



不要过分强调 tip 标签。这是一个已弃用的概念,当您有多个分支时,这意味着越来越少。主要问题是它只是您存储库中的最新变更集,因此在您 pull 时它会从(命名)分支跳转到(命名)分支。我们更喜欢谈论 default 和其他命名的分支/书签,因为这些标识符以更可控的方式移动。



remotebranches extension 可能会帮助您在这里获得更像 Git 的工作流程。

但总的来说,如果你想在 Mercurial 中使用类似 Git 的分支,你应该查看 bookmarks。您使用 hg branch 创建的 named branches 与您使用 git branch 创建的分支几乎没有相似之处(Git 缺少 Mercurial 的命名分支概念)。

使用 hg incominghg outgoing 查看存储库之间的差异。这就是我通常看到需要从另一个克隆中提取或推送到另一个克隆的方式。

关于git - 将 Git 工作流转换为 Mercurial,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9151158/

10-11 17:31