511 Stimmen

Wie führe ich Änderungen an einer einzigen 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.

828voto

loup Punkte 7769

Ich bin auf das gleiche Problem gestoßen. Um genau zu sein, habe ich zwei Zweige A y B mit denselben Dateien, aber einer anderen Programmierschnittstelle in einigen Dateien. Jetzt sind die Methoden der Datei f die unabhängig von den Schnittstellenunterschieden in den beiden Zweigen sind, wurden im Zweig B Die Änderung ist jedoch für beide Branchen von Bedeutung. Ich muss also nur eine Datei zusammenführen f der Branche B in die Datei f der Branche A .

Ein einfacher Befehl löste das Problem bereits für mich, wenn ich davon ausgehe, dass alle Änderungen in beide Zweige übertragen werden A y B :

git checkout A

git checkout --patch B f

Der erste Befehl wechselt in die Verzweigung A in den Bereich, den ich zusammenführen möchte B die Version der Datei f . Der zweite Befehl patcht die Datei f con f de HEAD de B . Sie können sogar einzelne Teile des Patches akzeptieren/verwerfen. Anstelle von B Sie können hier jede beliebige Übergabe angeben, es muss nicht sein HEAD .

Gemeinschaft bearbeiten : Wenn die Datei f en B existiert nicht auf A noch nicht, dann lassen Sie die --patch Option. Andernfalls erhalten Sie die Meldung "Keine Änderung".

30voto

Mikael Kellgren Punkte 269

Dabei wird das interne Difftool von Git verwendet. Vielleicht ein wenig Arbeit zu tun, aber geradeaus.

#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.

22voto

eggmatters Punkte 1146

In solchen Situationen gehe ich folgendermaßen vor. Es ist ein Kunstgriff, aber für mich funktioniert er gut.

  1. Erstellen Sie einen weiteren Zweig, der auf Ihrem Arbeitszweig basiert.
  2. git pull/git merge die Revision (SHA1), die die Datei enthält, die Sie kopieren möchten. Damit werden alle Ihre Änderungen zusammengeführt, aber wir verwenden diesen Zweig nur, um die eine Datei zu kopieren.
  3. Bereinigen Sie alle Konflikte usw. und untersuchen Sie Ihre Datei.
  4. Ihren Arbeitszweig auschecken
  5. Prüfen Sie die von der Zusammenführung übertragene Datei.
  6. Setzen Sie es um.

Ich habe Parcheando ausprobiert, aber meine Situation war zu hässlich dafür. Also kurz gesagt würde es so aussehen:

Arbeitszweig: A Experimenteller Zweig: B (enthält file.txt mit den Änderungen, die ich einfügen möchte).

git checkout A

Erstellen Sie einen neuen Zweig auf der Grundlage von A:

git checkout -b tempAB

B in tempAB zusammenführen

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

Prüfen Sie Ihren Arbeitszweig:

git checkout A

Prüfen Sie Ihre korrigierte Datei:

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt

Und das war's dann auch schon. Legen Sie Ihr Ergebnis fest.

10voto

geralOE Punkte 484

Sie können es verwenden:

git merge-file

Tipp: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html

9voto

Pawel Cioch Punkte 2634

Ich fand diesen Ansatz einfach und nützlich: Wie man bestimmte Dateien aus einem anderen Zweig "zusammenführt

Es hat sich herausgestellt, dass wir uns zu sehr anstrengen. Unser guter Freund git checkout ist das richtige Werkzeug für diese Aufgabe.

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 zu unserem Master-Zweig hinzufügen wollen.

Bitte lesen Sie den ganzen Artikel, um mehr zu verstehen

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