Git Branching Strategy for Customizing and Hosting OSS Repositories

OSS をフォークして自社向けにカスタマイズし、さらに独自ホスティングまで行うケースがあり、定期的にオリジナルを追従しつつ、それぞれ差分を明確にしていくため、現在運用してる手法をまとめてます。

ブランチ

  • main - メインブランチは追加する内容とデプロイ実行環境を提供します。
  • original/application-name - ここにオリジナルの内容をリモート (upstream) から取り込みます。
  • customize/application-name - ここは original/application-name から checkout および rebase しつつ、常に original/application-name の前のコミットとしてカスタマイズ内容が存在するようにします。

application-name の箇所はオリジナルのリポジトリ名です。

記録用のブランチ

  • original/version/application-name
  • customize/version/application-name

version はソフトウエアバージョンでも日付でも好きに選べばいいでしょう。

カスタマイズを行い、リリースした時点のオリジナルとカスタマイズブランチをチェックアウトして保持しておきます。GitHub 等においては、original/version/application-name から customize/version/application-name との差分をマージ禁止 Pull Request として作成保持しておくと、diff を振り返えりやすいです。

操作方法

1. upstream(オリジナルリポジトリ)の登録

まずはリポジトリに、オリジナルのリポジトリを upstream として登録します。

1
2
git remote add upstream https://github.com/ORIGINAL/application-name.git
git fetch upstream

2. original/application-name ブランチの更新

オリジナルの変更を取り込むためのブランチです。

1
2
3
git checkout original/application-name
git fetch upstream
git merge upstream/main # もしくはタグバージョン

必要に応じてコンフリクトを解消します。

3. customize/application-name の更新(rebase 運用)

カスタマイズ内容は常に original/application-name の直前に並ぶように rebase します。

1
2
git checkout customize/application-name
git rebase original/application-name

rebase によって、カスタムコミットが最新の original の上に積み直されます。 ここのコンフリクトは慎重に解消します。破壊的な仕様変更の可能性もあるため、カスタマイズ作業のためにもメモしておく方が良いでしょう。

4. リリース時の記録ブランチ作成

リリース時点の状態を記録するために、original と customize の両方を version ブランチとして保存します。

original 側の記録

1
2
3
git checkout original/application-name
git switch -c original/2025-12-25/application-name
git push origin original/2025-12-25/application-name

customize 側の記録

1
2
3
git checkout customize/application-name
git switch -c customize/2025-12-25/application-name
git push origin customize/2025-12-25/application-name

5. GitHub で差分を記録する(マージ禁止 PR)

GitHub 上で以下の Pull Request を作成しておくと、「このリリースでどのようなカスタムを加えたか」が一目で分かるようになります。

  • base: original/version/application-name
  • compare: customize/version/application-name

PRタイトルの先頭にマージ禁止の明示やDraftにしておくといいでしょう。

メインブランチでのデプロイ作業

カスタマイズ内容を展開する

下記の例は、main ブランチにおいて work ディレクトリにカスタマイズブランチの最新の内容を出力します。

1
2
3
4
git checkout main
rm -r work
mkdir work
git archive customize/application-name . | tar -x -C work/

main ブランチの目的

アプリケーションサービスは、クラウドやVPSなどの環境でそのままデプロイできるものが提供しているとは限りません。事前にデプロイ先のVPCを作成したり、WAFなどを被せたいこともあります。そのような追加インフラ管理や作業場所として main ブランチを使う戦略を採用しています。