2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

お題は不問!Qiita Engineer Festa 2024で記事投稿!
Qiita Engineer Festa20242024年7月17日まで開催中!

【Git初心者へ送る記事③】海外テック企業に行けるかも!? GitHub OSS開発についての図解

Last updated at Posted at 2024-07-04

本記事はQmonus Value Streamの投稿キャンペーン記事です。

OSS開発ってなんぞや??

これができるようになればエンジニア中級者以上と言ってもいいのではないのでしょうか??

そもそもオープンソースソフトウェア(OSS)というものはソースコードが公開されていて、誰でも閲覧、利用、修正、再配布ができるソフトウェアのことです。そして、OSS開発はこのようなソフトウェアの開発に参加することを指します。

OSS開発 Flow :ocean:

手順 :1234:

ここからは誰でもできるOSS開発の手順を簡単に解説していきます。
※ローカルの準備に関しましては初心者用に一つのやり方を示しているだけですので、自分のやり方があるのであればそれを優先してください。

また、こちらの動画は自分がよく学習用に観ているYoutubeチャンネルなのですが、わかりやすい解説がありましたので紹介いたします。日本語字幕ついてるのでご安心を:relaxed:

前準備として、新規ディレクトリ作成で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を確認できます。

一旦ここで整理しましょう :writing_hand:

冒頭の解説図を確認して欲しいのですが、fork元のupstreamをリモートに設定する主な理由はなんでしょうか?

以下が、主な理由です

  1. 最新の変更の取得:他の開発者がフォーク元のリポジトリにコミットした場合、upstreamから最新の状態を取得するため。これによりプルリクエストを作成する前に、upstreamの最新変更を取り込むことで、コンフリクトのリスクを減らせます。

  2. 大規模な変更の追跡:元のプロジェクトで行われた大きな変更や新機能の追加を簡単に確認するため

確認ですが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について :point_up:

チーム開発においては度々登場するgit rebaseですが、下図を見てもらうとわかりやすいのではないでしょうか?

要はローカルの自分の作業ブランチの元を最新のコミットに移動します。
これによりコミット履歴が直線上になって綺麗になります。

スクリーンショット 2024-07-04 19.52.53.png

最後に

「海外企業のOSS開発をしていて、企業からスカウトがきてそのまま海外のテック企業に入社した」なんて話もちょちょこ聞きます。OSS開発で貢献していくということは自分のスキルアップにもなるし、たくさんのチャンスがあるので、余裕のある方はどんどんチャレンジしていきましょう:rocket:

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?