2016-02-10 74 views
0

通常,在HG我的工作流程是專門使用:什麼是汞拉所用的底墊命令--rebase

hg pull --rebase 

如果我想在兩個命令運行這個,我會怎麼做呢?

hg pull 
hg rebase <probably with some options?> 
+0

我懷疑它是類似於git的:http://stackoverflow.com/questions/18930527/difference-between-git-pull-and-git-pull-rebase – jonrsharpe

回答

5

什麼hg pull --rebase確實是首先執行hg pull,然後hg rebase帶有默認參數(您可以查看功能pullrebase()中的Mercurial分配中的rebase.py中的代碼),但只有在中拉出任何新修訂版時纔會執行。如果不需要重新綁定,hg pull --rebase將更新爲新的分支提示。所以,hg pull && hg rebase大致是正確的,但並不完全捕捉到一些角落案例(沒有新的修訂版,沒有必要的rebase)。

默認情況下,hg rebase將使用工作目錄的父爲基本修訂的底墊和最近當前分支的版本(即通常你只是在拉)作爲目的地。總之,它相當於hg rebase -b . -d 'last(branch(.))'

在這種情況下,「基本修訂」是什麼意思?這意味着Mercurial將會去尋找基本修訂和目的地的最不共同的祖先。然後它會將所有東西重新分配,但不包括目的地之上的最小共同祖先。也就是說,指定基本版本允許你在分支[1]上選擇幾乎所有你想要重定義的版本,並讓Mercurial找出哪些版本屬於該分支。

注意,因爲底墊是基於當前工作目錄的父目錄,這意味着,如果您當前的結賬是你一直在做什麼,然後hg pull --rebase可以通過實際努力變基不同的驚喜你分支(它通常會失敗,因爲這些修訂通常是公共階段的一部分,但如果您使用所謂的non-publishing repositories不使用命名分支),則需要注意這一點。

[1]在這種情況下分支是指一個匿名或拓撲分支,而不是一個命名分支。進一步的細節見hg help glossary

1

如果你想通過手(普通壞主意)變基,必須

  • hg help rebase
  • 瞭解你變基的選擇(至少-s和可用使用這些選項

讓我們在玩具回購看到:

回購甲

A>hg log -T "{rev} {desc}\n" 
1 A2 
0 A1 

2個變更集A1和A2被克隆到回購BC(B爲pull --rebase A,C對清潔pull A

和克隆後爲了測試您的使用情況(分歧歷史),將兩個附加變更集添加到A和B + C中

A>hg log -T "{rev} {desc}\n" 
3 A2++ 
2 A2+ 
1 A2 
0 A1 

B>hg log -T "{rev} {desc}\n" 
3 B2 
2 B1 
1 A2 
0 A1 

Ç狀態是相同於B

B>hg pull --rebase 
... 
B>hg log -T "{rev} {desc}\n" -G 
@ 5 B2 
| 
o 4 B1 
| 
o 3 A2++ 
| 
o 2 A2+ 
| 
o 1 A2 
| 
o 0 A1 

即衍合拉的結果是「對的遠程變化頂部的局部變化線性的歷史」,比從C

只是拉
C>hg log -T "{rev} {desc}\n" -G 
@ 5 A2++ 
| 
o 4 A2+ 
| 
| o 3 B2 
| | 
| o 2 B1 
|/ 
o 1 A2 
| 
o 0 A1 

,或者在GUI

B-repoC-repo

,爲了得到從C B,你要變基2(-s 2)到新的父5(-d 5),但短期hg rebase -b 2也將工作,將具有相同的效果

+0

'如果你想用手重新綁定(壞想法在普通)' 爲什麼這是一個壞主意? – sixtyfootersdude

+0

@sixtyfootersdude - 因爲Mercurial方式是(更多)合併分歧的歷史,違背Git風格的避免合併 –

+0

這是否意味着我應該避免'hg pull --rebase'? – sixtyfootersdude