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.
Ich bin auf das gleiche Problem gestoßen. Um genau zu sein, ich habe zwei Zweige A
und B
mit den gleichen Dateien, aber in einigen Dateien eine andere Programmierschnittstelle. Nun wurden die Methoden der Datei f
, die unabhängig von den Schnittstellenunterschieden in den beiden Zweigen ist, im Zweig B
geändert. Die Änderung ist jedoch für beide Zweige wichtig. Daher muss ich nur die Datei f
des Zweigs B
in die Datei f
des Zweigs A
zusammenführen.
Ein einfacher Befehl löste das Problem bereits für mich, wenn ich davon ausgehe, dass alle Änderungen in beiden Zweigen A
und B
festgeschrieben werden:
git checkout A
git checkout --patch B f
Der erste Befehl wechselt in den Zweig A
, in den ich die Version der Datei B
von f
einführen möchte. Mit dem zweiten Befehl wird die Datei f
mit f
von HEAD
von B
gepatcht. Sie können sogar einzelne Teile des Patches akzeptieren/verwerfen. Anstelle von B
können Sie hier ein Commit angeben, es muss nicht HEAD
sein.
Community edit : Wenn die Datei f
in B
noch nicht in A
vorhanden ist, lassen Sie die --patch
-Option aus. Andernfalls erhalten Sie eine "No Change". Botschaft.
Das 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: A Experimenteller Zweig: B (enthält file.txt, dessen Änderungen ich einklappen möchte.)
git checkout A
Erstellen Sie einen neuen Zweig basierend auf A:
git checkout -b tempAB
B in TempAB einbinden
git merge B
Kopieren Sie den sha1-Hash der Zusammenführung:
git log
commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <[email protected]>
Date: Wed Oct 3 15:13:24 2012 -0700
Merge branch 'B' into tempAB
Überprüfen Sie Ihren Arbeitszweig:
git checkout A
Überprüfen Sie Ihre fixierte Datei:
git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt
Und da solltest du es haben. Bestätigen Sie Ihr Ergebnis.
Du könntest benutzen:
git merge-file
Tipp: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html
Dies verwendet gits internes difftool . Vielleicht ein bisschen Arbeit, aber direkt.
#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.
Der folgende Befehl wird (1) die Datei des korrekten Zweigs mit master (2) vergleichen und Sie interaktiv fragen, welche Änderungen angewendet werden sollen.
git checkout --patch master
Ich fand diesen Ansatz einfach und nützlich: Wie man bestimmte Dateien aus einem anderen Zweig "zusammenführt"
Wie sich herausstellt, geben wir uns zu viel Mühe. Unser guter Freund 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 Master-Zweig hinzufügen möchten.
Bitte lesen Sie den gesamten Artikel für mehr Verständnis
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 danach begehen.
Meine Bearbeitung wurde abgelehnt. Ich füge also an, wie Sie hier mit dem Zusammenführen von Änderungen von einem entfernten Zweig umgehen.
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.
Sie können die alte Version der Datei, die Sie zusammenführen möchten, auschecken, sie unter einem anderen Namen speichern und dann mit den beiden Dateien das Merge-Tool ausführen.
z.B.
git show B:src/common/store.ts > /tmp/store.ts
(wobei B der Zweigname/Festschreiben/Tag ist)
meld src/common/store.ts /tmp/store.ts
git format-patch branch_old..branch_new datei
git bin blahblah.patch