本記事はQmonus Value Streamの投稿キャンペーン記事です。
OSS開発ってなんぞや??
これができるようになればエンジニア中級者以上と言ってもいいのではないのでしょうか??
そもそもオープンソースソフトウェア(OSS)というものはソースコードが公開されていて、誰でも閲覧、利用、修正、再配布ができるソフトウェアのことです。そして、OSS開発はこのようなソフトウェアの開発に参加することを指します。
OSS開発 Flow
手順
ここからは誰でもできるOSS開発の手順を簡単に解説していきます。
※ローカルの準備に関しましては初心者用に一つのやり方を示しているだけですので、自分のやり方があるのであればそれを優先してください。
また、こちらの動画は自分がよく学習用に観ているYoutubeチャンネルなのですが、わかりやすい解説がありましたので紹介いたします。日本語字幕ついてるのでご安心を
前準備として、新規ディレクトリ作成でgit initして移動しておく。
mkdir my_project
cd my_project # これを実施しないと別の場所にcloneしてしまう
git init
次に参加するプロジェクトを選定しましょう
興味のあるオープンソースプロジェクトを探します。以下の方法でプロジェクトを見つけることができます。
OSSコミュニティサイト: Awesome Lists
First Timers Only: 初心者向けのプロジェクトならこちら
プロジェクトが決まればgit操作してきます
①参加プロジェクトのリポジトリをフォークしてリモートリポジトリをGitHubに追加
これはGitHub上で実施します。作成したときにつくられるURLを必ず確認しましょう。
②リモートリポジトリをローカルにclone
git clone リポジトリURL # ここでGitHub URLを使う
cd リポジトリ名 # クローンしたディレクトリに移動
③フォーク元リポジトリをローカルリポジトリに設定
git remote add upstream フォーク元リポジトリURL
これによりフォーク元リポジトリをローカルリポジトリの2つ目のリモートリポジトリ(upstream) として設定します。forkしてcloneした場合、1つ目のremoteであるoriginは自動的に設定されるため、手動でgit remote addする必要はありません。
※1つ目はorigin
、2つ目のOSSフォーク元のリモートリポジトリはupstream
とすることが一般的です。また、ローカルリポジトリのbranchに対応しているリモートリポジトリのbranchを上流branchといいます。
git branch -vv
でローカルbranchに対応している上流branchを確認できます。
一旦ここで整理しましょう
冒頭の解説図を確認して欲しいのですが、fork元のupstream
をリモートに設定する主な理由はなんでしょうか?
以下が、主な理由です
-
最新の変更の取得:他の開発者がフォーク元のリポジトリにコミットした場合、
upstream
から最新の状態を取得するため。これによりプルリクエストを作成する前に、upstream
の最新変更を取り込むことで、コンフリクトのリスクを減らせます。 -
大規模な変更の追跡:元のプロジェクトで行われた大きな変更や新機能の追加を簡単に確認するため
確認ですがupstream
からの更新を取得するには、以下のコマンドを使用します:
git fetch upstream
git checkout main
git merge upstream/main
これにより、フォーク元の最新の変更をあなたのローカルのmain
ブランチに取り込むことができます。その後、必要に応じて自分のGitHub上のフォークにプッシュすることで、フォークも最新の状態に保つことができます。
④ローカルリポジトリでbranchを切って開発を進めてcommitしていく
全体の流れの記事ですので詳細は省きますが、基本的に開発はmainではなく開発用のブランチを切って進めていきます。
git checkout -b feature-branch # 新しいブランチを作成し、そこに切り替え
# 開発作業を行う
git add .
git commit -m "コミットメッセージ"
⑤push前に確認すること
✅ Aパターン
もしここでフォーク元のリモートリポジトリのメインブランチがcommitされて伸びている(Fast-Forwardではなくなっている) ならば、先にローカルをメインに統合する必要があります。
git checkout main # メインブランチに移動
git pull upstream main # フォーク元の最新変更を取得
git checkout feature-branch # トピックブランチに戻る
git rebase main # トピックブランチをメインブランチにリベースする
✅ Bパターン
フォーク元のリモートリポジトリのメインブランチがcommitされておらず綺麗な状態であれば、このまま次に進みましょう。
⑥リモートリポジトリ(origin)に現段階のローカルリポジトリの開発を反映させるためにpushする
git push -u origin feature-branch
ただし、Aパターンで説明したように、フォーク元のリモートリポジトリのメインブランチが伸びていた場合はローカルでリベースしているため、以下のコマンドを使用します:
git push --force-with-lease origin feature-branch
rebaseによりエラーが発生するので、強制的にプッシュするために--force-with-lease
オプションを使用します。これは--force
よりも安全なオプションです。
また、rebase中にコンフリクトが発生した場合は、ファイルを修正してgit add
してからgit rebase --continue
を実行して続行します。
⑦リモートリポジトリ内で反映した内容をmergeしてもらうためにpull requestを出す
こちらもGitHubサイト上で実施。しっかりとわかりやすくコメントを記載すること。
⑧pull requestが通ったらリモートリポジトリでmergeされる
⑨そのmergeされた状態をローカルリポジトリにpull(fetch&merge)する
git checkout main
git pull upstream main
メインが特に変更されていないなら、以下のようにpull rebaseすることもできます:
git pull --rebase upstream main
⑩開発に使用したtopic branchを削除する
git push --delete origin feature-branch # リモートブランチの削除
git branch -d feature-branch # ローカルブランチの削除
おまけ git rebase
について
チーム開発においては度々登場するgit rebase
ですが、下図を見てもらうとわかりやすいのではないでしょうか?
要はローカルの自分の作業ブランチの元を最新のコミットに移動します。
これによりコミット履歴が直線上になって綺麗になります。
最後に
「海外企業のOSS開発をしていて、企業からスカウトがきてそのまま海外のテック企業に入社した」なんて話もちょちょこ聞きます。OSS開発で貢献していくということは自分のスキルアップにもなるし、たくさんのチャンスがあるので、余裕のある方はどんどんチャレンジしていきましょう