2009-07-03 6 views

Antwort

50

ACHTUNG: solch ein "Dummy merge", wie es von @Martin_Geisler empfohlen wird, kann Sie wirklich durcheinander bringen, wenn Sie später eine echte Zusammenführung der beiden Zweige machen wollen. Die Dummy-Zusammenführung wird aufgezeichnet, und Sie sagen, dass Sie in die Verzweigung zusammengeführt werden, in der Sie die Dummy-Zusammenführung durchgeführt haben - Sie werden die Änderungen nicht sehen. Oder wenn Sie in den anderen Zweig einmünden, werden die Änderungen in diesem anderen Zweig rückgängig gemacht.

Wenn alles, was Sie wollen, ist eine ganze Datei von einem Ast zum anderen zu kopieren, können Sie einfach tun:

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

Wenn Sie verschiedene Teile der Datei auswählen möchten, dann "hg record" nützlich ist.

Ich habe gerade dies auf meinem Home-Verzeichnis. Hgignore.

Wenn beide Zweige Änderungen an einer Datei vorgenommen haben, die Sie beibehalten möchten, wäre es ein schmutziger Trick, eine Zusammenführung der beiden Zweige mit Hilfe von hg merge zu erstellen, möglicherweise/noch in einem anderen Zweig, und dann kopieren eine einzelne Datei zwischen der Zusammenführung und dem zu Zweig:

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 

Es ist erwähnenswert: die Möglichkeit, „eine einzelne Datei zwischen Zweigen kopieren“ (oder Revisionen oder von Revision zu fusionieren, oder ... .) ist "hg zurück". I.e.

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 

Aus irgendeinem Grund, den ich und einige meiner Kollegen, finden diese SEHR verwirrend. "revert" == "copy" ... ist sinnvoll für einige Verwendungsmuster, aber nicht für alle.

+2

Dies sollte die akzeptierte Antwort sein statt Der eine Martin Geisler gab, obwohl es die Datei nicht wirklich zusammenführen wird, kopiert man es die meiste Zeit und es wird den Zweig nicht durcheinander bringen. – noamik

+2

Das funktionierte großartig, um eine einzelne Datei von einem Zweig zu bringen Ich merke jedoch, dass das Einchecken in den Kofferraum anscheinend nicht in der Historie der Datei auftaucht, was bedauerlich ist. –

+0

Hallo und danke für deine Antwort. Ich habe jedoch Probleme, in meiner Situation meine Quellzweig enthält eine Datei, die nicht in meinem Standardzweig vorhanden ist, aber ich möchte es zurückkopieren, ohne den Rest des Zweiges zu verschmelzen.Wenn ich versuche, das zu tun, was Sie beschrieben, bekomme ich 'keine solche Datei in rev' Irgendwelche Vorschläge? – propagated

18

Nein. Mercurial arbeitet auf Changeset-Basis.

Aber Sie können eine "dummy merge" tun, wo Sie die eingehenden Änderungen von einem der Zweige ignorieren. Vor dem Festschreiben können Sie dann die ausgewählten Dateien in den gewünschten Zustand zurückversetzen:

% 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.' 

Vielleicht hilft Ihnen das ein bisschen.

+2

WARNUNG: Eine solche „Dummy-merge“ kann man wirklich vermasseln , wenn Sie später eine echte Zusammenführung der beiden Zweige vornehmen möchten. Die Dummy-Zusammenführung wird aufgezeichnet, und Sie sagen, dass Sie in die Verzweigung zusammengeführt werden, in der Sie die Dummy-Zusammenführung durchgeführt haben - Sie werden die Änderungen nicht sehen. Oder wenn Sie in den anderen Zweig einmünden, werden die Änderungen in diesem anderen Zweig rückgängig gemacht. // Wenn Sie nur eine ganze Datei von einem Zweig in einen anderen kopieren möchten, können Sie einfach "hg update -r to-branch; hg revert -r-Datei" // wenn Sie verschiedene Teile dieser Datei auswählen möchten , dann ist "hg record" nützlich. // Ich habe das gerade in meinem Home-Verzeichnis .hgignore gemacht. –

+0

Ein schmutziger Trick wäre es, eine Zusammenführung der beiden Zweige mit Hilfe von hg merge zu erstellen, dies zu überprüfen und dann eine einzelne Datei zwischen der Zusammenführung und der Verzweigung mit "hg update -t ​​zu branch; branch merge-branch" zu kopieren ; hg merge -r from-branch; hg ci -m 'temp merge wird verworfen "; hg update -r zum Zweig; hg Reverse -r Merge-Zweig Single-File-U-wollen; hg ci -m 'fusionierte einzelne Datei von from-branch nach to-branch "; hg strip merge-branch. –

+1

Oh, hey, ich könnte auch meine Kommentare zu einer richtigen Antwort machen. –

1

Ich würde nur ein externes Tool wie vimdiff verwenden, um die zwei Dateien zu verschmelzen, die ich zusammenführen und dann zusammenführen möchte. Der Vorteil besteht darin, dass Sie Teile der Datei selektiv bearbeiten können. ZB:

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

Um dies zu tun, um die externen Tools in Ihrem .hgrc aktivieren müssen, die nur das Hinzufügen bedeutet diese Zeilen:

[extensions] 
hgext.extdiff =