Mit GIT, wie kann ich selektiv Zusammenführen der änderungen von einem commit-auf einem anderen 'Gabel'?
Nehmen Sie dieses Szenario:
- Ich beschließe, die 'Gabel' codebase auf github.com und starten tut meiner routine: Bearbeiten - Commit - Push; aka hack hack hack.
- Nachdem ich einige änderungen vorgenommen, die ich einige änderungen, die eine andere person gemacht hat, die am gleichen Projekt, und ich mag Sie!
- Ich entscheiden, ich will führen Sie Sie in meine. Problem ist, ich will nur ein 'Teil' einer bestimmten verpflichten, aus mehreren commits, die er gemacht hat.
Was wäre die effizienteste Methode, diese wählen Sie die Menge der änderungen, zusammengeführt in mein 'Gabel'?
- Möglich, Duplikat der Wie selektiv zusammenzuführen oder wählen Sie die änderungen aus einem anderen branch in Git?
- Mögliche Duplikate von Teilweise cherry-picking ein commit mit Git
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach dem Trollen die Wogen der IRC-Welt, hat jemand eine tolle Lösung:
Hoffentlich hilft jemand anderes mit der gleichen Frage!
EDIT: OK, vielleicht ist es nicht ganz so einfach. Hier sind die vollständigen Schritte:
Müssen Sie sich in Ihrem repository haben, die notwendigen
cd
-ing zu bekommen, in Ihr Arbeitsverzeichnis.Nun müssen Sie fügen Sie den remote-branch, und dann Holen Sie es. Tun Sie dies durch:
git remote add someUser git://github.com/someUser/someRepo.git
git fetch someUser
Nun können Sie Befehle ausführen, wie
git log someUser/master
zu finden, die commit-SHA1, die Sie Zusammenführen möchten, die in 'teilweise'.Sobald Sie die SHA, Sie können jetzt starten:
git cherry-pick -n SHA1
wo
SHA1
ist die commit-SHA, duh!Dort womöglich zu Konflikten, je nachdem, wie alt das Begehen ist, und wie oft, dass insbesondere der Bereich des Projekts ändert. Sorry, aber Sie müssen manuell beheben diese mit Ihrem treuen editor. So ziehen Sie aus VIM, oder was auch immer Sie verwenden, und hacken auf die Konflikte, bis Sie auf die Bühne, wo Sie mit den änderungen.
Haben Sie jetzt auf den index zurücksetzen, um die HEAD-revision ist, dann können Sie dann mit den treuen GIT
add --patch
Befehl zu wählen, und wählen, welche änderungen Sie wollen:git reset HEAD
git add --patch
odergit add -p
Yay! Commit-Zeitpunkt:
git commit -m "I merged a select amount of changes"
Aufräumen (Das Zeug, Sie sagte nicht, um in
git add --patch
) und behalten nur die ausgewählten änderungen in Ihren Arbeits-repository ausführen:git reset --hard HEAD
Offenbar
git checkout -f
ist eine weitere option.git add -p
; es ist extrem mächtig. Wenn Sie bereits den commit in Frage (z.B. nicht--no-commit
auf dem cherry-pick, oder es ist einer deiner commits), die Sie verwenden könnengit reset HEAD^
Zurückspulen der index einen commit zurück, dann fügen Sie die änderungen wieder mitgit add -p
Begehung in Schritten. Wenn der commit nicht an dem ast, Tipp, können Siegit rebase -i
und wählen Sie Bearbeiten die ein commit in Frage.-n
in Schritt 4. Wie diese:git cherry-pick SHA1
git remote add <user> <fork-url>
- dann können Siegit cherry-pick
normal.Ich bin mir nicht klar, was Sie wollen. Wenn Sie wollen, um in nur bestimmte übertragungen aus den anderen Gabeln, die Sie verwenden können
git cherry-pick SHA
. Vollständige Erläuterung auf gitready.Ich mag Tim ' s Lösung, aber manchmal mag ich basteln in vimdiff. Meine Lösung für dieses problem ist grob, aber es funktioniert für mich, weil ich wie vim.
Habe ich vimdiff als set meine difftool, und dann selektiv zusammenzuführen I diff Branche:
Dann gehe ich in den Bereich mit den current-Zweig, die version und das original Bearbeiten in vim (manchmal ist das nicht notwendig, aber manchmal "vimdiff" betrachten, öffnet sich eine version in /tmp), und deaktivieren Sie die nur-Lesen-Modus:
Jetzt kann ich mit vim patch-tools wie
do
unddp
anwenden zu können, was ich will, und machen andere kleine änderungen, wie ich gehe. Wenn ich damit fertig bin, Speichere ich die Datei, beenden von vim, und dann die Bühne und übernehmen Sie die Datei in git wie ein normales edit.Als ich sagte, dies ist nicht besonders anspruchsvoll, aber es ist sehr mächtig, und noch rein in die Befehlszeile ein. Nur werden Sie sicher, dass Sie eine klare Mitteilung, wie git nicht enthalten automatisch einen merge-Nachricht für Sie.
vimdiff Beispiel http://j.mp/1dZVllt
Wenn Sie möchten, dass nur ein port von einem commit, du bist wahrscheinlich am besten aus von cherry-picking, die zu Begehen Sie wollen und zurücksetzen Dateien, die Sie nicht berührt werden sollen.
Natürlich, wenn Sie mehrere modifizierte Teile in einer Datei und wollen nur zu halten, einige von Ihnen haben keine andere Wahl, als die Datei manuell Bearbeiten, schneiden Ihre änderungen.