version-control tag Mercurial: Zusammenführen einer Datei zwischen Zweigen in einem Repo



source tree create tag (3)

Wenn ich zwei Zweige in Hg-Repo habe, wie kann ich nur eine Datei mit einem anderen Zweig zusammenführen, ohne dass alle anderen Dateien aus Changeset zusammengeführt werden?

Ist es möglich, nur bestimmte Dateien anstelle von ganzen Changesets zusammenzuführen?


WARNUNG: Eine solche "Scheinzusammenführung", wie von @Martin_Geisler empfohlen, kann Sie wirklich vermasseln, wenn Sie später eine echte Zusammenführung der beiden Zweige durchführen möchten. Die Dummy-Zusammenführung wird aufgezeichnet und sagt, dass Sie in dem Zweig zusammenführen, zu dem Sie die Dummy-Zusammenführung durchgeführt haben. Die Änderungen werden nicht angezeigt. Wenn Sie den anderen Zweig zusammenführen, werden die Änderungen in diesem anderen Zweig rückgängig gemacht.

Wenn Sie lediglich eine gesamte Datei von einem Zweig in einen anderen kopieren möchten, können Sie einfach Folgendes 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 andere Teile dieser Datei auswählen möchten, ist "hg record" hilfreich.

Ich habe das gerade in meinem Heimatverzeichnis .hgignore gemacht.

Wenn beide Zweige Änderungen an einer Datei vorgenommen haben, die Sie behalten möchten, besteht ein Trick darin, eine Zusammenführung der beiden Zweige mithilfe von hg merge zu erstellen, möglicherweise / wahrscheinlich noch eines anderen Zweigs, das einchecken und dann eine einzelne Datei kopieren zwischen dem Zusammenführen 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: Der Weg, "eine einzelne Datei zwischen Zweigen zu kopieren" (oder Revisionen oder von Revision zu Zusammenführung oder ...) ist "hg revert". Ie

   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 finde ich und einige meiner Kollegen das SEHR verwirrend. "revert" == "copy" ... ist für einige Verwendungsmuster sinnvoll, aber nicht für alle.


Ich würde nur ein externes Tool wie vimdiff um die beiden Dateien, die ich zusammenführen möchte, zu unterscheiden und sie dann zusammenzuführen. Dies hat den Vorteil, dass Sie Teile der Datei selektiv bearbeiten können. Z.B:

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

Dazu müssen Sie die externen Tools in Ihrer .hgrc aktivieren. Dies bedeutet lediglich das Hinzufügen folgender Zeilen:

[extensions]
hgext.extdiff =  

Nee. Mercurial arbeitet auf Änderungsbasis.

Sie können jedoch eine " Scheinzusammenführung " durchführen, bei der Sie die ankommenden Änderungen von einem der Zweige ignorieren. Bevor Sie ein Commit ausführen, können Sie die ausgewählten Dateien in den gewünschten Zustand zurücksetzen:

% 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 dir das ein bisschen.





branching-and-merging