Frage Mit GIT, wie kann ich selektiv Änderungen von der Gabelung eines anderen ziehen / zusammenführen?


Nimm dieses Szenario:

  1. Ich entscheide mich dafür, eine Codebasis auf github.com auszugeben und meine Routine zu beginnen: Bearbeiten - Commit - Push; aka Hack Hack Hack.
  2. Nachdem ich einige Änderungen vorgenommen habe, sehe ich einige Änderungen, die eine andere Person am selben Projekt gemacht hat, und ich mag sie!
  3. Ich entscheide, dass ich sie in meine zusammenführen möchte. Das Problem ist, dass ich nur einen Teil eines bestimmten Commits aus mehreren Commits, die er gemacht hat, haben möchte.

Was wäre die effizienteste Methode, um diese ausgewählte Menge an Änderungen in meine "Gabelung" zu integrieren?


76
2017-09-10 12:36


Ursprung


Antworten:


Nachdem ich die Wellen der IRC-Welt verfolgt hatte, gab jemand eine großartige Lösung:

git cherry-pick SHA1 --no-commit
git add --patch

Hoffentlich hilft das jedem anderen mit derselben Frage!

EDIT: OK, vielleicht ist es nicht ganz so einfach. Hier sind die vollständigen Schritte:

  1. Zuerst müssen Sie in Ihrem Repository sein, tun Sie das Notwendige cd-ing, um zu Ihrem Arbeitsverzeichnis zu gelangen.

  2. Sie müssen nun den Remote-Zweig hinzufügen und ihn dann abrufen. Tun Sie dies durch:

    git remote add someUser git://github.com/someUser/someRepo.git

    git fetch someUser

  3. Sie können jetzt Befehle wie z git log someUser/master um den Commit SHA1 zu finden, den Sie partiell verschmelzen möchten.

  4. Sobald Sie die SHA haben, können Sie jetzt ausführen:

    git cherry-pick -n SHA1

    woher SHA1 ist die Verpflichtung SHA, duh!

  5. Es wird sehr wahrscheinlich Konflikte geben, je nachdem, wie alt das Commit ist und wie oft sich dieser bestimmte Bereich des Projekts ändert. Entschuldigung, aber Sie müssen diese manuell mit Ihrem vertrauenswürdigen Editor auflösen. Also ziehe VIM oder was auch immer du benutzt, und hacke die Konflikte aus, bis du zu der Stufe kommst, auf der du die Änderungen magst.

  6. Sie müssen nun den Index auf die HEAD-Revision zurücksetzen, dann können Sie das vertrauenswürdige GIT verwenden add --patch Befehl zum Auswählen und Auswählen der gewünschten Änderungen:

    git reset HEAD

    git add --patch oder git add -p

  7. Yay! Commit-Zeit:

    git commit -m "I merged a select amount of changes"

  8. Um das Durcheinander zu säubern (Das Zeug, zu dem du nein gesagt hast git add --patch) und nur die ausgewählten Änderungen in Ihrem Arbeitsrepository beibehalten, führen Sie Folgendes aus:

    git reset --hard HEAD

    Anscheinend git checkout -f ist eine weitere Option.


113
2017-09-10 13:05



Mir ist nicht klar, was du willst. Wenn du nur bestimmte Commits von den anderen Gabeln einbringen willst, kannst du verwenden git cherry-pick SHA. Ausführliche Erklärung zu gitready.


2
2017-09-10 12:40



Ich mag Tims Lösung sehr, aber manchmal bastele ich gerne an vimdiff. Meine Lösung für dieses Problem ist grob, aber es funktioniert für mich, weil ich vim mag.

Ich habe vimdiff als mein difftool gesetzt, und dann selektiv den Zweig i diff verschmelzen lassen:

git difftool <branch> <file>

Dann gehe ich in den Bereich mit der aktuellen Zweigversion und bearbeite das Original in vim (manchmal ist das nicht notwendig, aber manchmal öffnet vimdiff eine Version in / tmp) und deaktiviere den schreibgeschützten Modus:

:e <file>
:set readonly!

Jetzt kann ich die Patch-Tools von vim wie do und dp um zu verwenden, was ich will, und andere kleine Änderungen zu machen, wie ich gehe. Wenn ich fertig bin, speichere ich die Datei, beende vim und stelle die Datei dann wie eine normale Bearbeitung in git ein.

Wie gesagt, das ist nicht besonders anspruchsvoll, aber es ist sehr mächtig und immer noch rein in der Befehlszeile. Stellen Sie sicher, dass Sie eine eindeutige Übermittlungsnachricht hinzufügen, da git eine Zusammenführungsnachricht nicht automatisch für Sie enthält.

vimdiff Beispiel http://j.mp/1dZVllt


2
2018-01-18 05:03



Wenn Sie nur einen Port für ein Commit wünschen, sollten Sie das gewünschte Commit auswählen und Dateien zurücksetzen, die Sie nicht berühren möchten.

git cherry-pick SHA1
git checkout HEAD file1 file2 ... fileN

Wenn Sie mehrere modifizierte Teile in einer Datei haben und nur einige von ihnen behalten möchten, haben Sie natürlich keine andere Wahl, als die Datei manuell zu bearbeiten und ihre Änderungen auszublenden.


1
2017-09-10 12:38