[英]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
然后,您也可以以相同的方式合並。
您可能會聲稱您不打算合並兩個分支,但從根本上說您是。
考慮初始狀態:我們有兩個負責人, master
和origin/master
都指向提交A
然后,有人添加提交B
和C
並將其推送到您fetch
的origin
remote。 但是,在獲取之前,您已將提交D
, E
和F
到您的master
分支中,因此在fetch
,DAG布局如下所示:
A -> B -> C [origin/master]
|
\--> D -> E -> F [master]
您想將更改推送到origin
存儲庫。 但是您的更改顯然與origin/master
分支沖突,為此,您必須合並origin/master
和master
。
進行大量合並可能很丑陋,因此在一些重要條件下,我們可以執行重新設置基准。 但是,您必須要小心-您不能將這些更改推到任何其他外部存儲庫或類似的東西上,否則您將破壞基於這些提交的其他所有內容。 基於您當前的master
,我也不會有其他任何事情,因為這些提交現在已過時。
因此,您有兩個選擇:
origin/master
git merge origin/master && git push origin master
到master
git merge origin/master && git push origin master
: git merge origin/master && git push origin master
master
重置為origin/master
: git 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.