簡體   English   中英

從汞到git-合並?

[英]Coming from mercurial to git - merging?

我已經使用Mercurial了一段時間,現在我切換到了git,因為我的新團隊將其用作默認版本控制工具。

讓我解釋一下-在我從bitbucket克隆項目的過程中,我對項目進行了一些更改。 然后,我再次從bitbucket中撤出並將我的更改與bitbucket上已更改的所有內容合並。 然后我推一切。

與git兼容嗎? 我已經克隆了項目,進行了一些更改,對它們進行了一些提交,現在我退出了項目,並且我想合並。 前面的這些步驟工作正常,但合並對我來說有點不同,或者至少看起來有所不同。 如何將提交與剛剛從服務器中拉出的新提交合並?

PS:我的更改和服務器上的更改均已在主分支上完成,我不希望合並2個分支。

git pull --rebase origin master

引入更改並將本地更改堆疊在頂部。

但是,為幾乎所有新功能創建分支是Git的預期工作流程,因此您可能仍要了解它們。 快速分支和合並是Git的殺手級功能。

我的建議是遠離git rebase / pull --rebase,直到您對git分支感到滿意為止。 現在,令我驚訝的最重要的事情是沒有人提到:

hg pull只會將新的變更集添加到本地存儲庫,並且不會影響您的工作副本。

git pull獲取新的提交,並嘗試自動將剛剛拉出的HEAD與本地HEAD合並。 如果您未提交更改,可能會給您帶來麻煩。

解決方案:至少目前至少始終使用git fetch。 這不會影響您的工作副本,並且可以像Mercurial一樣按自己的時間進行合並。 換句話說,git fetch = hg pull。

我對它的了解是作為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

現在,頭部有了一個名稱(在這種情況下為“新功能”)。 現在,Git會像Hg一樣快樂地拉。

hg pull / git pull

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

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

您可能會聲稱您不打算合並兩個分支,但從根本上說您是。

考慮初始狀態:我們有兩個負責人, masterorigin/master都指向提交A 然后,有人添加提交BC並將其推送到您fetchorigin remote。 但是,在獲取之前,您已將提交DEF到您的master分支中,因此在fetch ,DAG布局如下所示:

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

您想將更改推送到origin存儲庫。 但是您的更改顯然與origin/master分支沖突,為此,您必須合並origin/mastermaster

進行大量合並可能很丑陋,因此在一些重要條件下,我們可以執行重新設置基准。 但是,您必須要小心-您不能將這些更改推到任何其他外部存儲庫或類似的東西上,否則您將破壞基於這些提交的其他所有內容。 基於您當前的master ,我也不會有其他任何事情,因為這些提交現在已過時。

因此,您有兩個選擇:

  • 合並origin/master git merge origin/master && git push origin mastermaster git merge origin/master && git push origin mastergit merge origin/master && git push origin master
  • master重置為origin/mastergit rebase origin/master && git push origin master

這兩個可以結合git-fetch創造git-pull ,除非您提供的選項,它會自動使用合並方法--rebase ,在這種情況下進行rebase代替。

請記住,由於rebase命令的性質,始終使用--rebase要小心。

使用合並后的最終狀態:

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

使用rebase后的最終狀態:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM