2013-04-04 71 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。