Ich habe zwei Zweige (A und B) und möchte eine einzelne Datei aus Zweig A mit einer entsprechenden einzelnen Datei aus Zweig B zusammenführen.
git
merge
git-branch
Isuru
quelle
quelle
git diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853Antworten:
Ich bin auf das gleiche Problem gestoßen. Um genau zu sein, habe ich zwei Zweige
A
undB
mit den gleichen Dateien, aber in einigen Dateien eine andere Programmierschnittstelle. Jetzt wurden die Dateimethodenf
, die unabhängig von den Schnittstellenunterschieden in den beiden Zweigen sind, im Zweig geändertB
, aber die Änderung ist für beide Zweige wichtig. Daher muss ich nur die Dateif
der VerzweigungB
in die Dateif
der Verzweigung zusammenführenA
.Ein einfacher Befehl hat das Problem für mich bereits gelöst, wenn ich davon ausgehe, dass alle Änderungen in beiden Zweigen festgeschrieben sind
A
undB
:Der erste Befehl wechselt in den Zweig
A
, in den ich dieB
Version der Datei zusammenführen möchtef
. Der zweite Befehl patcht die Dateif
mitf
vonHEAD
vonB
. Sie können sogar einzelne Teile des Patches akzeptieren / verwerfen. Anstatt dassB
Sie hier ein Commit angeben können, muss es nicht seinHEAD
.Community bearbeiten : Wenn die Datei
f
aufB
existiert nicht aufA
noch, lassen Sie dann die--patch
Option. Andernfalls erhalten Sie eine "Keine Änderung". Botschaft.quelle
git checkout --patch B -- f
, um das zum Laufen zu bringen.a
während der interaktiven Phase drücken können , anstatty
jedes Mal zu drücken . Oder verwenden Siegit checkout B -- f
stattdessen den Befehl.Folgendes mache ich in diesen Situationen. Es ist ein Kludge, aber es funktioniert gut für mich.
Ich habe versucht zu patchen und meine Situation war zu hässlich dafür. Kurz gesagt würde es so aussehen:
Arbeitszweig: Ein experimenteller Zweig: B (enthält file.txt mit Änderungen, die ich einfügen möchte.)
Erstellen Sie einen neuen Zweig basierend auf A:
Füge B in tempAB zusammen
Kopieren Sie den sha1-Hash der Zusammenführung:
Kasse Ihrer Arbeitsstelle:
Überprüfen Sie Ihre reparierte Datei:
Und da solltest du es haben. Übernehmen Sie Ihr Ergebnis.
quelle
A
abgelenktB
. Durch das Kopieren werden diese Unterschiede überschrieben.Dies verwendet das interne Difftool von Git. Vielleicht ein bisschen Arbeit, aber einfach.
quelle
--
(leere Argumentbezeichnung) zu verdeutlichen, sagen git checkout docs: ARGUMENT DISAMBIGUATION : "Verwendengit checkout -- <pathspec>
Sie diese Option , wenn Sie diese Pfade aus dem Index auschecken möchten ." Dies liegt daran, dass Sie sowohl einen Zweig als auch eine Datei / einen Pfad mit demselben Namen haben können. In solchen Fällen fordert git standardmäßig dazu auf, den Zweig auszuchecken, anstatt Sie zu fragen, ob der Zweig oder der Pfad ausgecheckt werden soll, wenn beide vorhanden sind. Wenn--
jedoch git vorausgeht, wird stattdessen die Datei / der Pfad ausgecheckt.Ich fand diesen Ansatz einfach und nützlich: Wie man bestimmte Dateien aus einem anderen Zweig "zusammenführt"
Bitte lesen Sie den gesamten Artikel für mehr Verständnis
quelle
-p
Option in diesem Befehl verwenden. Was dann alle Teile in Ihrer Arbeitsbaumdatei überschreibt, die zuvor von dem Zweig umgeleitet wurden, von dem Sie ausgecheckt haben, bevor sich der Patch leider ändert.Du könntest benutzen:
Tipp: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
quelle
git merge-file
Mit dem folgenden Befehl (1) wird die Datei des richtigen Zweigs verglichen, und Master (2) fragt Sie interaktiv, welche Änderungen angewendet werden sollen.
Git Checkout - Patch Master
quelle
Meine Bearbeitung wurde abgelehnt, daher füge ich hier an, wie Änderungen aus einem Remote-Zweig zusammengeführt werden.
Wenn Sie dies nach einer falschen Zusammenführung tun müssen, können Sie Folgendes tun:
quelle
Angenommen, B ist der aktuelle Zweig:
Beachten Sie, dass dies nur Änderungen an der lokalen Datei betrifft. Sie müssen sich danach festlegen.
quelle
error: <file-path>: already exists in working directory
git diff Branch_A <file-path, filename> -- hash_commit > file_name.temp
Sie können die alte Version der zusammenzuführenden Datei auschecken, unter einem anderen Namen speichern und dann ausführen, was auch immer Ihr Zusammenführungstool für die beiden Dateien ist.
z.B.
git show B:src/common/store.ts > /tmp/store.ts
(wobei B der Filialname / Commit / Tag ist)meld src/common/store.ts /tmp/store.ts
quelle
Ich werde es als tun
git format-patch branch_old..branch_new file
Dadurch wird ein Patch für die Datei erstellt.
Wenden Sie den Patch auf target branch_old an
git am blahblah.patch
quelle