チームで開発を行うプログラマーとして、実際にプロジェクトでの流れをまとめてお伝えします。
長くなってすみません。
設計から開発のタイミングであれば、
開発担当者は担当する機能についてのソースファイルしか触らないので、コンフリクトは起こりません。
チーム内で共通して使用するものを作成する人もジャンルごとで分けて担当したりします。
例えばゲームであればキャラクターのステータスや行動などを定義した、キャラクタークラスファイルを実装する担当者が一人になるため、コンフリクトは起こりません。戦闘システムやクエストに関するクラスを作成する人は、キャラクタークラスを変更する必要が無いからです。
(ゲーム作成経験は無いので変な例えかもしれません、すみません)
開発から単体テストのタイミングでも、
単体テスト(多くの場合はおそらく自動テストのためのテストコード作成)はソースファイルに対してテストコードを書いたり、テスト用のデータを作成したりするのみなので、やはり他の機能との競合は起こらず、コンフリクトは起こりません。
問題が起こるとすれば、
例えば自分の実装担当機能Aを実現するために
「機能Bの関数でこういう値を返してくれたらやること少なくて済むのに…」
という感じで、設計にはない変更や機能追加を行った時くらいでしょうか。
あとは、共通使用している関数に勝手に分岐を入れて、特定の条件を満たすと既存とは別の結果を返すようになるとか。
いずれにしても、まずは設計段階である程度しっかり機能ごとの役割分担を決めておいて、
誰がどの機能を作るか、つまり誰がどのソースファイルを作るのかを明確にして、それ以外の人は基本的に触れない、というのが第一かなと思います。
共通使用する関数に変更を加えた場合は、最低限テストコードを実行して既存のテストがOKになることを確認する。
出来ればその呼び出し箇所を検索して、
「自分が変更したことでこれまでと違う動作にならないか」
は確認した方が良いと思います。
(一番は、その関数を使うメンバー全員に確認。面倒なら自分だけが使う関数として新規作成する)
いわゆるウォーターフォール的な開発の流れなので、これから主流になるやり方とはズレが出るかもしれませんが、
バイブコーディングなどでも基本的には
「役割ごとに機能を分割する」
「機能ごとに開発を行う」
「共通使用するものは安易に変えない」
という考え自体は普遍かなと思うので、参考になれば幸いです。