GitHubでプルリクエストを作成する方法

前書き

無料でオープンソースのGitは、共同ソフトウェアプロジェクトの管理を容易にする分散バージョン管理システムです。 多くのプロジェクトはGitリポジトリにファイルを保持しており、GitHubなどのサイトでは、コードの共有と貢献がコードをシンプルで、価値があり、効果的にしています。

パブリックリポジトリでホストされているオープンソースプロジェクトは、プルリクエストを通じてより広範な開発者コミュニティが行った貢献の恩恵を受けます。プルリクエストは、プロジェクトがコードリポジトリに加えた変更を受け入れることを要求します。

このチュートリアルでは、コマンドラインを使用してGitリポジトリにプルリクエストを作成し、オープンソースソフトウェアプロジェクトに貢献できるようにします。

前提条件

ローカルマシンにGitをインストールする必要があります。 this guideを実行すると、Gitがコンピューターにインストールされているかどうかを確認し、オペレーティングシステムのインストールプロセスを実行できます。

GitHubアカウントを持っているか作成する必要もあります。 これは、GitHub Webサイトgithub.comから行うことができ、ログインするか、アカウントを作成することができます。

最後に、貢献するオープンソースソフトウェアプロジェクトを特定する必要があります。 this introductionを読むことで、オープンソースプロジェクトに慣れることができます。

リポジトリのコピーを作成する

repository、または略してrepoは、基本的にプロジェクトのメインフォルダーです。 リポジトリには、ドキュメントを含むすべての関連プロジェクトファイルが含まれ、各ファイルの改訂履歴も保存されます。 GitHubでは、リポジトリに複数の共同編集者を含めることができ、公開または非公開にできます。

オープンソースプロジェクトで作業するには、まずリポジトリの独自のコピーを作成する必要があります。 これを行うには、リポジトリをフォークしてからクローンを作成して、ローカルの作業コピーを作成する必要があります。

リポジトリをフォークする

ブラウザを使用して、貢献したいオープンソースプロジェクトのGitHub URLに移動することで、GitHubでリポジトリをフォークできます。

GitHubリポジトリのURLは、リポジトリの所有者に関連付けられたユーザー名とリポジトリ名の両方を参照します。 たとえば、DigitalOceanコミュニティはcloud_haikuプロジェクトリポジトリの所有者であるため、そのプロジェクトのGitHubURLは次のようになります。

https://github.com/do-community/cloud_haiku

上記の例では、do-communityはユーザー名であり、cloud_haikuはリポジトリ名です。

貢献したいプロジェクトを特定したら、次のようにフォーマットされるURLに移動できます。

https://github.com/username/repository

または、GitHub検索バーを使用してプロジェクトを検索できます。

リポジトリのメインページを開くと、ページの右上、ユーザーアイコンの下に「フォーク」ボタンが表示されます。

GitHub Forking

分岐ボタンをクリックして、分岐プロセスを開始します。 ブラウザウィンドウ内で、次のようなフィードバックを受け取ります。

Forking on GitHub

プロセスが完了すると、ブラウザは上のリポジトリ画像のような画面に移動しますが、上部にはリポジトリ名の前にユーザー名が表示され、URLではリポジトリ名の前にユーザー名も表示されます。

したがって、上記の例では、ページ上部のdo-community / cloud_haikuの代わりに、your-username / 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

または、元のリポジトリページから分岐したばかりのリポジトリページから緑色の[クローンまたはダウンロード]ボタンを使用して、URLをコピーすることもできます。 ボタンをクリックすると、URLの横にあるバインダーボタンをクリックしてURLをコピーできます。

GitHub Clone or Download

URLを取得したら、リポジトリを複製する準備ができました。 これを行うには、git cloneコマンドをターミナルウィンドウのコマンドラインからのリポジトリURLと組み合わせます。

git clone https://github.com/your-username/repository.git

コードのローカルコピーができたので、コードを操作するための新しいブランチの作成に進むことができます。

新しいブランチを作成する

共同プロジェクトで作業するときはいつでも、あなたとリポジトリに貢献している他のプログラマーは、新しい機能や修正について異なるアイデアを一度に持っています。 これらの新機能の一部は実装にそれほど時間はかかりませんが、一部は継続中です。 このため、ワークフローを管理し、コードを分離し、プロジェクトリポジトリのメインブランチに戻す機能を制御できるように、リポジトリをブランチすることが重要です。

プロジェクトリポジトリのデフォルトのメインブランチは、通常、masterブランチと呼ばれます。 一般的なベストプラクティスは、masterブランチ上のすべてのものを、他の人がいつでも使用できるように展開可能であると見なすことです。

ブランチを作成するときは、マスターブランチから新しいブランチを作成することが非常に重要です。 また、ブランチ名が説明的なものであることを確認する必要があります。 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

マスターに戻す場合は、マスターブランチの名前を指定してcheckoutコマンドを使用します。

git checkout master

checkoutコマンドを使用すると、複数のブランチを切り替えることができるため、一度に複数の機能を操作できる可能性があります。

この時点で、既存のファイルを変更したり、独自のブランチのプロジェクトに新しいファイルを追加したりできるようになりました。

ローカルで変更を行う

既存のファイルを変更したり、プロジェクトに新しいファイルを追加したりしたら、それらをローカルリポジトリに追加できます。これは、git addコマンドで実行できます。 -Aフラグを追加して、行ったすべての変更を追加しましょう。

git add -A

次に、git commitコマンドを使用してリポジトリに加えた変更を記録します。

commit messageは、コードの貢献の重要な側面です。これは、他の寄稿者があなたが行った変更、あなたがそれを行った理由、そしてそれがどれほど重要であるかを完全に理解するのに役立ちます。 さらに、コミットメッセージはプロジェクト全体の変更の履歴レコードを提供し、将来の貢献者を支援します。

非常に短いメッセージがある場合は、-mフラグとメッセージを引用符で囲んで記録できます。

git commit -m "Fixed documentation typos"

しかし、それが非常に小さな変更でない限り、私たちの協力者が私たちの貢献に完全に対応できるように、おそらくより長いコミットメッセージを含めたいと思うでしょう。 この大きなメッセージを記録するには、git commitコマンドを実行して、デフォルトのテキストエディタを開きます。

git commit

デフォルトのテキストエディタを設定する場合は、git configコマンドを使用して設定し、nanoをデフォルトのエディタとして設定できます。次に例を示します。

git config --global core.editor "nano"

またはvim:

git config --global core.editor "vim"

git commitコマンドを実行した後、使用しているデフォルトのテキストエディタに応じて、ターミナルウィンドウに、次のような編集可能なドキュメントが表示されます。

GNU nano 2.0.6ファイル:…ユーザー名/リポジトリ/.git/COMMIT_EDITMSG

# 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
Your branch is ahead of 'origin/new-branch' by 1 commit.
  (use "git push" to publish your local commits)
nothing to commit, working directory 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 /respository .git
   a1f29a6..79c0e80  new-branch  -> new-branch
Branch new-branch set up to track remote branch new-branch  from origin.

これで、GitHub Webページの分岐したリポジトリに移動し、プッシュしたブランチに切り替えて、ブラウザーで行った変更を確認できます。

この時点で、元のリポジトリにmake a pull requestすることは可能ですが、まだ行っていない場合は、ローカルリポジトリがアップストリームリポジトリで最新であることを確認する必要があります。

ローカルリポジトリを更新

他の貢献者と一緒にプロジェクトに取り組んでいる間、競合を引き起こすコードのプルリクエストを行いたくないので、ローカルリポジトリをプロジェクトに合わせて最新の状態に保つことが重要です。 コードベースのローカルコピーを最新の状態に保つには、変更を同期する必要があります。

まず、フォークのリモートを設定し、次にフォークを同期します。

フォークのリモートを構成する

Remote repositoriesを使用すると、Gitプロジェクトで他のユーザーと共同作業を行うことができます。 各リモートリポジトリは、インターネットまたはアクセスできるネットワークでホストされているプロジェクトのバージョンです。 各リモートリポジトリは、ユーザー権限に応じて、読み取り専用または読み取り/書き込みのいずれかでアクセスできる必要があります。

フォークで行った変更を作業中の元のリポジトリと同期できるようにするには、アップストリームリポジトリを参照するリモートを設定する必要があります。 アップストリームリポジトリへのリモートは一度だけセットアップする必要があります。

まず、設定したリモートサーバーを確認しましょう。 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

この例では、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]      master     -> upstream/master

これで、マスターブランチへのコミットはupstream/masterというローカルブランチに保存されます。

リポジトリのローカルマスターブランチに切り替えましょう。

git checkout master
OutputSwitched to branch 'master'

次に、元のリポジトリのマスターブランチで行われた変更をマージします。これは、ローカルのアップストリーム/マスターブランチを介して、ローカルのマスターブランチにアクセスします。

git merge upstream/master

ここでの出力は異なりますが、変更が加えられた場合はUpdatingで始まり、リポジトリをフォークしてから変更が加えられていない場合はAlready up-to-date.で始まります。

これで、フォークのマスターブランチはアップストリームリポジトリと同期し、ローカルで行った変更は失われませんでした。

独自のワークフローと変更に費やす時間に応じて、必要に応じて何度でもフォークを元のリポジトリのアップストリームコードと同期できます。 ただし、プルリクエストを行う直前にフォークを同期して、競合するコードを提供しないようにしてください。

プルリクエストを作成

この時点で、元のリポジトリにプルリクエストを行う準備ができました。

分岐したリポジトリに移動し、ページの左側にある[新しいプルリクエスト]ボタンを押す必要があります。

GitHub Pull Request Button

次の画面でブランチを変更できます。 どちらのサイトでも、ドロップダウンメニューと適切なブランチから適切なリポジトリを選択できます。

たとえば、左側の元のリポジトリのマスターブランチと、右側のフォークされたリポジトリのnew-branchを選択すると、次のような画面が表示されます。

GitHub Pull Request

GitHubは、競合するコードがないため、2つのブランチをマージできることを警告します。 タイトルとコメントを追加してから、「プルリクエストの作成」ボタンを押す必要があります。

この時点で、元のリポジトリのメンテナーがプルリクエストを受け入れるかどうかを決定します。 プルリクエストを受け入れる前に、コードの編集または修正を依頼する場合があります。

結論

この時点で、プルリクエストをオープンソースソフトウェアリポジトリに正常に送信しました。 これに続いて、レビューを待っている間にコードを更新してリベースすることを確認する必要があります。 プロジェクトのメンテナーからコードの修正を依頼される場合がありますので、準備を整えてください。

オープンソースプロジェクトに貢献すること、そしてアクティブなオープンソース開発者になることは、やりがいのある経験になる可能性があります。 頻繁に使用するソフトウェアに定期的に貢献することにより、そのソフトウェアが他のエンドユーザーにとってできる限り価値があることを確認できます。

Gitの詳細とオープンソースでのコラボレーションに興味がある場合は、An Introduction to Open Sourceというタイトルのチュートリアルシリーズを読むことができます。 すでにGitに精通しており、チートシートが必要な場合は、「https://www.digitalocean.com/community/tutorials/how-to-use-git-a-reference-guide[How Gitを使用するには:リファレンスガイド]。」