it-swarm.com.de

Wie füge ich Änderungen in einer einzelnen Datei zusammen, anstatt Commits zusammenzuführen?

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.

296
Isuru

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.

493
loup

Das mache ich in diesen Situationen. Es ist ein kludge, aber es funktioniert gut für mich. 

  1. Erstellen Sie einen weiteren Zweig, der auf Ihrem Arbeitszweig basiert.
  2. git pull/git fügt die Revision (SHA1) zusammen, die die zu kopierende Datei enthält. Dadurch werden alle Ihre Änderungen zusammengeführt, aber wir verwenden diesen Zweig nur, um die eine Datei zu packen.
  3. Beheben Sie Konflikte usw., um Ihre Datei zu untersuchen. 
  4. checken sie ihren arbeitszweig
  5. Überprüfen Sie die Datei, die Sie in Ihrer Zusammenführung festgelegt haben.
  6. Commit it.

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. 

13
eggmatters
8
geralOE

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.
8
Mikael Kellgren

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 

2
user1854182

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

2
Pawel Cioch

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.

1
jbirkel

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.
0
Soup

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

0
Salami

Ich werde es als tun

git format-patch branch_old..branch_new datei

dadurch wird ein Patch für die Datei erstellt.

Wenden Sie den Patch am Ziel branch_old an

git bin blahblah.patch

0
Noob