2008-11-16 11 views

Antwort

18

In git können Sie die Ausgabe des git-diff zwischen zwei Commits wie folgt aus:

git diff fa1afe1 deadbeef > patch.diff 

Senden Sie die patch.diff an den Entwickler und ließ ihn git-apply es seinem Arbeitsplatz wie folgt aus:

git apply patch.diff 

Wenn der andere Entwickler die Commits bereits in seinem Repository zur Verfügung hat, könnte er sie immer in sich selbst pipen, ohne so zu verschmelzen:

git apply < git diff fa1afe1 deadbeef 

Sie können dann die add und die Änderungen in der diff the usual way.

Jetzt kommt der interessante Teil, wenn Sie den Patch zurück auf den Master-Zweig (das ist öffentlich) zusammenführen müssen. Betrachten Sie die folgende Revisionsbaum, wo C* die aufgebrachte Patch von C im Master-Zweig ist:

A---B---C---D   master, public/master 
    \ 
     E---C*---F  feature_foo 

Sie können git-rebase verwenden das Thema Zweig zu aktualisieren (in diesem Beispiel genannt feature_foo) mit ihm vorgelagerten Kopf ist. Was das bedeutet, ist, wenn Sie in der Art folgende:

git rebase master feature_foo 

Git die Revisionsbaum wie folgt neu angeordnet werden und gilt auch den Patch selbst:

A---B---C---D   master, public/master 
      \ 
       E*---F* feature_foo 

an den Upstream-Zweig Merging wird nun eine sein einfache Vorlauf-Zusammenführung. Überprüfen Sie auch, ob die neuen Commits E* und F* als vorherige E bzw. F funktionieren.

Sie können dasselbe mit den gleichen Schritten für einen Zweig eines anderen Entwicklers tun, aber anstatt dies für ein öffentliches Repository zu tun, werden Sie fetching Revisionen aus dem Repository des Entwicklers sein. Auf diese Weise müssen Sie den anderen Entwickler nicht nach einem Patch fragen, wenn dieser bereits in seinem Repo verfügbar ist.

Bitte beachten Sie nie eine öffentliche Zweigstelle rebase, weil der Befehl git Geschichte neu schreiben wird, was Sie nicht tun wollen, auf Branchen, die Menschen abhängen, und wird ein Chaos bei der Verschmelzung mit Remote-Repositories erstellen. Vergessen Sie auch niemals integrate often, damit andere in Ihrem Team an Ihren Änderungen teilnehmen können.

+0

Nachher herausgefunden, dass Sie das gleiche mit git format-patch tun können, um einen Patch zu formatieren, und git bin, um den Patch zu übernehmen und zu committen. Beispiel: git format-patch -k --stdout R1 ... R2 | git am -3 -k – Spoike

2

In SVN Sie einfach Ihre Änderungen dann vornehmen können, bevor commiting, Rohr der Ausgang der svn diff auf eine Datei als solche

svn diff > mypatch.diff 

können Sie Ihre Änderungen rückgängig machen und den Patch zu einem späteren Zeitpunkt gelten mit

patch -p0 -i mypatch.diff 

wie immer gelten nicht blind p atches zu Ihrem Code und überprüfen Sie sie immer zuerst.

Sie können auch feststellen, dass der Patch Ihren Quellcode beschädigt, wenn sich die Quelldateien seit der Erstellung des Patches signifikant geändert haben.

Sie können auch nicht garantieren, dass keine Zusammenführungskonflikte auftreten, wenn Sie versuchen, den Code einzuchecken.

2

Bzr behandelt eine „Merge-Richtlinie“ zu senden, was bedeutet es den Patch für Dich sendet, so dass die andere Partei einfach „OK“, um merge klicken kann, und es gibt weniger futzing um mit Patch/anwenden usw.

nur: $ bzr senden -o mycode.patch

+0

bzr send erzeugt nur eine Merge-Direktive zwischen zwei verschiedenen Zweigen. Ich war auf der Suche nach Patches, wie Single Commits oder Cherry Picking, und wie Merging funktioniert, wenn diese Patches angewendet werden. – Spoike

2

In Subversion gibt es keine gute Möglichkeit, dies zu tun. Ja, du kannst svn diff + patch verwenden, aber das wird deine Probleme nur verschieben, bis du verschmelzen wirst und bis dahin hast du es wahrscheinlich vergessen.

Die Art, wie Sie es in Subversion tun würden, wäre, eine Verzweigung zu erstellen, das Commit auf der Verzweigung durchzuführen und den Empfänger des Patches auf die Verzweigung zu wechseln. Dann können Sie den Zweig wie gewohnt auf den Stamm zurückführen.