Odpowiedź zależy od wielkości Twojego zespołu i jakości kontroli źródła oraz możliwości prawidłowego scalania złożonych zestawów zmian. Na przykład w pełnej gałęzi kontroli źródeł, takiej jak CVS lub SVN, scalanie może być trudne i możesz być lepszy z pierwszym modelem, podczas gdy przy użyciu bardziej złożonego systemu, takiego jak IBM ClearCase i przy większym rozmiarze zespołu, możesz być lepszy z drugim model lub połączenie obu.
Osobiście oddzieliłbym model gałęzi funkcji, w którym każda główna cecha jest rozwijana w oddzielnej gałęzi, z podgałęziami zadań dla każdej zmiany dokonanej przez indywidualnego programistę. Gdy funkcje się stabilizują, są łączone z pnia, który utrzymujesz w miarę stabilny i przez cały czas przechodzisz wszystkie testy regresji. Gdy zbliżasz się do końca cyklu wydania i wszystkie gałęzie funkcji zostaną scalone, stabilizujesz i rozgałęziasz gałąź systemu wydań, w której robisz tylko poprawki błędów stabilności i niezbędne backporty, podczas gdy trunk jest używany do tworzenia następnego wydania i znowu ty rozgałęzić się na nowe gałęzie funkcji. I tak dalej.
W ten sposób trunk zawiera zawsze najnowszy kod, ale udaje Ci się utrzymać go w miarę stabilny, tworząc stabilne etykiety (znaczniki) przy głównych zmianach i łączeniach funkcji, gałęzie funkcji są rozwijane w szybkim tempie z ciągłą integracją, a poszczególne podgałęzie zadań mogą być często odświeżono z gałęzi funkcji, aby wszyscy pracujący nad tą samą funkcją były zsynchronizowani, jednocześnie nie wpływając na inne zespoły pracujące nad różnymi funkcjami.
Jednocześnie masz w historii zestaw gałęzi wydań, w których możesz zapewnić backporty, wsparcie i poprawki dla swoich klientów, którzy z jakiegokolwiek powodu pozostają przy poprzednich wersjach produktu lub nawet najnowszej wydanej wersji. Podobnie jak w przypadku łącza trunk, nie konfiguruje się ciągłej integracji w gałęziach wydania, są one starannie integrowane po przejściu wszystkich testów regresji i innych kontroli jakości wydania.
Jeśli z jakiegoś powodu dwie funkcje są współzależne i wymagają wzajemnych zmian, możesz rozważyć opracowanie obu w tej samej gałęzi funkcji lub wymagać, aby funkcje regularnie łączyły stabilne części kodu z linią główną, a następnie odświeżały zmiany z trunk do wymiany kodu między gałęziami linii głównej. Lub jeśli chcesz odizolować te dwie funkcje od innych, możesz utworzyć wspólną gałąź, z której możesz rozgałęzić te gałęzie i której możesz użyć do wymiany kodu między funkcjami.
Powyższy model nie ma większego sensu w przypadku zespołów poniżej 50-ego roku życia i systemu kontroli wersji bez rzadkich gałęzi i odpowiednich możliwości łączenia, takich jak CVS lub SVN, co sprawiłoby, że cały ten model byłby koszmarem konfiguracji, zarządzania i integracji.