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 diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
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 diff branch_name > patch
git apply patch
. stackoverflow.com/a/9473543/1091853
Antworten:
Ich bin auf das gleiche Problem gestoßen. Um genau zu sein, habe ich zwei Zweige A
und B
mit den gleichen Dateien, aber in einigen Dateien eine andere Programmierschnittstelle. Jetzt wurden die Dateimethoden f
, die unabhängig von den Schnittstellenunterschieden in den beiden Zweigen sind, im Zweig geändert B
, aber die Änderung ist für beide Zweige wichtig. Daher muss ich nur die Datei f
der Verzweigung B
in die Datei f
der Verzweigung zusammenführen A
.
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
und B
:
git checkout A
git checkout --patch B f
Der erste Befehl wechselt in den Zweig A
, in den ich die B
Version der Datei zusammenführen möchte f
. Der zweite Befehl patcht die Datei f
mit f
von HEAD
von B
. Sie können sogar einzelne Teile des Patches akzeptieren / verwerfen. Anstatt dass B
Sie hier ein Commit angeben können, muss es nicht sein HEAD
.
Community bearbeiten : Wenn die Datei f
auf B
existiert nicht auf A
noch, lassen Sie dann die --patch
Option. Andernfalls erhalten Sie eine "Keine Änderung". Botschaft.
git checkout --patch B -- f
, um das zum Laufen zu bringen.
a
während der interaktiven Phase drücken können , anstatt y
jedes Mal zu drücken . Oder verwenden Sie git 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.)
git checkout A
Erstellen Sie einen neuen Zweig basierend auf A:
git checkout -b tempAB
Füge B in tempAB zusammen
git merge B
Kopieren Sie den sha1-Hash der Zusammenführung:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Kasse Ihrer Arbeitsstelle:
git checkout A
Überprüfen Sie Ihre reparierte Datei:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Und da solltest du es haben. Übernehmen Sie Ihr Ergebnis.
A
abgelenkt B
. Durch das Kopieren werden diese Unterschiede überschrieben.
Dies verwendet das interne Difftool von Git. Vielleicht ein bisschen Arbeit, aber einfach.
#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file>
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file>
#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool
#Save the file in difftool and you should be done.
--
(leere Argumentbezeichnung) zu verdeutlichen, sagen git checkout docs: ARGUMENT DISAMBIGUATION : "Verwenden git 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"
Wie sich herausstellt, versuchen wir es zu sehr. Unsere gute Freundin Git Checkout ist das richtige Werkzeug für den Job.
git checkout source_branch <paths>...
Wir können git checkout einfach den Namen des Feature-Zweigs A und die Pfade zu den spezifischen Dateien geben, die wir unserem Hauptzweig hinzufügen möchten.
Bitte lesen Sie den gesamten Artikel für mehr Verständnis
-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:
git merge-file
Tipp: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
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
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:
# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>
# Get remote updates but DONT auto merge it
git fetch github
# Checkout to your mainline so your branch is correct.
git checkout develop
# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop
# Apply your patches
git checkout --patch github/develop path/to/file
...
# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff
# You'll probably have to
git push -f # make sure you know what you're doing.
Angenommen, B ist der aktuelle Zweig:
$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R
Beachten Sie, dass dies nur Änderungen an der lokalen Datei betrifft. Sie müssen sich danach festlegen.
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
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