2010-01-31 17 views
23

Wir haben Projekt (PHP-Anwendung), aber Installation für jeden Client variieren, manchmal sehr wenig, manchmal mehr. Dennoch ist ein großer Teil des Quellcodes üblich. Wir verwalten bestimmte Installationen als parallele Zweige zum Master-Zweig und müssen Änderungen vom Master in andere Zweige übertragen. Gleiche Situation wurde in Git: how maintain (mostly) parallel branches with only a few difference? Die meisten Stimmen Lösung gelöst war auf diese Weise zu übertragen Änderungen zwischen Braches:Git: wie dauerhafte parallele Zweige beibehalten werden

git pull 
git checkout local 
git rebase master 

Wie in der genannten Lösung schafft nicht vorspulen schiebt nach Umbasierung, die ich sehr unangenehme Komplikation finden. Meine Frage ist - warum stattdessen nicht zu tun:

git pull 
git checkout local 
git merge master 
+0

oder vielleicht gemeint Sie das? http://stackoverflow.com/questions/2850369/why-does-git-use-fast-forward-merging-by-default – cregox

Antwort

5

Es hängt wirklich davon ab, was Sie mit der Branche machen wollen. Ja, wenn Sie einen lokalen Rebase durchführen, werden nach dem Rebasieren nicht-schnelle Weiterleitungen erzeugt. Auf der anderen Seite, Sie werden eine Reihe von deutlichen Änderungen in der Zukunft beibehalten und was auf Ihrem Zweig wird eine Reihe von Änderungen sein, WENN SIE ZUM NEUESTEN KOPF DES MASTERS GEMACHT WURDEN.

Durch das Zusammenführen des Masters mit dem lokalen wird stattdessen der lokale Vormarsch mit dem Master fortgesetzt und der Verlauf wird protokolliert. Wenn Sie in der Lage sein müssen, den Zustand des Lokalen in der Vergangenheit zu rekonstruieren, dann sollten Sie dies tun. Die Geschichte wird sich nie ändern. Aber du wirst eine kompliziertere Geschichte haben, mit der du umgehen musst.

+0

In meinem Team, wir (fast immer) Rebase jeden Zweig, der wieder zusammenführen wird oft wie möglich, um die Rebase einfacher zu machen. Das vereinfacht das Verständnis der Änderungshistorie, wenn Sie zurückkommen. Wenn wir zwei Zweige parallel halten müssen und wir beide freigeben (Wartung und Entwicklung Versionen, mögen) - dann können wir nicht mehr Rebase, es ist zu verwirrend. Wir fangen stattdessen an zu verschmelzen. –

2

Greg's answer auf Ihre andere Frage scheint auf bestimmte Anlagen wie verbleibenden lokale verschiedene Zweige zu sehen, nicht auf andere repos geschoben (Hervorhebung hinzugefügt):

Wenn es lokal zu einem System ist, commit es zu der "lokale" Zweig des Systems, sonst begehen Sie es zu "Master" und schieben es bis zu einem gemeinsamen Repository.

Sie möchten Fast-Forward-Pushs zu Zweigen in einem gemeinsamen Repository. Die git rebase documentation erklärt, wie man von einer stromaufwärts gelegenen Rebase (, d. H., git rebase dann git push -f) gewinnt, und es macht keinen Spaß für jeden Beteiligten.

Für einen anderen Ansatz finden Never merging back:

Es gelten Fälle, in denen Sie einmal mit der Absicht, gabeln, nie wieder zusammenführen, aber im Allgemeinen sollten Sie sehr hart versuchen, Änderungen zu halten, auf einer solchen Gabel die Minimum.

Der Autor diskutiert Verzweigungsrichtlinien für verschiedene Kundenversionen innerhalb desselben Repositorys.

17

Die Idee ist, verwenden Sie einen gemeinsamen Zweig, und zwei (oder so viele wie Sie benötigen) kundenspezifische Branchen. Alle üblichen Änderungen gehen in den Master , und jeder Kundenzweig erhält Änderungen, die nur zu diesem Kunden gehören. In regelmäßigen Abständen (wenn sich der Master an einem stabilen Punkt ( ) befindet, führen Sie die Änderungen vom Master in den Zweig (git checkout custA; git merge master) zusammen. Dies bringt den neuen "Common" -Code in den Kundenzweig. Sie werden nie die andere Weise zusammenführen - das würde Master mit kundenspezifischem Code verunreinigen.

Wenn Sie eine Lieferung an Kunde A vornehmen, checken Sie den Zweig "custA" aus und senden diesen. Und natürlich auch für andere Kunden.

Jetzt nehmen Sie an, dass Sie einen neuen Kunden, "C", erwerben und ein bisschen später finden Sie eine Funktion, die Kunden A und C wollen, aber B nicht. Sie erstellen (aka "Gabel") eine Abzweigung von Master (git checkout -b AC_feature master), code/testen Sie es, commits wie Sie gehen, und dann fusionieren Sie es in A und C (git checkout A; git merge AC_feature and similarly for customer C). Sie können es in einem Code und dann verlassen A in C Verschmelzung, weil , die alle A in C.

Wenn irgendwann später bekommen würde, können Sie einen kleinen Bug in dieser Funktion finden, machen Sie die Wechseln Sie in derselben Verzweigung (git checkout AC_feature; edit/test/commit), , und führen Sie sie dann wie oben beschrieben in custA und custC zusammen.

Quelle: Diese erfrischend klare und hilfreiche Artikel vom Entwickler von gitolite - Sitaram Chamarty, teilweise geschrieben mit direktem Eingang von Junio ​​Hamano (Linus Torvalds' Partner bei der Aufrechterhaltung Git).

pflegen Parallel Kunden Branchen:

http://gitolite.com/archived/special-branches.html

Followup Artikel auf "Fixing Up" Common und Kunden Branchen:

http://gitolite.com/archived/special-branch-fixups.html