2009-07-03 15 views

Odpowiedz

50

OSTRZEŻENIE: takie "fikcyjne połączenie", jak zaleca się przez @Martin_Geisler, może naprawdę zepsuć, jeśli później chcesz zrobić prawdziwe scalenie dwóch gałęzi. Fałszywe scalenie zostanie zarejestrowane i powiedz, że scaliłeś się z odgałęzieniem, w którym zrobiłeś fikcyjne połączenie - nie zobaczysz zmian. Lub jeśli połączysz się z inną gałęzią, zmiany w tej innej gałęzi zostaną cofnięte.

Jeśli chcesz to skopiować cały plik z jednego oddziału do drugiego, można po prostu zrobić:

hg update -r to-branch 
    hg revert -r from-branch file 
    hg ci -m 'copied single file from from-branch to to-branch 

Jeśli chcesz wybrać różne części tego pliku, a następnie "hg record" jest przydatna.

Po prostu zrobiłem to w moim katalogu domowym .hgignore.

Jeśli obie gałęzie dokonały zmian w pliku, który chcesz zachować, brudną sztuczką byłoby utworzenie scalenia dwóch gałęzi przy użyciu hg scalania, prawdopodobnie/prawdopodobnie na jeszcze innej gałęzi, sprawdzenie tego, a następnie skopiować jeden plik pomiędzy scaleniem i odgałęzieniem do-:

hg update -r to-branch 
    branch merge-branch 
    hg merge -r from-branch 
    hg ci -m 'temp merge to be discarded" 
    hg update -r to-branch 
    hg revert -r merge-branch single-file 
    hg ci -m 'merged single-file from from-branch to to-branch" 
    hg strip merge-branch 

warto wspomnieć: droga do „skopiowania pojedynczego pliku między oddziałami” (lub wersje, lub od zmiany scalić, albo ... .) to "hg revert". To znaczy.

hg update -r Where-you-want-to-copy-to 
    hg revert -r Where-you-want-to-copy-from file-you-want-to-copy 
    ... 
    hg ci 

z jakiegoś powodu, a niektóre z moich współpracowników, że ta BARDZO mylące. "revert" == "copy" ... ma sens w przypadku niektórych wzorców użycia, ale nie wszystkie.

+2

To powinno być zaakceptowaną odpowiedzią zamiast ten, który podarował Martin Geisler, chociaż nie będzie to rzeczywiście plik, kopiowanie go jest tym, co chce się zrobić przez większość czasu i nie zepsuje gałęzi. – noamik

+2

To zadziałało świetnie, ponieważ przynosi pojedynczy plik z oddziału do Jedną z rzeczy, które zauważam jest to, że checkin do bagażnika nie pojawia się w historii pliku, co jest niefortunne –

+0

Witam i dziękuję za odpowiedź Mam problem, jednak w mojej sytuacji mój gałąź źródłowa zawiera plik, który nie istnieje w mojej domyślnej gałęzi, ale chcę go skopiować bez scalania reszty gałęzi. Kiedy próbuję zrobić to, co opisałeś, otrzymuję "brak takiego pliku w wersji" Jakieś sugestie? – propagated

18

Nie. Mercurial działa na podstawie zestawu zmian.

Ale można wykonać "dummy merge", w którym ignorowane są przychodzące zmiany z jednej z gałęzi. Przed zatwierdzeniem możesz przywrócić wybrane pliki do dowolnego stanu:

% HGMERGE=internal:local hg merge  # keep my files 
% hg revert --rev other-branch a.txt # update a.txt to other branch 
% hg commit -m 'Dummy merge to pick a.txt from other-branch.' 

Może to ci trochę pomoże.

+2

UWAGA: taki „manekin seryjnej” może naprawdę bałagan cię , jeśli później chcesz zrobić prawdziwe scalenie dwóch gałęzi. Fałszywe scalenie zostanie zarejestrowane i powiedz, że scaliłeś się z odgałęzieniem, w którym zrobiłeś fikcyjne połączenie - nie zobaczysz zmian. Lub jeśli połączysz się z inną gałęzią, zmiany w tej innej gałęzi zostaną cofnięte. // Jeśli chcesz skopiować cały plik z jednej gałęzi do drugiej, możesz po prostu "hg update -r to-branch; hg revert -r file" // jeśli chcesz wybrać różne części tego pliku , a następnie "rekord hg" jest przydatny. // Właśnie zrobiłem to w moim katalogu domowym .hgignore. –

+0

Brudna sztuczka polegałaby na utworzeniu scalenia dwóch gałęzi przy użyciu hg merge, sprawdzeniu tego, a następnie skopiowaniu pojedynczego pliku pomiędzy scaleniem a gałęzią przy użyciu "hg update -t ​​to-branch; branch merge-branch" ; hg fge -r z oddziału; hg ci -m 'temp merge do odrzucenia "; aktualizacja hg -r do oddziału; hg revert -r scal-branch pojedynczy-plik-u-chcesz; hg ci -m 'scalony pojedynczy plik z oddziału do oddziału "; hg strip scalony-branch. –

+1

Oh, cholera, równie dobrze mogę uczynić moje komentarze prawdziwą odpowiedzią. –

1

Po prostu użyję zewnętrznego narzędzia, takiego jak vimdiff, aby odróżnić dwa pliki, które chcę scalić, a następnie scalić je. Zaletą tego jest możliwość selektywnej edycji części pliku. Np:

hg update -r branch-merging-to 
hg extdiff -p vimdiff -r branch-merging-from file-I-am-merging 

Do tego trzeba włączyć zewnętrznych narzędzi w .hgrc, co oznacza po prostu dodając te wiersze zrobić:

[extensions] 
hgext.extdiff = 
Powiązane problemy