前書き

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

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

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

前提条件

ローカルマシンにGitをインストールする必要があります。 Gitがコンピューターにインストールされているかどうかを確認し、https://www.digitalocean.com/community/tutorials/an-introduction-to-contributing-to-open-source-に従ってオペレーティングシステムのインストールプロセスを実行できます。 projects-and-installing-git#check-if-git-is-installed [このガイド]。

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

最後に、貢献するオープンソースソフトウェアプロジェクトを特定する必要があります。 this前書き

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

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

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

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

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

GitHubリポジトリのURLは、リポジトリの所有者に関連付けられたユーザー名とリポジトリ名の両方を参照します。 たとえば、DigitalOcean Communityはhttps://github.com/do-community/cloud_haiku[cloud_haiku]プロジェクトリポジトリの所有者であるため、そのプロジェクトのGitHub URLは次のとおりです。

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

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

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

https://github.com//

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

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

画像:https://assets.digitalocean.com/articles/eng_python/PullRequest/GitHub_Repo.gif [GitHub Forking]

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

image:https://assets.digitalocean.com/articles/eng_python/PullRequest/GitHub_Forking.png [GitHubでフォーク]

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

したがって、上記の例では、ページの上部にある* do-community / cloud_haiku の代わりに / cloud_haiku *が表示され、新しいURLは次のようになります。

https://github.com//cloud_haiku

リポジトリがフォークされたら、クローンを作成して、コードベースのローカル作業コピーを作成します。

リポジトリの複製

貢献したいリポジトリのローカルコピーを作成するには、まずターミナルウィンドウを開きます。

リポジトリのフォークを指すURLとともに、 `+ git clone +`コマンドを使用します。

このURLは、上記のURLに似ていますが、 `+ .git +`で終わる点が異なります。 上記のcloud_haikuの例では、URLは次のようになります。

https://github.com//cloud_haiku.git

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

image:https://assets.digitalocean.com/articles/eng_python/PullRequest/GitHubClipboardWide.png [GitHubクローンまたはダウンロード]

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

git clone https://github.com//.git

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

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

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

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

ブランチを作成するときは、マスターブランチから新しいブランチを作成することが非常に重要です。 また、ブランチ名が説明的なものであることを確認する必要があります。 + my-branch +`を呼び出すのではなく、代わりに `+ frontend-hook-migration`または + fix-documentation-types`を使用する必要があります。

ターミナルウィンドウからブランチを作成するには、リポジトリのディレクトリで作業するようにディレクトリを変更しましょう。 リポジトリの実際の名前( `+ cloud_haiku +`など)を使用して、そのディレクトリに移動してください。

cd

ここで、 `+ git branch +`コマンドで新しいブランチを作成します。 プロジェクトで作業している他の人が作業内容を理解できるように、わかりやすい名前を付けてください。

git branch

新しいブランチが作成されたので、 `+ git checkout +`コマンドを使用して、そのブランチで作業していることを確認するように切り替えることができます。

git checkout

`+ git checkout +`コマンドを入力すると、次の出力が表示されます。

OutputSwitched to branch ''

あるいは、次のコマンドと `+ -b +`フラグを使用して、上記の2つのコマンドを作成し、新しいブランチに切り替えて切り替えることができます。

git checkout -b

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

git checkout master

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

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

ローカルで変更を行う

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

git add -A

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

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

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

git commit -m ""

しかし、それが非常に小さな変更でない限り、私たちの協力者が私たちの貢献に完全に対応できるように、おそらくより長いコミットメッセージを含めたいと思うでしょう。 この大きなメッセージを記録するために、デフォルトのテキストエディターを開く `+ 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
# Your branch is up-to-date with 'origin/'.
#
# Changes to be committed:
#       modified:   .py
#

導入コメントの下に、コミットメッセージをテキストファイルに追加する必要があります。

有用なコミットメッセージを作成するには、最初の行に約50文字の要約を含める必要があります。 この下に、消化可能なセクションに分割して、この変更を行った理由、コードの仕組み、および他の人がそれをマージするときに作業を確認できるようにコンテキスト化および明確化する追加情報を記載した説明を含める必要があります。 プロジェクトを維持している人があなたの貢献を完全に理解できるように、できる限り手助けをし、積極的になるようにしてください。

コミットメッセージテキストファイルを保存して終了したら、次のコマンドを使用して、どのgitがコミットするかを確認できます。

git status

行った変更に応じて、次のような出力が表示されます。

OutputOn branch
Your branch is ahead of 'origin/' by .
 (use "git push" to publish your local commits)
nothing to commit, working directory clean

この時点で、 `+ git push +`コマンドを使用して、分岐したリポジトリの現在のブランチに変更をプッシュできます。

git push --set-upstream origin

このコマンドは、進行状況を知らせる出力を提供し、次のようになります。

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/ / .git
  a1f29a6..79c0e80    ->
Branch  set up to track remote branch   from origin.

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

この時点で、https://www.digitalocean.com/community/tutorials/how-to-create-a-pull-request-on-github#create-pull-request [プルリクエストを作成]にアクセスすることができます。元のリポジトリですが、まだ行っていない場合は、ローカルリポジトリがアップストリームリポジトリで最新であることを確認する必要があります。

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

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

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

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

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

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

まず、設定したリモートサーバーを確認しましょう。 `+ git remote +`コマンドは、既に指定したリモートリポジトリを一覧表示するため、上記のようにリポジトリのクローンを作成すると、少なくとも元のリポジトリが表示されます。これは、Gitがクローンディレクトリに指定したデフォルト名。

ターミナルウィンドウのリポジトリのディレクトリから、 `+ git remote `コマンドと ` -v +`フラグを使用して、Gitが関連するリモートショートネーム(「origin」など)とともに保存したURLを表示します。 :

git remote -v

リポジトリを複製したため、出力は次のようになります。

Outputorigin  https://github.com//.git (fetch)
origin  https://github.com//.git (push)

以前に複数のリモートを設定している場合、 `+ git remote -v +`コマンドはそれらすべてのリストを提供します。

次に、フォークと同期するための新しいリモートアップストリームリポジトリを指定します。 これは、分岐元の元のリポジトリになります。 これを行うには、 `+ git remote add`コマンドを使用します。

git remote add upstream https://github.com//.git

この例では、「+ upstream +」はリモートリポジトリに指定した短縮名です。これは、Gitの観点から「上流」とは複製元のリポジトリを指すためです。 共同編集者のリポジトリにリモートポインターを追加する場合は、その共同編集者のユーザー名または短縮名の短縮ニックネームを指定することができます。

リポジトリディレクトリから再度 `+ git remote -v +`コマンドを使用して、アップストリームリポジトリへのリモートポインタが適切に追加されたことを確認できます。

git remote -v
Outputorigin  https://github.com//.git (fetch)
origin  https://github.com//.git (push)
upstream    https://github.com//.git (fetch)
upstream    https://github.com//.git (push)

これで、URL全体を書き込む代わりにコマンドラインで「+ upstream +」を参照でき、フォークを元のリポジトリと同期する準備ができました。

フォークを同期する

GitHubの上流および元のリポジトリを参照するリモートを構成したら、リポジトリのフォークを同期して最新の状態に保つ準備ができました。

ターミナルウィンドウのローカルリポジトリのディレクトリからフォークを同期するには、 `+ git fetch +`コマンドを使用して、アップストリームリポジトリからそれぞれのコミットとともにブランチをフェッチします。 短縮名「upstream」を使用してアップストリームリポジトリを参照したため、それをコマンドに渡します。

git fetch upstream

リポジトリをフォークしてから何回の変更が行われたかによって、出力が異なる場合があり、オブジェクトのカウント、圧縮、およびアンパックに関する数行が含まれる場合があります。 出力は次の行と同様に終了しますが、プロジェクトに含まれるブランチの数によって異なる場合があります。

OutputFrom https://github.com//
* [new branch]      master     -> upstream/master

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

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

git checkout master
OutputSwitched to branch 'master'

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

git merge upstream/master

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

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

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

プルリクエストを作成

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

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

image:https://assets.digitalocean.com/articles/eng_python/PullRequest/PRButton.png [GitHub Pull Request Button]

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

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

image:https://assets.digitalocean.com/articles/eng_python/PullRequest/PullRequest.png [GitHub Pull Request]

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

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

結論

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

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

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