2013-06-07 9 views
6

Angenommen, ich habe ein Projekt auf MASTER-Zweig mit 100s von PHP-Dateien. Um ein Bugfixing in dem Projekt zu tun, erstelle ich einen eigenen Zweigwie bestimmte Dateien in git zusammenführen

git checkout -b bugfix 

Dann, nachdem der Fehler in 3 Dateien Fixierung (für zB index.php, register.php und login.php), i verschmelzen sie in der Master-Zweig

git checkout master 
git merge bugfix 

Der obige Code alle drei Dateien zusammenführen werde ich Änderungen vorgenommen haben, aber ist es trotzdem, dass ich GIT zwingen kann, nur zwei Dateien zusammenführen, sagen login.php und register.php nur?

+1

Ich denke, ein Weg wäre, diese beiden Dateien in einem Commit und der letzte in den anderen zu committen, ich denke, Sie können eine Festschreibung angeben und nur diese zusammenführen. – dutt

+0

@dutt Das OP-Problem ist, dass die Dateiänderungen bereits festgeschrieben sind, nehme ich an. – arkascha

+0

Vielleicht kann dies helfen, einen Weg zu finden http://stackoverflow.com/questions/449541/how-do-you-merge-selective-files-with-git-merge – hellectronic

Antwort

0

Es gibt keine Möglichkeit, eine partielle Zusammenführung in Git aufzuzeichnen, alle Zusammenführungen müssen die gesamten Stammbäume aller Commits zusammenführen, die zusammengeführt werden.

Sie können diese Zusammenführung natürlich aufheben, indem Sie die unveränderte Kopie eines der Dateien von einem der Eltern auswählen, aber dies ist immer noch eine "vollständige" Zusammenführung und die Änderungen in dieser Datei werden als zusammengeführt betrachtet wenn es um Folgestützpunkte oder Zusammenschlüsse zwischen den beteiligten Zweigen geht.

0

Nein, es gibt keinen direkten Weg. Obwohl; Sie können die Dateien aus der Verzweigung, die Sie zusammenführen möchten, auswählen und sie im Master-Zweig überschreiben. Die Befehle, um wie folgt festgesetzt:

git checkout master 
git show bugfix:login.php > login.php 
git show bugfix:register.php > register.php 
git add . 
git commit -m "Select login and register from branch/bugfix" 

Ok, das obige Verfahren wird Dateihistorie "zerstören". Es gibt eine alte Diskussion über dasselbe in this mailing list.

Aus technischen Sicht ist die Sache, die Geschichte Materie macht (und warum „Satz von Commits in chronologischer Reihenfolge“ ist nutzlos), weil es uns ein gemeinsamer Vorfahr gibt! Und , dass ist das einzige, was zählt.

Nun, was ist grundsätzlich falsch mit Pro-Datei Geschichte?

Nun, wenn Sie dieses Argument gefolgt sind, sollten Sie gehen "Aaahh! Offensichtlich!".

Ignorieren einer ganzen Reihe von Absätzen; Sie werden die Problemumgehung finden:

git diff commit..othercommit filename | git-apply --index && git commit 

In Ihrem Fall commit = hash von Ihnen HEAD/Master-Zweig; und othercommit = Hash der Bugfix-Verzweigung.

+0

Der Zweig wird nicht in "Master" zusammengeführt. – axiac

3

Die folgende Lösung von a blog post

angenommen wird Es stellte sich heraus, dass der Kasse auch in dieser Sache hilfreich sein können. Sie können einfach mit Zusatzinformationen (Kasse) die spezifischen Dateien von einem anderen Zweig:

# switch to the branch you want to be your merge destination 
git checkout master 

# checkout specific files from specific branch 
git checkout bugfix login.php register.php 

# check the status 
git status 

# merge them in 
git commit -m "your merge comment" 
+0

Der Zweig wird nicht in "Master" zusammengeführt. – axiac

+1

@axiac Wenn Sie die Frage sorgfältig lesen, werden Sie feststellen, dass die Frage nicht darin besteht, eine Verzweigung zu verschmelzen, sondern eine Datei zu verschmelzen (was eine falsche Terminologie ist, um eine bestimmte Datei aus einer anderen Verzweigung in die gewünschte Verzweigung zu bringen). Die obige Lösung funktioniert –

0

Sie können das Verhalten Sie simulieren, aber was passiert mit den Änderungen, die Sie auf der dritten Datei getan hat?

Die Änderungen an der dritten Datei bleiben in den Commits auf der Verzweigung, aber sie werden nicht in der zusammengeführten Festschreibung vorhanden sein, es ist, als ob die Datei überhaupt nicht auf der Verzweigung geändert wurde.

Dies ist, wie Sie es tun können:

git checkout master 
git merge bugfix --no-commit 

Die --no-commit Option git die Dateien zu verschmelzen sagt aber vor der Festlegung der sie zu stoppen. Sie können nun die Dateien einsehen, ändern, tun, was Sie wollen. Um die Änderungen zu verwerfen Sie auf index.php haben können Sie laufen:

git checkout master -- index.php 

git status Laufen können Sie sehen, dass index.php nicht so modifiziert erscheint mehr (weder im Index oder in der Arbeitsbaum). Sie können jetzt git commit und das ist alles.

+0

Diese Lösung ist wie alle Dateien ändern und dann versuchen, das Chaos manuell zu beheben !! lies [diesen Beitrag] (http://jasonrudolph.com/blog/2009/02/25/git-tip-how-to-merge-specific-files-from-another-branch/), um herauszufinden, worum es in diesem Stapel geht und warum Ihre Lösung Zeitverschwendung und Arbeitsaufwand ist. –

Verwandte Themen