pull コマンドを使用して共同作業を行う

完了

新しい仕事以外のダウンタイムに、猫の写真をホストする Web サイトで作業を行ってきました。 バージョン管理に Git を使用してきました。ここで、コラボレーターをプロジェクトに招待します。 自宅でのピザ パーティで、友達であり猫好きの仲間である Alice から、あなたの思い描いていることの実現を手伝うと申し出があり、あなたは喜んで受け入れました。

Alice は、まずあなたの Git プロジェクトのコピーを作成する必要があります。 その後、Alice は自分で行った変更をあなたに送信したいと考えています。 この状況では、Git の "分散型" という性質が生かされます。 Git を使用することで、2 人以上の人が互いの作業を上書きする心配なく、プロジェクトで共同作業を行うことができます。 さらに、自分の作業とマージする前に、Alice の作業を確認することができます (Alice は優秀ですが、完璧な開発者はいません。信頼できても検証します)。

このレッスンでは、リポジトリ (リポ ともいう) をクローンして他の人が使用できるようにする方法を学習します。 また、Git の最も重要な機能の 1 つであるプル要求を使用する方法についても説明します。

リポジトリをクローンする (git clone)

Git では、git clone コマンドを使用してリポジトリを "クローンする" ことでコピーします。 指定先の URL またはパスがわかってさえいれば、格納先に関係なくリポジトリをクローンすることができます。

git clone で受け入れられるのは、ファイル システム パス、SSH パス (git@example.com:alice/Cats など。Rsync または SCP を使用したことがある場合は、この形式をよく理解できるようでしょう)、または URL で、通常は、file:git:、または ssh で始まります。 さまざまな形式については、git clone に関するドキュメントで説明されています。 Unix および Linux では、クローン操作でハード リンクが使用されます。これらは高速であり、最小限のスペースが使用されます。これは、ディレクトリ エントリのみをコピーし、ファイルをコピーする必要がないためです。

リモート リポジトリ (git pull)

Git でリポジトリがクローンされると、origin という名前を使用して、''リモート'' と呼ばれる元のリポジトリへの参照が作成されます。 クローンされたリポジトリでリモート リポジトリから ''プルする'' またはデータを取得するように、クローンされたリポジトリが設定されます (Git でプッシュすることもできます。Git でのプッシュについては、このモジュールで後ほど説明します)。origin は、変更をプルし、変更をプッシュする Git の既定の場所です。 git pull では、リモートのリポジトリからローカルのものに変更をコピーします。 "新しい" コミットとオブジェクトのみをコピーしてから、それらを作業ツリーにチェックインするだけなので、git pull コマンドは非常に効率的です。

git pull コマンドを使用して、origin からプルします。 git pull を他のファイル コピー方法と比較することは有用です。 scp コマンドを実行すると、すべてがコピーされます (scp は Unix の cp コマンドと似ていますが、コピーするファイルが同じコンピューター上になくてもかまわないという点が異なります)。リモート ディレクトリに 10,000 個のファイルがある場合、scp ではそれらすべてがコピーされます。 Rsync というより効率的なプログラムでは、ローカルおよびリモートのディレクトリ内にあるすべてのファイルを確認して、異なるものだけをコピーします。 Rsync はバックアップの作成によく使用されますが、ファイルのサイズや作成日が異なる場合を除き、やはりすべてのファイルをハッシュする必要があります。

Git ではコミットを確認するだけです。 リモート リポジトリから行われた最後のコミットが既に認識されています。これは、コミットのリストが保存されているためです。 その後、Git によってコピー元のコンピューターに対して、変更されたすべてのもの (新しいコミットと、それらの指定先オブジェクトを含む) を送信することが指示されます。 これらのコミットとオブジェクトは "パック" と呼ばれるファイルにまとめられ、1 回のバッチで送信されます。 最後に、Git では、変更されたすべてのオブジェクトをアンパックし、(必要に応じて) それらを作業ツリー内のコミットおよびオブジェクトとマージすることで、作業ツリーを更新します。

Git では、指定したときにのみプルまたはプッシュが行われます。 これは、たとえば Dropbox の場合とは異なります。Dropbox では、ユーザーがフォルダーで加えた変更をオペレーティング システムから Dropbox に通知する必要があり、場合によっては他のユーザーが変更を加えたかどうかをサーバーに確認する必要があります。

pull request を作成する (git request-pull)

Alice のような別の開発者があなたのリポジトリをクローンしてローカルで変更を加えた後で、それらの変更を元のリポジトリに反映させる必要があります。 それらの変更を元のリポジトリにプッシュすることが適切な手法のように見えるかもしれません。 しかし、他のユーザーにはあなたのリポジトリを変更する権限がないため、元のリポジトリへのプッシュは失敗します。 それは当然のことです。 ここでは、受信した変更をマスター コード ベースにマージする前に確認する必要があります。

ここでは、Alice は pull request を送信して、変更をメイン コード ベースにプルするように求める必要があります。 Alice は、git request-pull を使用して、それを行うことができます。この例では次のようになります。

git request-pull -p origin/main .

Alice は、origin リモート上の main ブランチを origin/main と呼んでいます。

この pull request は、基本的には GitHub での pull request と同じものです (GitHub はコードを格納するための場所であり、このモジュールでは扱いません)。 pull request を使用すると、他のコラボレーターの変更をレビューしてから、彼らの作業を、あなたが Web サイトで行う作業に組み込むことができます。 コード レビューはコラボレーション プログラミングの重要な部分です (最も重要な部分だと言う人もいるでしょう)。

リモート (git remote) を作成し、pull request を完了する (git pull)

プロジェクト所有者として、あなたは pull request をマージする方法を知っておく必要があります。 最初に、git remote コマンドを使用して、別の開発者のリポジトリを ''リモート'' として設定します。 その後、git pull コマンドを使って、そのリモートをプルおよび pull request に使用します。

git pull では、2 つの単純な操作の組み合わせがバックグラウンドで使用されます。変更を取得する git fetch と、それらの変更をリポジトリにマージする git merge です。 この場合、マージは "高速前進" されています。つまり、Alice は自分のリポジトリにあなたの最新のコミットを保持しているので、自身のコミットをあなたの履歴の先頭に追加することができ、変更の必要はありません。