2013-04-04 50 views
1

我已经使用了mercurial一段时间了,现在我切换到了git,因为我的新团队使用它作为默认的版本控制工具。来自mercurial git - 合并?

让我解释一下 - 在mercurial中,我从bitbucket中克隆项目,我对项目进行了一些更改。然后我再次从bitbucket中获取并将所做的更改与bitbucket上已更改的所有内容合并。然后我推动一切。

它与git一样吗?我克隆了项目,做了一些改变,对它们做了一些提交,现在我拉了项目,并且我想合并。这些先前的步骤工作正常,但合并有点不同,或至少它看起来不同于我。我如何将我的提交与我刚刚从服务器提取的新提交进行合并?

PS:我的更改和服务器上的更改都在主分支上完成,我不想合并2个分支。

回答

1

我的理解是,作为Mercurial用户的同伴,在Git中,所有头像都必须具有唯一的名称。因此,除非你给它一个新的名字,它不会创造出新的头像。如果B是您最初拉到基础版本,以及C1和C2是更改

hg pull /git pull 
hg commit/git commit 
hg commit/git commit 

----B----C1----C2 

:所以在水银你可以做到这一点。然后您从服务器上获取更新。

hg pull 

----B----C1----C2 
    \ 
     ----o----o----o 

Git不会这样做,因为它不得不创建另一个头。因此,您必须在服务器之上重新绑定/移植您的更改。

git pull --rebase 

----B----o----o----o----C1----C2 

另一种方法是,当你开始你在Git中工作,你为你的头名。 Git称之为分支,Hg称它为书签。

hg pull /git pull 
hg bookmark/git branch 
hg commit /git commit 
hg commit /git commit 

----B----C1----C2 
       ^New-Feature 

现在头部有一个名字(在这种情况下为“新特征”)。现在Git会像Hg一样愉快地拉动。

hg pull/git pull 

----B----C1----C2 
    \  ^New-Feature 
     ----o----o----o 

然后,您可以以相同的方式合并。

4
git pull --rebase origin master 

拉动的变化,可以叠加在上面你的本地修改。

但是,为每个新功能创建分支都是Git的预期工作流程,所以您可能想要了解它们。快速分支和合并是Git的杀手级功能。

1

你可能声称你并不打算合并两个分支,但基本上你是。

考虑初始状态:我们有两个头,分别为masterorigin/master,它们都指向提交A。然后有人添加提交BC并推送到origin远程,您fetch。但是,您获取之前,您添加提交DEFmaster分支,所以fetch后DAG布局是这样的:

A -> B -> C [origin/master] 
| 
\--> D -> E -> F [master] 

而且要更改推到origin库。但是您的更改显然与origin/master分支冲突,为此,您必须合并origin/mastermaster

进行大量合并可能会很难看,所以在一些重要条件下,我们可以执行rebase。但是,您必须小心 - 您不能将这些更改推送到任何其他外部存储库或类似的东西,否则您将破坏基于这些提交的其他任何内容。我也没有其他任何基于当前master的内容,因为这些提交现在已经过时。

因此,你有两个选择:

  • 合并origin/mastermastergit merge origin/master && git push origin master
  • 再次基于masterorigin/mastergit rebase origin/master && git push origin master

这两个可以用git-fetch结合,打造git-pull,它将自动使用合并方法,除非您提供选项--rebase,in这种情况下,它执行rebase

由于rebase命令的性质,请记住请始终使用--rebase

使用合并后

最终状态:

A -> B -> C -----> G 
|     | 
\--> D -> E -> F ---- 

最终状态使用重订后:

A -> B -> C -> D -> E -> F 
2

我的建议是从混帐底垫远离/拉--rebase,直到你舒服与git分支。现在,我惊讶的最重要的事情还没有人提到:

hg pull只是获得新的变更到您当地的回购,并不影响您的工作副本。

git pull获取新的提交,并尝试自动合并刚刚拉出的HEAD和您的本地头部。如果您有未提交的更改,可能会造成一些麻烦。

解决方案:至少现在,总是使用git fetch。这不会影响您的工作副本,并让您在自己的时间进行合并,例如Mercurial。换句话说,git fetch = hg pull。