GitHubでプルリクエストを作成する方法
序章
Gitは、コラボレーションソフトウェアプロジェクトをより管理しやすくするオープンソースの分散バージョン管理システムです。 多くのプロジェクトはファイルをGitリポジトリに保持しており、GitHubのようなプラットフォームにより、コードの共有と貢献がアクセス可能で、価値があり、効果的です。
パブリックリポジトリでホストされているオープンソースプロジェクトは、プルリクエストを通じて、より広範な開発者コミュニティによる貢献の恩恵を受けます。このリクエストは、プロジェクトがコードリポジトリに加えた変更を受け入れることを要求します。
このチュートリアルでは、オープンソースソフトウェアプロジェクトに貢献できるように、コマンドラインからGitリポジトリへのプルリクエストを行う方法について説明します。
前提条件
ローカルマシンにGitがインストールされている必要があります。 このガイドに従って、Gitがコンピューターにインストールされているかどうかを確認し、オペレーティングシステムのインストールプロセスを実行できます。
また、GitHubアカウントを持っているか作成する必要があります。 これは、GitHubWebサイトgithub.com から行うことができ、ログインするか、アカウントを作成することができます。
2020年11月の時点で、GitHubはパスワードベースの認証を削除しました。 このため、コマンドラインからGitHubリポジトリにアクセスするには、個人アクセストークンを作成するか、SSH公開鍵情報を追加する必要があります。
最後に、貢献するオープンソースソフトウェアプロジェクトを特定する必要があります。 この紹介を読むことで、オープンソースプロジェクトに慣れることができます。
リポジトリのコピーを作成する
リポジトリ、または略してリポジトリは、基本的にプロジェクトのメインフォルダです。 リポジトリには、ドキュメントを含むすべての関連プロジェクトファイルが含まれ、各ファイルの改訂履歴も保存されます。 GitHubでは、リポジトリに複数の共同編集者を含めることができ、パブリックまたはプライベートのいずれかにすることができます。
オープンソースプロジェクトで作業するには、最初にリポジトリの独自のコピーを作成する必要があります。 これを行うには、リポジトリをフォークしてからクローンを作成して、ローカルの作業コピーを作成する必要があります。
リポジトリをフォークする
ブラウザを使用して、貢献したいオープンソースプロジェクトのGitHub URLに移動することで、GitHub上のリポジトリをフォークできます。
GitHubリポジトリのURLは、リポジトリの所有者に関連付けられているユーザー名とリポジトリ名の両方を参照します。 たとえば、DigitalOcean Community(ユーザー名:do-community
)は cloud_haiku プロジェクトリポジトリの所有者であるため、そのプロジェクトのGitHubURLは次のようになります。
https://github.com/do-community/cloud_haiku
上記の例では、do-community
がユーザー名であり、cloud_haiku
がリポジトリ名です。
貢献したいプロジェクトを特定したら、次のような形式のURLに移動できます。
https://github.com/username/repository
または、GitHub検索バーを使用してプロジェクトを検索することもできます。
リポジトリのメインページを表示しているときは、ページの右上のユーザーアイコンの下にフォークボタンが表示されます。
フォークボタンをクリックして、フォークプロセスを開始します。 ブラウザウィンドウ内で、フォークしているリポジトリが処理されているという通知を受け取ります。
プロセスが完了すると、ブラウザは前のリポジトリ画面と同様の画面に移動しますが、上部にリポジトリ名の前にユーザー名が表示され、URLではリポジトリ名の前にユーザー名が表示されます。
したがって、上記の例では、ページ上部の do-community / cloud_haiku の代わりに、 your-username / cloud_haiku が表示され、新しいURLは同様になります。これに:
https://github.com/your-username/cloud_haiku
リポジトリがフォークされたら、コードベースのローカル作業コピーを作成できるように、リポジトリのクローンを作成する準備が整います。
リポジトリのクローンを作成する
貢献したいリポジトリの独自のローカルコピーを作成するには、最初にターミナルウィンドウを開きます。
git clone
コマンドを、リポジトリのフォークを指すURLとともに使用します。
このURLは、.git
で終わることを除いて、上記のURLと同様になります。 上記のcloud_haiku
の例では、URLは次のようになり、実際のユーザー名がyour-username
に置き換わります。
https://github.com/your-username/cloud_haiku.git
または、元のリポジトリページからフォークしたリポジトリページから緑色の「⤓コード」ボタンを使用してURLをコピーすることもできます。 ボタンをクリックすると、URLの横にあるクリップボードボタンをクリックしてURLをコピーできます。
URLを取得したら、リポジトリのクローンを作成する準備が整います。 これを行うには、git clone
コマンドをターミナルウィンドウのコマンドラインからのリポジトリURLと組み合わせます。
git clone https://github.com/your-username/repository.git
コードのローカルコピーができたので、コードを操作するための新しいブランチの作成に進むことができます。
新しいブランチを作成する
共同プロジェクトに取り組むときはいつでも、リポジトリに貢献しているあなたと他のプログラマーは、新しい機能や修正について一度に異なるアイデアを持っています。 これらの新機能の中には、実装にそれほど時間がかからないものもありますが、継続しているものもあります。 このため、ワークフローを管理し、コードを分離し、プロジェクトリポジトリのメインブランチに戻す機能を制御できるように、リポジトリを分岐することが重要です。
プロジェクトリポジトリのプライマリブランチは通常、mainブランチと呼ばれます。 推奨される方法は、メインブランチ上のすべてのものを、他のユーザーがいつでも使用できるように展開可能であると見なすことです。
注:2020年6月、GitHubは用語を更新して、デフォルトのソースコードブランチをmaster
ブランチではなくmain
ブランチと呼ぶようにしました。 デフォルトのブランチがまだmaster
と表示されている場合は、デフォルトのブランチ設定を変更することで、main
に更新できます。
既存のプロジェクトに基づいてブランチを作成する場合、メインブランチから新しいブランチを作成することが非常に重要です。 また、ブランチ名がわかりやすい名前であることを確認する必要があります。 my-branch
と呼ぶのではなく、frontend-hook-migration
やfix-documentation-typos
のようなものを使用する必要があります。
ターミナルウィンドウからブランチを作成するには、リポジトリのディレクトリで作業するようにディレクトリを変更しましょう。 リポジトリの実際の名前(cloud_haiku
など)を使用して、そのディレクトリに移動してください。
cd repository
次に、git branch
コマンドを使用して新しいブランチを作成します。 プロジェクトに取り組んでいる他の人があなたが取り組んでいることを理解できるように、わかりやすい名前を付けてください。
git branch new-branch
新しいブランチが作成されたので、git checkout
コマンドを使用して、そのブランチで作業していることを確認するように切り替えることができます。
git checkout new-branch
git checkout
コマンドを入力すると、次の出力が表示されます。
OutputSwitched to branch 'new-branch'
または、次のコマンドと-b
フラグを使用して、上記の2つのコマンドを要約し、新しいブランチを作成して切り替えることもできます。
git checkout -b new-branch
main
に戻す場合は、メインブランチの名前を指定してcheckout
コマンドを使用します。
git checkout main
checkout
コマンドを使用すると、複数のブランチを切り替えることができるため、一度に複数の機能を操作できる可能性があります。
この時点で、既存のファイルを変更したり、独自のブランチのプロジェクトに新しいファイルを追加したりできるようになりました。
ローカルで変更を加える
プルリクエストの作成を示すために、例cloud_haiku
リポジトリを使用して、ローカルコピーに新しいファイルを作成しましょう。 寄稿ガイドラインで説明されているように、新しい俳句を追加できるように、好みのテキストエディタを使用して新しいファイルを作成します。 たとえば、nanoを使用して、サンプルファイルをfilename.md
と呼ぶことができます。 Markdownの拡張子が.md
の元の名前でファイルを呼び出す必要があります。
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 commit
は次のようになります。
git commit -m "Added a new haiku in filename.md file"
マイナーな変更または予想される変更でない限り、共同作業者が私たちの貢献に完全に対応できるように、より長いコミットメッセージを含めることをお勧めします。 この大きなメッセージを録音するには、git commit
コマンドを実行して、デフォルトのテキストエディタを開きます。
git commit
このコマンドを実行すると、vimエディターが表示されていることに気付く場合があります。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
行った変更に応じて、次のような出力が表示されます。
OutputOn branch new-branch
nothing to commit, working tree clean
この時点で、git push
コマンドを使用して、フォークされたリポジトリの現在のブランチに変更をプッシュできます。
git push --set-upstream origin new-branch
このコマンドは、進行状況を通知する出力を提供します。これは、次のようになります。
OutputCounting 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プロジェクトで他のユーザーと共同作業を行うことができます。 各リモートリポジトリは、インターネットまたはアクセス可能なネットワークでホストされているプロジェクトのバージョンです。 各リモートリポジトリには、ユーザー権限に応じて、読み取り専用または読み取り/書き込みのいずれかでアクセスできる必要があります。
フォークで行った変更を、使用している元のリポジトリと同期できるようにするには、アップストリームリポジトリを参照するリモートを構成する必要があります。 リモートをアップストリームリポジトリに設定するのは1回だけです。
まず、構成したリモートサーバーを確認しましょう。 git remote
コマンドは、すでに指定したリモートリポジトリを一覧表示するため、上記のようにリポジトリのクローンを作成した場合、少なくとも元のリポジトリに関する出力を受け取ります。これは、Gitによって指定されたデフォルトの名前です。複製されたディレクトリ。
ターミナルウィンドウのリポジトリのディレクトリから、git remote
コマンドと-v
フラグを使用して、Gitが保存したURLと関連するリモートショートネームを表示します(「origin」のように) ”)::
git remote -v
リポジトリのクローンを作成したので、出力は次のようになります。
Outputorigin 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に関して、「アップストリーム」はクローンを作成したリポジトリを指すためです。 共同編集者のリポジトリにリモートポインタを追加する場合は、その共同編集者のユーザー名または短縮名の短縮ニックネームを指定することをお勧めします。
リポジトリディレクトリからgit remote -v
コマンドを再度使用することにより、アップストリームリポジトリへのリモートポインタが正しく追加されたことを確認できます。
git remote -v
Outputorigin 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全体を書き込む代わりに、コマンドラインでupstream
を参照できるようになり、フォークを元のリポジトリと同期する準備が整いました。
フォークを同期する
GitHubのアップストリームリポジトリと元のリポジトリを参照するリモートを構成したら、リポジトリのフォークを同期して最新の状態に保つ準備ができています。
ターミナルウィンドウのローカルリポジトリのディレクトリからフォークを同期するには、git fetch
コマンドを使用して、アップストリームリポジトリからそれぞれのコミットとともにブランチをフェッチします。 短縮名「upstream」を使用してアップストリームリポジトリを参照したので、それをコマンドに渡します。
git fetch upstream
リポジトリをフォークしてから行われた変更の数に応じて、出力が異なる場合があり、オブジェクトのカウント、圧縮、および解凍に関する数行が含まれる場合があります。 出力は次の行と同様に終了しますが、プロジェクトに含まれるブランチの数によって異なる場合があります。
OutputFrom https://github.com/original-owner-username/original-repository
* [new branch] main -> upstream/main
これで、メインブランチへのコミットはupstream/main
というローカルブランチに保存されます。
リポジトリのローカルメインブランチに切り替えましょう。
git checkout main
OutputSwitched to branch 'main'
ここで、元のリポジトリのメインブランチで行われた変更をマージします。これには、ローカルのupstream/main
ブランチを介してアクセスし、ローカルのメインブランチを使用します。
git merge upstream/main
ここでの出力は異なりますが、変更が加えられている場合はUpdating
で始まり、Already up-to-date
で始まります。 リポジトリをフォークしてから変更が加えられていない場合。
これで、フォークのメインブランチがアップストリームリポジトリと同期され、ローカルで行った変更が失われることはありませんでした。
独自のワークフローと変更に費やす時間に応じて、フォークを元のリポジトリのアップストリームコードと何度でも同期できます。 ただし、プルリクエストを行う直前にフォークを同期して、競合するコードが自動的に提供されないようにする必要があります。
プルリクエストの作成
この時点で、元のリポジトリへのプルリクエストを行う準備ができています。
フォークされたリポジトリに移動し、ページの左側にある新しいプルリクエストボタンを押す必要があります。
次の画面でブランチを変更できます。 どちらの側でも、ドロップダウンメニューと適切なブランチから適切なリポジトリを選択できます。
たとえば、左側の元のリポジトリのメインブランチと、右側のフォークされたリポジトリの new-branch を選択すると、次の画面が表示されます。競合するコードがない場合は、ブランチをマージできると述べています。
適切なフィールドにタイトルとコメントを追加してから、プルリクエストの作成ボタンを押す必要があります。
この時点で、元のリポジトリのメンテナがプルリクエストを受け入れるかどうかを決定します。 コードレビューを送信してプルリクエストを受け入れる前に、コードを編集または修正するように求められる場合があります。
結論
この時点で、プルリクエストがオープンソースソフトウェアリポジトリに正常に送信されています。 これに続いて、レビューを受けるのを待っている間、コードを更新してリベースする必要があります。 プロジェクトのメンテナはあなたにあなたのコードを作り直すように頼むかもしれないので、あなたはそうする準備をしなければなりません。
オープンソースプロジェクトに貢献すること、そしてアクティブなオープンソース開発者になることは、やりがいのある経験になる可能性があります。 頻繁に使用するソフトウェアに定期的に貢献することで、そのソフトウェアが他のエンドユーザーにとって可能な限り価値のあるものになるようにすることができます。
Gitの詳細とオープンソースソフトウェアでのコラボレーションに興味がある場合は、オープンソースの概要というタイトルのチュートリアルシリーズを読むことができます。 すでにGitに精通していて、チートシートが必要な場合は、「 Gitの使用方法:リファレンスガイド」を参照してください。