2016-03-29 8 views
2

Ich habe eine Textdatei festgeschrieben und an den Master-Zweig geschoben. Mein Kollege hat einen eigenen Zweig vom Meisterzweig gemacht und einige Änderungen in der Datei vorgenommen - er hat eine Überarbeitung des Textes vorgenommen. Die Änderungen werden in einem einzigen Commit und in einer einzigen Datei vorgenommen.Verschmelzen nur ausgewählte Änderungen in Git

Jetzt möchte ich einige seiner Änderungen in der ursprünglichen Datei im Master-Zweig zusammenführen. Aber! Ich möchte nicht alles akzeptieren, nur einige der Änderungen.

Die Änderungen werden in verschiedenen Zeilen derselben Datei vorgenommen: einige Zeilen wurden geändert, einige hinzugefügt, einige in der Revision entfernt. Wie kann ich das erreichen?

Wenn ich den Git richtig verstehe, wird eine einfache Zusammenführung des Revisionszweigs zum Master keine Konflikte erkennen, da ich keine Änderungen im Master-Zweig vorgenommen habe. Die Zusammenführung würde auch alle Änderungen anwenden, die in der Verzweigung/dem Commit vorgenommen wurden. Ich möchte jedoch nur Änderungen anwenden, die online vorgenommen wurden (sagen wir mal) # 20, 50, 69. Ich möchte die anderen Änderungen ignorieren, da ich ihnen nicht zustimme.

Wie mache ich den Git zu Konflikten auf allen geänderten Dateien, damit ich auswählen kann, wenn ich die Änderung akzeptieren möchte? Ich brauche einen interaktiven Weg.

Zum Beispiel ist es in MS Word möglich, die Änderungen zu verfolgen. Dann kann jede der Änderungen akzeptiert werden (die neue Version wird übernommen und die ältere entfernt) oder zurückgewiesen (die alte Version wird beibehalten und die Änderung wird verworfen). Dann wird die Änderung nicht mehr hervorgehoben.

Ich benutze TortoiseGit Anwendung auf MS Windows 10, läuft auf Git Version 1.9.5.msysgit.1. Wenn es also einen Weg gibt, den Client zu verwenden, würde ich es bevorzugen.

+0

Mögliches Duplikat von [Wie verschmelzen Sie ausgewählte Dateien mit git-merge?] (Http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge) –

Antwort

0

Wie mache ich git ... kann ich wählen, wenn ich die Änderung akzeptieren möchte?

git merge --no-commit 

wird dies tun - die docs sagen:

... die Zusammenführung durchführen, aber die Zusammenführung fehlgeschlagen vorgeben und Autocommit nicht, dem Benutzer die Möglichkeit zu geben, zu prüfen und weiter zwicken das Zusammenführungsergebnis vor dem Festschreiben.

was tun wird, was verlangt.

Es kann jedoch nicht sein, was Sie wollen. Das Ergebnis wird dieser Zustand sein:

B  <sharg 
/\ 
A---B'--C' <master 
\ /
    C --/ <coworker 

wo C' nicht wirklich alle Änderungen in C enthalten, aber man kann es nicht wieder zusammenführen, weil Sie git log. Ist das in Ordnung?

+0

Ich fürchte, das würde nach der Zusammenführung viele manuelle Korrekturen und Bearbeitungen bedeuten. Ich würde einen Weg bevorzugen, über jede Änderung interaktiv zu entscheiden, wenn ich meine Version oder die Mitarbeiter behalten möchte. Wichtig ist, dass die Änderungen in Zeilen derselben Datei und nicht in verschiedenen Dateien vorgenommen werden. – Sharg

+0

Sobald Sie die nicht festgeschriebene Änderung haben, können Sie 'git add -p' verwenden, um Sie aufzufordern, welche Version jedes Broads (und ggf. Zeile) zu behalten, oder verwenden Sie Ihre bevorzugte (vielleicht grafische) mergetool. – Useless

+0

Eigentlich hat dieser Ansatz genau das gemacht, was ich brauchte. Ich hatte den Mitarbeiter-Zweig ohne Commit ('--no-commit') in mine eingebunden und benutzte _diff mit der vorherigen Version_. Ich habe die Änderungen mit der Möglichkeit erhalten, den aktuellen Arbeitsbaum zu bearbeiten. Ich habe die Änderungen so gemacht, wie ich es brauchte, und dann habe ich es getan und getan. Vielen Dank für Ihren Vorschlag. – Sharg

2

Hier ist etwas, das für mich arbeitete; unter der Annahme, dass die Änderungen, die Sie sind auf der testbranch Zweig importieren möchten (und vorausgesetzt, die Datei, die Sie arbeiten auf wollen, ist README):

  • Start in der master Zweig:

    $ git checkout master 
    
  • Verwenden Sie die --patch Argument git checkout in den Änderungen zu bringen aus dem anderen Zweig:

    $ git checkout --patch testbranch README 
    

    Dies wird die gleiche Schnittstelle wie git add -p, die können Sie selektiv akzeptieren oder überspringen Brocken.

+0

Dieser Vorschlag macht Sinn. Ich werde mit dem Patch experimentieren. – Sharg

1

Unter der Annahme, sprachen über eine einzige begehen, müssen Sie die commit das ist eingereicht worden nehmen, uncommit, und dann interaktive Bespielung verwenden selektiv zu wählen, welche Änderungen Sie annehmen. Also zuerst gehen und ihre Änderungen zusammenführen. Dann ...

git reset HEAD^ 
git add --interactive 

Dies wird Sie in ein Menüsystem treten. Geben Sie "5" ein und drücken Sie die Eingabetaste, dies öffnet den Patch-Vorgang. Die Dateien, die geändert wurden, werden in einer nummerierten Liste angezeigt. Geben Sie die Zahlen ein, die Sie für die Annahme berücksichtigen möchten. Also sagen wir, es gibt 5 Dateien und Sie wollen 1, 2, 3 und 5. Sie können es Komma getrennt eingeben oder 1-3,5 tun. Sobald Sie die Dateinummern eingegeben haben, drücken Sie Enter. Über die Benutzeroberfläche können Sie überprüfen, ob Sie weitere Dateien hinzufügen möchten. Geben Sie zusätzliche Zahlen ein. Wenn Sie mit der Überprüfung der Änderungen beginnen möchten, lassen Sie die Zeile leer und drücken Sie die Eingabetaste.

Jetzt wird es Sie durch jeden "Brocken" der Änderungen gehen, die git finden kann. Geben Sie "h" ein, um die Liste der Befehle anzuzeigen. "y" bedeutet, dass Sie eine Änderung akzeptieren, "n" bedeutet, dass Sie keine Änderung akzeptieren. Wenn ein großer Teil der Änderungen zu groß ist, können Sie versuchen, ihn mit dem Befehl "s" in kleinere Hunks zu zerlegen - das kann aber nur so viel bewirken.

Sobald Sie alle Dateien durchgegangen sind, werden Sie wieder im Menüsystem sein. Geben Sie "q" ein und drücken Sie die Eingabetaste. Verwenden Sie git status, um zu überprüfen, was inszeniert wurde.

Jetzt können Sie die Änderungen bestätigen und wissen, dass nur die von Ihnen akzeptierten Teile enthalten sind.