54 Stimmen

Mercurial: Zusammenführen einer Datei zwischen Zweigen in einem Repo

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

Ist es möglich, nur bestimmte Dateien zusammenzuführen, anstatt den gesamten Änderungssatz?

62voto

Krazy Glew Punkte 6728

WARNUNG: Eine solche "Dummy-Zusammenführung", wie sie empfohlen von @Martin_Geisler Das kann einen ganz schön durcheinander bringen, wenn man später die beiden Zweige wirklich zusammenführen will. Die Scheinzusammenführung wird aufgezeichnet, und wenn Sie in den Zweig zusammenführen, in dem Sie die Scheinzusammenführung durchgeführt haben, werden Sie die Änderungen nicht sehen. Oder wenn Sie in den anderen Zweig zusammenführen, werden die Änderungen in diesem anderen Zweig rückgängig gemacht.

Wenn Sie nur eine ganze Datei von einem Zweig in einen anderen kopieren wollen, können Sie dies 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 dies gerade in meinem Heimatverzeichnis .hgignore getan.

Wenn beide Zweige Änderungen an einer Datei vorgenommen haben, die Sie beibehalten wollen, wäre ein schmutziger Trick, einen Zusammenschluss der beiden Zweige mit hg merge zu erstellen, möglicherweise/möglicherweise auf einem anderen Zweig, diesen einzuchecken und dann eine einzelne Datei zwischen dem Zusammenschluss und dem Zielzweig zu kopieren:

   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 (oder Revisionen, oder von Revision zu Merge, oder....) zu kopieren, ist "hg revert". D.h..

   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 finden ich und einige meiner Kollegen diese SEHR verwirrend. "revert"=="copy" ... macht für einige Verwendungsmuster Sinn, aber nicht für alle.

19voto

Martin Geisler Punkte 71257

Nö. Mercurial arbeitet auf der Basis von Changesets.

Aber Sie können eine " Scheinzusammenführung ", bei dem Sie die eingehenden Änderungen aus einem der Zweige ignorieren. Vor der Übergabe können Sie dann ausgewählte 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 wenig.

2voto

StayOnTarget Punkte 9596

Eine ziemlich saubere Methode, um das gewünschte Ergebnis zu erzielen, besteht darin, in zwei Schritten vorzugehen: Zuerst verwenden Sie graft , dann zweite Verwendung histedit .

Angenommen, dies ist der Ausgangspunkt und Sie müssen einige Teile von C y D zu "verschmelzen" nach E :

A---B---C---D
      \
       -E

Dann würden Sie veredeln C y D auf der Spitze von E :

A---B---C---D
      \
       -E--C'--D'

Dann verwenden Sie hg histedit a bearbeiten C' y D' . Während der Bearbeitung können Sie alle gewünschten Änderungen vornehmen, aber in diesem Fall würden Sie einfach alle unerwünschten Dateien (oder sogar Teile davon) rückgängig machen.

(Beachten Sie, dass histedit edit aktualisiert Ihren Arbeitsordner vorübergehend so, dass er mit dem Inhalt des angegebenen Änderungssatzes übereinstimmt, als ob dieser noch nicht übertragen worden wäre. Sie können also einfach unerwünschte Dateien zurücksetzen und dann hg histedit --continue was den bearbeiteten Änderungssatz effektiv ersetzt).

Das Endergebnis würde also lauten:

A---B---C---D
      \
       -E--C''--D''

Wo die '' Die Überarbeitungen wurden wie erforderlich geändert.

Ich würde sagen, dass dieser Ansatz vorteilhafter ist, wenn Sie große Änderungssätze haben, die wahrscheinlich von vornherein aus mehreren kleineren Commits hätten bestehen sollen; dieser Ansatz ermöglicht es Ihnen, nur die Teile zu "entwirren", die Sie benötigen. Für eine einzelne Datei wäre dies in Ordnung, könnte aber zu viel sein.

1voto

Toby Searle Punkte 31

Ich würde einfach ein externes Tool verwenden wie vimdiff um die beiden Dateien, die ich zusammenführen möchte, zu vergleichen 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 Werkzeuge in Ihrer .hgrc aktivieren, d.h. Sie müssen nur diese Zeilen hinzufügen:

[extensions]
hgext.extdiff =

0voto

Raja Voora Punkte 1

Wenn Sie eine IDE verwenden:

  1. Zusammenführen des alten Zweigs mit dem neuen Zweig
  2. Gehen Sie in die IDE und entfernen Sie die unerwünschten Änderungen
  3. Erzeugen Sie die Diff-Datei
  4. Aktualisierung und Bereinigung des neuen Zweigs
  5. Anwenden des Diffs auf den neuen Zweig

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X