リモートと GitHub


このハンドブックのこれまでのすべてのリポジトリは、1 つの場所、つまり自分のマシンに置かれていました。これはデッドノートパソコンを乗り越えるバックアップが必要になるまで、2 番目のコンピュータからプロジェクトをピックアップしたい、または誰かが他のコードに触れたいという時点まで、うまく機能します。必要なのは、関連するすべてのマシンがアクセスできる場所に置かれたリポジトリのコピーです。そのコピーはリモートと呼ばれ、GitHubはほとんどの開発者がそれを置く場所です。
リモートとは何か (GitHub がどこに適合するか)
**リモート**は、自分のマシン以外の場所でホストされているリポジトリのコピーで、ほとんどの場合 GitHub にあります。リポジトリをクローンすると、Git は既にデフォルトで origin という名前で 1 つを設定しています。git remote -v を実行します (実行すると、-v は名前と URL の両方が必要です):
$ git remote -v
origin https://github.com/tanaka-hanako/weather-app.git (fetch)
origin https://github.com/tanaka-hanako/weather-app.git (push)Git が知っているすべてのリモートがリストされます。1 つはフェッチ用、1 つはプッシュ用です。理論的には、2 つは異なるアドレスを指す可能性があるためです。実際には、ほぼ常に同じものです。origin は、クローンで自動的に割り当てられるニックネームです。名前を変更するか、別のリモートを追加して別の場所を指すことができますが、ほぼすべてのプロジェクトがメインリモートを origin と呼びます。
これは、ほぼすべての初心者を混乱させる区別を再度述べるのに適切な時期です: Git と GitHub は同じものではありません。Git は、接続されているかどうかに関わらず、マシンで実行されているバージョン管理ツールであり、コミットを記録します。GitHub は、リポジトリのコピーをホストし、プッシュおよびプルするリモートを提供する Web サイトです。git remote、git push、git pull は 2 つを接続するコマンドです。ラップトップで実行している Git が GitHub のサーバー上にあるリポジトリと通信する方法です。
origin と呼びます。いつでも git remote -v を実行して、リポジトリが知っているリモートを確認します。Git と GitHub は同じものではありません。Git はマシン上のツールであり、GitHub はリモートが多くの場合生きている場所です。その分割をすぐに理解すると、後で多くの混乱が保存されます。 リモートをホストする場所: GitHub と代替案
リモートが実行するすべてのことはプレーン Git です。これは結果を伴います。知っておく価値がある: 反対側のホストは交換可能です。Git にとって、すべてのホストは設定内の URL であり、git push、git pull、git fetch はすべてのホストに対して同じように動作します。ホストが追加する内容は 1 層上にあります: コードの Web ビュー、レビュー フロー、問題の追跡、およびアクセス制御。以下は、トレードオフを明確に述べた風景です:
- GitHub は圧倒的に最大であり、オープンソース作業の大多数をホストしています。その強みはネットワークです。貢献したいプロジェクトはすでにそこにあり、チュートリアルがそれを想定し、雇用主はそのプロファイルを探しています。トレードオフは、それが閉じたプラットフォーム (Microsoft が所有する) であり、Git ホスティング以上のその余分なものに依存するほど、それにより多く結びついてしまうということです。
- GitLab は最も近い完全な代替案であり、わずかに異なる名前で同じコア機能を備えています (プルリクエストは「マージリクエスト」です)。その成果は、自分のサーバーで実行できるセルフマネージド版です。これが、コードを社内に保つ企業がそれを選択する理由です。トレードオフは、それが多くをバンドルすることであり、プラットフォームは、あなたが来たコード ホスティングよりも重く感じることができます。
- Bitbucket は Atlassian からのホストで、プロジェクト追跡および文書ツール、Jira および Confluence の横に座るように構築されています。チームが既にそれらのツールに住んでいる場合、それは直接スロットします。そのエコシステム外では、それは大きな 3 つの中で最も小さなコミュニティを持っており、オープンソースの存在はほとんどありません。
- Codeberg はオープンソース プロジェクト用の非営利ホストであり、オープンソース プラットフォーム Forgejo で実行されています。その魅力は、どの会社もホストを所有しておらず、プラットフォーム自体がオープン ソースであるということです。トレードオフはスケールです。統合が少なく、コミュニティが小さく、プライベート チーム ワークではなくオープン ソースに焦点を当てています。
- セルフホスティング はこれらすべての基礎にあります: Forgejo または Gitea を実行します。どちらも無料でオープン ソースであるか、制御されたハードウェアで GitLab の自己管理版を実行してください。完全な制御とプライバシーが得られます。トレードオフは、それを実行し続けることがあなたの仕事になるということです。
このハンドブックはその例で GitHub を使用しています。これは、ほとんどのオープン ソース作業をホストしており、最初に協力する可能性が最も高い場所です。このチャプターのすべてのコマンドは、他のホストに変わらずに転送されます: URL をスワップして、日次ループは同じままです。違いは 1 層上に住んでいます。各サイトの Web インターフェースで、作業をレビューおよびマージするため、次のチャプターの pull request flow がそこに入ります。
作業を送受信する: git push と git pull
リモートが設定されたら、2 つのコマンドがほぼすべての日常業務をカバーします。git push はローカル コミットをリモートに送信します。git pull は他の場所で作成されたコミットをダウンロードして、作成されているブランチにマージします。
$ git push origin main
Enumerating objects: 5, done.
Writing objects: 100% (3/3), 312 bytes | 312.00 KiB/s, done.
To https://github.com/tanaka-hanako/weather-app.git
9f8e7d6..a1b2c3d main -> mainorigin はリモート、main は送信しているブランチです。最後の行は読む価値のある部分です: リモート上の main が 1 つのコミットから次のコミットに移動することを示します。
プルは同じように機能し、逆に:
$ git pull origin main
remote: Enumerating objects: 4, done.
Unpacking objects: 100% (4/4), done.
Updating a1b2c3d..b7c9e21
Fast-forward
src/index.js | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)これはプロジェクト上の他の人と一緒に働くための全体のループです: 始める前に変更がダウンしたものをプルしてください。自分の仕事を行い、コミットしてください。それを戻してプッシュしてください。ブランチを他の人と共有するときは常に、プッシュする前にプルしてください。プルをスキップし、プッシュは見たことがないコミットの上に着陸することができます。Git はそれを拒否します。誰かの仕事を失うリスク。
git push はコミットをリモートに送信し、git pull はコミットをダウンロードし、他の場所で作成されたコミットをブランチにマージします。開始する前にプルして、完了したときにプッシュすると、プロジェクトに他の人がいるか、プロジェクトに触れると、その人と同期しているままになります。プルをスキップすることは、プッシュが拒否される最も一般的な理由です。 git fetch と git pull
git pull は 1 つのステップで 2 つのことを行います。リモートで変更されたものをダウンロードしてから、すぐにそれらの変更を作成されているブランチにマージします。git fetch は前半のみを行います。新しいコミットをダウンロードしますが、ブランチにマージしません。現在のブランチとワーキング ファイルは、Git をマージまたはプルするように指示するまで、正確にそこにあります。
これはほぼすべての人がすくなくとも1回ヒットする trip-up です: git fetch を実行して、どこでも目に見える変化がなく、リモートで何も起こっていないと想定してください。何か起こりました: フェッチはまだワーキング ブランチに触れていません。ダウンしたものを確認するには、このチャプターの前半のリモート追跡ブランチを見てください: git log origin/main は、ローカル main に到達していないリモートに座っているコミットを表示します。それらを持ってくる準備ができたら、git merge origin/main がそれを行います。または git pull は、フェッチとそのマージを 1 つのコマンドで実行します。
git pull は新しいコミットをダウンロードし、1 つのステップでブランチにマージします。git fetch は、それらをダウンロードし、Git のメモリー、リモートがどこに立っているかを更新するだけです。ブランチは、マージするまでは残ります。フェッチ直後にファイル内に何も変わるのは予想通りですが、新しいコミットはリモート追跡ブランチで待機しています。 ここであなたはどこに着地するか
プッシュ、プル、フェッチは、共有リモートの上下でコミットを取得します。これは、Git での日常的なコラボレーションがほぼ必要とするものをカバーしています。ここのすべては、commit loop の上に構築されます: あなたはまだ最初にローカルでステージングしてコミットしています。リモートは、それらのコミットが移動できる場所のみを変更します。次の部分は、GitHub 自体を通じてそのコラボレーションを行い、変更を提案し、マージする前にレビューすることです。pull request flow は正確にそこで拾われます。このチャプターの用語がまだぐらついている場合、リモート追跡ブランチ、refspec、上流、Glossary は各項目のプレーン定義を持っています。What is Git は独自に Git vs GitHub の区別を見直す価値があります。

