1

我使用 mercurial 已经有一段时间了,现在我改用 git,因为我的新团队使用它作为默认的版本控制工具。

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

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

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

4

4 回答 4

4
git pull --rebase origin master

拉入更改并将您的本地更改堆叠在顶部。

但是,为几乎所有新功能创建分支是 Git 的预期工作流程,因此您可能无论如何都想了解它们。快速分支和合并是 Git 的杀手级功能。

于 2013-04-04T12:57:10.103 回答
2

我的建议是远离 git rebase/pull --rebase 直到你对 git 分支感到满意。现在,我很惊讶没有人提到的最重要的事情:

hg pull 只是将新的变更集添加到您的本地存储库中,并且不会影响您的工作副本。

git pull 获取新的提交并尝试自动将刚刚拉取的 HEAD 与本地 HEAD 合并。如果您有未提交的更改,可能会给您带来一些麻烦。

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

于 2013-04-20T09:29:35.610 回答
1

作为一名 Mercurial 用户,我对它的理解是,在 Git 中,所有头都必须有唯一的名称。因此,除非您给它一个新名称,否则它不会创建新的头部。所以在 Mercurial 中你可以这样做:

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

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

您最初提取的基本修订版在哪里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

现在头部有了一个名字(在这个例子中是“New-Feature”)。现在 Git 会像 Hg 一样愉快地拉动。

hg pull / git pull

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

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

于 2013-04-14T08:49:47.313 回答
1

您可能会声称您不打算合并两个分支,但从根本上说您是。

考虑初始状态:我们有两个头,master并且origin/master都指向 commit A。然后有人添加提交BC推送到origin远程,你fetch. 但是,在您获取之前,您将提交D、、E和添加F到您的master分支中,因此在fetchDAG 布局之后如下所示:

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

并且您想将更改推送到origin存储库。但是您的更改显然与origin/master分支冲突,为此,您必须合并origin/mastermaster.

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

因此,您有两个选择:

  • 合并origin/mastermastergit merge origin/master && git push origin master
  • 重新定位masterorigin/mastergit rebase origin/master && git push origin master

这两者都可以与git-fetchcreate结合git-pull使用,除非您提供 option ,否则它将自动使用合并方法--rebase,在这种情况下它会执行 a rebase

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

使用合并后的最终状态:

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

使用变基后的最终状态:

A -> B -> C -> D -> E -> F
于 2013-04-14T14:50:24.370 回答