導入
Gitは、共同作業によるソフトウェアプロジェクトの管理を容易にするオープンソースの分散型バージョン管理システムです。多くのプロジェクトがファイルをGitリポジトリに保存しており、GitHubなどのプラットフォームによって、コードの共有と貢献がアクセスしやすく、価値があり、効果的なものになっています。.
パブリック リポジトリでホストされているオープン ソース プロジェクトは、プル リクエスト (コード リポジトリに加えられた変更をプロジェクトが受け入れるように要求する) を通じて、より広範な開発者コミュニティからの貢献の恩恵を受けます。.
このチュートリアルでは、コマンドライン経由で Git リポジトリにプル リクエストを送信し、オープン ソース ソフトウェア プロジェクトに貢献する方法について説明します。.
前提条件
ローカルマシンにGitがインストールされている必要があります。このガイドでは、お使いのコンピュータにGitがインストールされているかどうかを確認し、お使いのオペレーティングシステムに応じたインストール手順をご案内します。.
また、GitHubアカウントをお持ちの場合、または作成する必要があります。GitHubのウェブサイト(github.com)からログインするか、アカウントを作成してください。.
2020年11月をもって、GitHubはパスワードベースの認証を廃止しました。そのため、コマンドラインからGitHubリポジトリにアクセスするには、個人用アクセストークンを作成するか、SSH公開鍵情報を追加する必要があります。.
最後に、貢献するオープンソースソフトウェアプロジェクトを特定する必要があります。オープンソースプロジェクトの詳細については、こちらの紹介をご覧ください。.
リポジトリのコピーを作成する
リポジトリ(略してレポ)は、基本的にプロジェクトのルートディレクトリです。リポジトリには、ドキュメントを含むすべての関連プロジェクトファイルと、各ファイルの編集履歴が保存されます。GitHubでは、リポジトリは複数の共同作業者を持つことができ、公開または非公開にすることができます。.
オープンソースプロジェクトで作業するには、まずリポジトリのコピーを取得する必要があります。そのためには、リポジトリをフォークし、それをクローンしてローカルの作業コピーを作成する必要があります。.
リポジトリをフォークする
貢献したいオープンソース プロジェクトの GitHub URL にブラウザで移動することで、GitHub 上にリポジトリを作成できます。.
GitHubリポジトリのURLは、リポジトリ所有者に関連付けられたユーザー名とリポジトリ名の両方を参照します。例えば、DigitalOcean Community(ユーザー名:do-community)がcloud_haikuプロジェクトリポジトリを所有しているため、このプロジェクトのGitHub URLは次のようになります。
https://github.com/do-community/cloud_haiku上記の例では、do-community がユーザー名で、cloud_haiku がリポジトリ名です。.
貢献したいプロジェクトを特定したら、次のような形式の URL に移動できます。
https://github.com/username/repositoryまたは、GitHub 検索バーを使用してプロジェクトを検索することもできます。.
リポジトリのホームページにアクセスすると、ページの右上、ユーザー アイコンの下に [フォーク] ボタンが表示されます。
「フォーク」ボタンをクリックしてフォーク処理を開始します。ブラウザウィンドウに、フォークするリポジトリが処理中であることを示す通知が表示されます。
プロセスが完了すると、ブラウザは前のリポジトリ ページと同様のページに移動しますが、上部にリポジトリ名の前にユーザー名が表示され、URL でもリポジトリ名の前にユーザー名が表示されます。.
したがって、上記の例では、ページの上部に do-community/cloud_haiku の代わりに yourusername/cloud_haiku が表示され、新しい URL は次のようになります。
https://github.com/your-username/cloud_haikuリポジトリをフォークしたら、コードベースのローカル コピーを作成するためにリポジトリをクローンする準備が整います。.
リポジトリをシミュレートする
貢献したいリポジトリの独自のローカル コピーを作成するには、まずターミナル ウィンドウを開きます。.
リポジトリフォークを指す URL とともに git clone コマンドを使用します。.
このURLは上記のURLと同じですが、末尾が.gitで終わります。上記のcloud_haikuの例では、URLは次のようになります(実際のユーザー名がユーザー名に置き換えられます)。
https://github.com/your-username/cloud_haiku.gitメインリポジトリページとは別に作成したリポジトリページから、緑色の「⤓ Code」ボタンを使ってURLをコピーすることもできます。ボタンをクリックした後、URLの横にあるクリップボードボタンをクリックすることでURLをコピーできます。
URLを取得したら、リポジトリをクローンする準備が整います。これを行うには、ターミナルウィンドウのコマンドラインからgit cloneコマンドとリポジトリのURLを入力します。
git clone https://github.com/your-username/repository.git
新しいブランチを作成する
共同プロジェクトに取り組む際には、リポジトリに貢献する他の開発者と、新機能や修正について同時に異なるアイデアを持つことになります。これらの新機能の中には、実装にそれほど時間がかからないものもありますが、中には実装に時間がかかるものもあります。そのため、ワークフローを管理し、コードを分離し、どの機能をプロジェクトリポジトリのメインブランチに戻すかを制御できるように、リポジトリをブランチ化することが重要です。.
プロジェクトリポジトリの最初のブランチは通常、マスターブランチと呼ばれます。マスターブランチ内のすべてのものは、他のユーザーがいつでも使用できるように、デプロイ可能と見なすことをお勧めします。.
注:2020年6月にGitHubは用語を更新し、デフォルトのソースコードブランチを「masterブランチ」ではなく「masterブランチ」と呼ぶようになりました。デフォルトブランチがまだ「master」と表示されている場合は、デフォルトブランチの設定を変更することで「master」に更新できます。.
既存のプロジェクトに基づいてブランチを作成する場合は、親ブランチから新しいブランチを作成する必要があります。また、ブランチ名は分かりやすいものにしてください。「my-branch」ではなく、「frontend-hook-migration」や「fix-documentation-type」のような名前を付けてください。.
ターミナルウィンドウからブランチを作成するには、リポジトリディレクトリ内で作業するようにディレクトリを変更します。ディレクトリを変更する際は、実際のリポジトリ名(例:cloud_haiku)を使用してください。.
cd repository
それでは、git branchコマンドを使って新しいブランチを作成しましょう。プロジェクトで作業している他のメンバーが何に取り組んでいるのかがわかるように、分かりやすい名前を付けましょう。.
git branch new-branch
新しいブランチが作成されたので、git checkout コマンドを使用して作業できます。
git checkout new-branch
git checkout コマンドを入力すると、次の出力が表示されます。
Output
Switched to branch 'new-branch'あるいは、次のコマンドと -b フラグを使用して新しいブランチを作成して切り替えることで、上記の 2 つのコマンドを圧縮することもできます。
git checkout -b new-branch
元の状態に戻したい場合は、元のブランチ名を指定した checkout コマンドを使用します。
git checkout main
チェックアウトを使用すると複数のブランチを切り替えることができるため、複数の機能を同時に操作できます。.
この時点で、ブランチ内の既存のファイルを変更したり、プロジェクトに新しいファイルを追加したりできるようになりました。.
地域的な変化
プルリクエストの作成方法を説明するために、cloud_haikuリポジトリの例を使用し、ローカルコピーに新しいファイルを作成します。ヘルプの説明に従って、お気に入りのテキストエディタで新しいファイルを作成し、新しい俳句を追加します。例えば、nanoを使用してサンプルファイルをfilename.mdという名前にします。ファイル名は、拡張子mdを付けた元のファイル名で指定してください。Markdownの場合も同様です。.
nano filename.md
次に、ヘルプの指示に従って、新しいファイルにテキストを追加します。Jekyllテンプレートを使用し、破線で囲まれた俳句を追加します。以下のファイルはサンプルファイルです。オリジナルの俳句をご用意いただく必要があります。.
--- layout: haiku title: Octopus Cloud author: Sammy --- Distributed cloud <br> Like the octopuses' minds <br> Across the network <br>
テキストを入力したら、ファイルを保存して閉じます。nanoを使用している場合は、Ctrl + X、Y、Enterの順に押します。.
既存のファイルを変更したり、選択したプロジェクトに新しいファイルを追加したりしたら、git addコマンドを使ってローカルリポジトリにステージングできます。この例では、filename.md と入力し、以下のコマンドを入力します。.
git add filename.md
作成したファイルの名前をこのコマンドに渡して、ローカルリポジトリにステージングしました。これにより、ファイルを追加する準備が整ったことになります。.
変更したすべてのファイルを特定のディレクトリに追加する場合は、次のコマンドを使用してすべてのファイルをステージングできます。
git add .ここで、ドットまたはドットは関連するすべてのファイルを追加します。.
サブディレクトリ内の変更も含め、すべての変更を再帰的に追加する場合は、次のように入力します。
git add -A
または、「git add -all」と入力して、すべての新しいファイルをステージングすることもできます。.
ファイルをステージングすることで、git commit コマンドを使用してリポジトリに加えた変更をコミットします。.
変更を加える
コミットメッセージは、コードへの貢献において重要な要素です。メンテナーや他の貢献者が、あなたが行った変更、その理由、そしてそれがなぜ重要なのかを完全に理解するのに役立ちます。さらに、コミットメッセージはプロジェクト全体への変更の履歴記録を提供し、将来の貢献者にとって役立ちます。.
非常に短いメッセージの場合は、-m フラグと引用符で囲んだメッセージでキャプチャできます。俳句を追加する例では、git コミットは次のようになります。.
git commit -m "Added a new haiku in filename.md file"
軽微な変更や予定通りの変更でない限り、共同作業者に私たちの貢献について十分に理解してもらうために、より長いコミットメッセージを追加したい場合があります。この長いメッセージを記録するには、git commit コマンドを実行し、デフォルトのテキストエディタを開きます。
git commit
このコマンドを実行すると、vimエディタが起動することがありますが、:qと入力することで終了できます。デフォルトのテキストエディタを変更したい場合は、git configコマンドを使用してnanoをデフォルトのエディタとして設定します。例:
git config --global core.editor "nano"
またはvim:
git config --global core.editor "vim"
git commit コマンドを実行すると、使用しているデフォルトのテキスト エディターに応じて、ターミナル ウィンドウに次のような編集可能なドキュメントが表示されます。
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
# On branch new-branch
# Your branch is up-to-date with 'origin/new-branch'.
# Changes to be committed:
# modified: new-feature.py導入コメントの下に、コミット メッセージをテキスト ファイルに追加する必要があります。.
有用なコミットメッセージを書くには、最初の行に約50文字の要約を含める必要があります。このセクションは、理解しやすいように分割され、変更が行われた理由、コードの動作、そしてマージ時に作業をレビューする他の人に明確に理解してもらえるような追加情報などを説明する必要があります。プロジェクトのメンテナンス担当者があなたの貢献を完全に理解できるように、できる限り親切かつ積極的に伝えるようにしてください。.
変更をプッシュする
コミット メッセージのテキスト ファイルを保存して終了したら、次のコマンドで Git がコミットした内容を確認できます。
git status
行った変更に応じて、次のような出力が得られます。
Output
On branch new-branch
nothing to commit, working tree cleanこの時点で、git push コマンドを使用して、フォークしたリポジトリの現在のブランチに変更を適用できます。
git push --set-upstream origin new-branch
このコマンドは、進行状況を通知する次のような出力を提供します。
Output
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 336 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/your-username/repository.git
a1f29a6..79c0e80 new-branch -> new-branch
Branch new-branch set up to track remote branch new-branch from origin.これで、GitHub Web ページでフォークされたリポジトリにアクセスし、プッシュしたブランチに移動して、ブラウザーで行った変更を確認できるようになります。.
この時点で、メイン リポジトリへのプルをリクエストすることは可能ですが、まだ行っていない場合は、ローカル リポジトリがアップストリーム リポジトリと同じ最新状態になっていることを確認する必要があります。.
ローカルリポジトリの更新
他の貢献者とプロジェクトに取り組んでいる間は、ローカルリポジトリをプロジェクトの最新の状態に保つ必要があります。なぜなら、自動的に競合を引き起こすようなコードのプルリクエストを送信したくないからです(共有コードプロジェクトでは競合は必ず発生しますが)。ローカルバージョンのコードベースを最新の状態に保つには、変更を同期する必要があります。.
まず、フォークのリモート コントロールを構成し、フォークを同期します。.
フォークのリモートコントロールを構成する
リモートリポジトリを使用すると、Gitプロジェクトで他のユーザーと共同作業を行うことができます。各リモートリポジトリは、インターネットまたはアクセス可能なネットワーク上にホストされているプロジェクトのバージョンです。ユーザー権限に応じて、各リモートリポジトリは読み取り専用または読み取り/書き込みとして利用できます。.
フォークしたリポジトリに加えた変更を作業中のメインリポジトリと同期するには、アップストリームリポジトリを指すリモートを設定する必要があります。アップストリームリポジトリでリモートを設定するのは一度だけです。.
まず、どのリモートリポジトリを設定しているか確認しましょう。git remote コマンドは、以前に指定したリモートリポジトリの一覧を表示します。そのため、上記のようにリポジトリをクローンすると、少なくともソースリポジトリ(Git がクローン先のディレクトリに付けるデフォルトの名前)の出力が得られます。.
ターミナル ウィンドウのリポジトリ ディレクトリから、-v フラグを指定した git remote コマンドを使用して、Git が保存した URL とそれに対応するリモートの短い名前 (「origin」など) を表示してみましょう。
git remote -v
リポジトリをシミュレートしたので、出力は次のようになるはずです。
Output
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)すでに複数のリモートを設定している場合は、git remote -v コマンドを実行すると、それらのリモートがすべて一覧表示されます。.
次に、フォークと同期する新しいリモートリポジトリを指定します。これは、フォーク元のリポジトリになります。git remote add コマンドで指定します。.
git remote add upstream https://github.com/original-owner-username/original-repository.git
cloud_haiku の例では、このコマンドは次のようになります。
git remote add upstream https://github.com/do-community/cloud_haiku.git
この例では、upstream はリモートリポジトリに指定した短縮名です。Git 用語では、「upstream」はクローン元のリポジトリを指すためです。共同作業者のリポジトリへのリモートポインタを追加したい場合は、その共同作業者のユーザー名、または短縮名のエイリアスを指定するとよいでしょう。.
リポジトリ ディレクトリから git remote -v コマンドを再度使用すると、リモート ポインターがアップストリーム リポジトリに正しく追加されたことを確認できます。
git remote -v
Output
origin https://github.com/your-username/forked-repository.git (fetch)
origin https://github.com/your-username/forked-repository.git (push)
upstream https://github.com/original-owner-username/original-repository.git (fetch)
upstream https://github.com/original-owner-username/original-repository.git (push)これで、URL 全体を入力する代わりにコマンド ラインでアップストリームを参照できるようになり、フォークをメイン リポジトリと同期する準備が整いました。.
フォークを同期する
GitHub のアップストリームおよびマスター リポジトリを参照するリモートを構成したら、リポジトリ フォークを同期して最新の状態に保つ準備が整います。.
フォークを同期するには、ターミナルウィンドウのローカルリポジトリディレクトリから git fetch コマンドを使用して、上流リポジトリからブランチとそれに対応するコミットを取得します。上流リポジトリを指すために「upstream」という短縮名を使用しているため、これをコマンドに渡します。.
git fetch upstream
リポジトリをフォークしてから行われた変更の数に応じて出力は異なり、オブジェクトのカウント、圧縮、解凍などの処理が複数行にわたって行われる場合があります。出力は最終的に以下のようになりますが、プロジェクト内のブランチの数によって異なる場合があります。
Output
From https://github.com/original-owner-username/original-repository
* [new branch] main -> upstream/main現在、メイン ブランチへのコミットは、upstream/main というローカル ブランチに保存されています。.
リポジトリのローカル マスター ブランチに移動しましょう。
git checkout main
Output
Switched to branch 'main'ここで、ローカルのアップストリーム/メイン ブランチを通じてアクセスできるメイン リポジトリのメイン ブランチに加えられた変更を、ローカルのマスター ブランチにマージします。
git merge upstream/main
ここでの出力は異なりますが、変更があった場合、または既に最新の状態の場合は「update」で始まります。リポジトリをフォークしてから変更がない場合は、「update」で始まります。.
フォークのマスター ブランチはアップストリーム リポジトリと同期され、ローカルで行った変更は失われません。.
ワークフローと変更に費やす時間に応じて、フォークをメインリポジトリのアップストリームコードと同期する頻度は、必要に応じて自由に設定できます。ただし、プルリクエストを送信する直前にフォークを同期し、競合するコードを自動的にプッシュしないようにする必要があります。.
プルリクエスト
この時点で、メイン リポジトリにプル リクエストを送信する準備が整いました。.
フォーク リポジトリに移動し、画面の左側にある新しいプル リクエスト ボタンを押す必要があります。.
次のページではブランチを変更できます。それぞれのページで、ドロップダウンメニューから適切なリポジトリと適切なブランチを選択できます。.
例えば、左側のメインリポジトリブランチと右側のフォークしたリポジトリブランチを選択すると、ブランチをマージできることを示す画面が表示されます。競合するコードがない場合:
対応するフィールドにタイトルとコメントを追加し、「プル リクエストの作成」ボタンを押す必要があります。.
この時点で、メインリポジトリのメンテナーがプルリクエストを受け入れるかどうかを決定します。プルリクエストを受け入れる前に、コードレビューを送信してコードの編集または修正を依頼する場合があります。.
結果
この時点で、オープンソースソフトウェアリポジトリへのプルリクエストの送信は完了です。その後は、レビューを待つ間、コードの更新と変更を必ず行ってください。プロジェクトのメンテナーからコードの修正を求められる場合もあるため、その準備をしておきましょう。.
オープンソースプロジェクトに参加し、積極的なオープンソース開発者になることは、やりがいのある経験となるでしょう。頻繁に使用するソフトウェアに定期的に貢献することで、他のエンドユーザーにとって可能な限り価値のあるものにすることができます。.














