DUICUO

Gitシリーズ(パート3):初めてのGitリポジトリの作成

[[169545]]

ここで、独自の Git リポジトリを作成する方法、ファイルを追加する方法、コミットを完了する方法を学習します。

このシリーズの以前の記事では、エンドユーザーとしてGitを操作する方法を学びました。まるで冒険家のようにオープンソースプロジェクトのウェブサイトに偶然出会い、リポジトリをクローンし、いよいよGitを深く掘り下げる準備が整いました。これで、Gitの操作は思ったほど難しくないことがお分かりいただけたでしょう。もしかしたら、今すぐGitを使って仕事を終わらせる必要があるのか​​もしれません。

確かに、Git は多くの重要なソフトウェア プログラムのバージョン管理ツールとして選ばれていますが、それだけに限定されるわけではありません。買い物リスト (もちろん、買い物リストが重要な場合)、構成ファイル、週次レポートやジャーナル、プロジェクトの進捗ログ、さらにはソース コードも管理できます。

Git の使用は不可欠です。結局のところ、バックアップ ファイルのバージョン情報を識別できないというフラストレーションを経験したことがあるはずです。

Gitは使い始めなければ何の役にも立ちません。今こそ、Gitを学び、使い始める絶好の機会です。Gitの言葉を借りれば、「origin HEADほど役立つプッシュはない」(千里の道も一歩から始まるという意味)のです。きっとすぐに理解できるはずです。

録音に似ている

コンピュータ上の鏡像を指すのに「スナップショット」という言葉がよく使われます。これは、多くの人が様々な時期の写真が詰まったアルバムを連想するからです。これは確かに便利ですが、Gitはむしろビデオを録画するようなものだと私は考えています。

従来のスタジオ カセット レコーダーは、前方または後方に回転できるスピンドル、サウンド波形を保存する磁気テープ、テープにサウンド波形を記録したり、テープ上のサウンド波形を検出して聴衆に向けて再生したりできるピックアップ ヘッドなど、いくつかのコンポーネントで構成されています。

テープを順方向に再生するだけでなく、テープを前の部分に巻き戻したり、早送りして後の部分をスキップしたりすることもできます。

1970年代にバンドがテープを録音しているところを想像してみてください。彼らはすべてのパートが完璧になるまで何度も練習し、それをトラックに録音します。まずドラムを録音し、次にベース、ギター、そして最後にリードボーカルを録音します。録音するたびに、スタジオクルーはテープを巻き戻してループモードに設定し、以前に録音したパートを再生します。例えば、ベースを録音している場合、まるで自分でドラムを叩いているかのように、バックグラウンドでドラムの音が聞こえます。ギタリストには、ドラム、ベース(とカウベル)などが聞こえます。各ループで一部を録音し、次のループでクルーは録音ボタンを押して、それらをテープにまとめます。

作品をリミックスしたい場合は、テープ全体をコピーしたり置き換えたりすることもできます。

さて、1970 年代の録音作業に関する上記の説明が、Git の作業を録音作業として考えられるほど十分に鮮明なものになっていることを願っています。

新しいGitリポジトリを作成する

まず、仮想レコーダー用のテープをいくつか購入する必要があります。Git用語では、これらのテープはリポジトリと呼ばれ、すべての作業の基盤となります。つまり、Gitファイルが保存される場所(つまり、Gitの作業ディレクトリ)です。

どのディレクトリでもGitリポジトリにすることができますが、まずは新しいディレクトリから始めましょう。そのためには、以下の3つのコマンドが必要です。

  • ディレクトリを作成します (必要に応じて、グラフィカル ファイル マネージャーでこれを行うこともできます)。
  • ターミナルでディレクトリに切り替えます。
  • Git 管理ディレクトリとして初期化します。

つまり、次のコードを実行します。

  1. $ mkdir ~/jupiter # ディレクトリを作成
  2. $ cd ~/jupiter # ディレクトリに入る
  3. `$ git init .` # 新しい Git 作業ディレクトリを初期化します。

この例では、フォルダー jupiter は空ですが有効な Git リポジトリです。

リポジトリが準備できれば、あとはすべてスムーズに進めることができます。リポジトリのクローンを作成したり、過去の時点間を行き来したり(過去の時点がある場合)、タイムラインを交互に作成したり、その他Gitでできることはすべて実行できます。

Gitリポジトリでの作業は、他のディレクトリでの作業と同じです。ファイルの作成、コピー、保存など、普段通りの操作が可能です。Gitは、過度に複雑化しない限り、それほど複雑ではありません。

ローカル Git リポジトリでは、ファイルの状態は次の 3 つになります。

  • 追跡されていないファイル: リポジトリにファイルを作成しましたが、そのファイルを Git の管理に追加していません。
  • 追跡されたファイル: Git 管理に追加されたファイル。
  • ステージングされたファイル: Git のコミット キューに追加された、変更および追跡されたファイル。

Gitリポジトリに追加した新しいファイルは追跡されません。これらのファイルはコンピュータのハードドライブに保存されていますが、Gitに管理対象ファイルであることを伝えていません。サウンドレコーダーに例えると、レコーダーの電源がまだ入っていないようなものです。バンドは既にレコーディングスタジオで作業を開始していますが、レコーダーはまだ録音の準備ができていません。

心配しないでください。これが起こると Git が通知します。

  1. $ echo "hello world" > foo
  2. $ git ステータス
  3. ブランチマスター
  4. 追跡されていないファイル:
  5. ( 「git add <file>...」を使用します)  コミットされる内容含める
  6. フー
  7. 何も追加されていないが、追跡されていないファイルが存在します( 「git add」を使用します  追跡するため)

ご覧のとおり、Git はコミット タスクにファイルを追加する方法を思い出させてくれます。

Gitコマンドを使用せずにGit操作を実行する

GitHub または GitLab でリポジトリを作成するには、数回クリックするだけです。難しくはありません。「新しいリポジトリ」ボタンをクリックして、表示される指示に従うだけです。

リポジトリに「README」ファイルを含めることは良い習慣です。こうすることで、リポジトリを閲覧する人が、そのリポジトリの目的を知ることができます。さらに便利なのは、リポジトリをクローンする前に、そのリポジトリに何が含まれているかを知ることができることです。

リポジトリのクローン作成は通常簡単ですが、GitHubで変更権限を取得するのは少し複雑です。GitHubで本人確認を行うには、SSHキーが必要です。Linuxシステムをご利用の場合は、以下のコマンドで生成できます。

  1. $ ssh-keygen

次に、新しいキーの内容をコピーします。これはプレーンテキストファイルなので、テキストエディタで開くか、次のように「cat」コマンドを使って表示できます。

  1. $ cat ~/.ssh/id_rsa.pub

次に、キーを GitHub SSH 構成ファイルまたは GitLab 構成ファイルに貼り付けます。

SSH モードを使用してプロジェクトのクローンを作成した場合は、変更をリポジトリに書き戻すことができます。

あるいは、システムに Git がインストールされていない場合は、GitHub のファイルアップロード インターフェースを使用してファイルを追加できます。

追跡ファイル

`git status` コマンドの出力からわかるように、Git でファイルを追跡したい場合は、`git add` コマンドを使ってコミットに追加する必要があります。このコマンドは、コミット待ちのファイルが置かれるステージング領域にファイルを配置します。また、スナップショットでも使用できます。`git add` コマンドの目的は、スナップショットにファイルを追加する場合と、Git で管理する新規ファイルや一時ファイルを追加する場合で異なりますが、少なくとも今のところは、これらの違いを気にする必要はありません。

テープレコーダーに例えると、この動作はテープレコーダーの電源を入れて録音を開始するようなものです。録音中のテープレコーダーで一時停止ボタンを押したり、次のトラックを録音するために最初に巻き戻したりするのと同じようなものです。

Git 管理にファイルを追加すると、追跡対象ファイルとしてマークされます。

  1. $ git fooを追加する
  2. $ git ステータス
  3. ブランチマスター
  4. コミットする変更:
  5. ( 「git reset HEAD <file>...」を使用します)  ステージ解除する
  6. 新しいファイル: foo

送信タスクにファイルを追加することは、「記録の準備」ではありません。単にファイルを記録可能な状態にするだけです。追加後もファイルを変更することは可能です。ファイルは追跡対象としてマークされ、ステージング領域にあるだけなので、テープに書き込まれる前に削除または変更することができます(もちろん、変更を加えるために再度追加することもできます)。ただし、まだファイルをテープに記録していないため、以前は正常に動作していたファイルを破損した場合、ファイルがテープ上で動作していた瞬間を記録していないため、ファイルを回復することはできませんのでご注意ください。

Git 履歴にファイルを記録しない場合は、コミットを元に戻すことができます。これは、Git で次のように実行されます。

  1. $ git リセット HEAD foo

これは本質的に、レコーダーの録音モードを無効にし、単にレコーディング スタジオ内を歩き回ったことを意味します。

大規模な投稿

場合によっては、リポジトリにコンテンツを送信したいことがあります。テープレコーダーに例えると、録音ボタンを押してテープに録音するようなものです。

プロジェクトの様々な段階を通して、あなたは「記録ボタン」を何度も押すことになります。例えば、新しいPythonツールキットを試し、最終的にウィンドウレンダリングを実装する場合、新しい表示オプションを試しているときに何か問題が起きても、コミットして元の段階に戻せるようにしておく必要があります。しかし、Inkscapeでグラフィックをスケッチしただけの場合は、開発するコンテンツが完成するまでコミットを待つ必要があるかもしれません。コミットは何度も行うかもしれませんが、Gitは無駄なデータやディスク容量をあまり消費しないので、個人的にはコミットは多ければ多いほど良いと考えています。

`commit` コマンドは、リポジトリのステージング領域にあるすべてのファイルを「記録」します。Git は追跡対象ファイル、つまり過去のいずれかの時点で `git add` コマンドを使用してステージング領域に追加したすべてのファイルと、最後のコミット以降に変更されたファイルのみを「記録」します。以前のコミットがない場合、追跡対象ファイルはすべて今回のコミットに含まれます。Git の観点から見ると、これは非常に重要な変更です。なぜなら、リポジトリに追加されていなかったファイルが、追加されるようになったからです。

コミットを完了するには、次のコマンドを実行する必要があります。

  1. $ git commit -m '私の素晴らしいプロジェクト、最初のコミット。'  

これにより、コミットされたすべてのファイルが保存され、他の操作に使用できるようになります(イギリスのテレビドラマ「ドクター・フー」のガリフレイ用語で言えば、「固定された時点」になります)。これはコミットイベントであるだけでなく、Gitログ内でそのコミットへの参照ポインタでもあります。

  1. $ git ログ--oneline  
  2. 55df4c2 私の素晴らしいプロジェクト、まず 専念

詳細情報を表示するには、`--oneline` オプションなしで `git log` コマンドを使用します。

この例では、コミット参照番号は55df4c2です。これは「コミットハッシュ」(LCTT注:これはgitコミットオブジェクトを表すためにSHA-1アルゴリズムによって生成されるハッシュコードです)と呼ばれ、コミットに含まれるすべての新しい変更を表し、以前のレコードを上書きします。コミット履歴のある時点に「戻す」場合は、このハッシュを参照として使用できます。

このハッシュは、サウンド テープ上の SMPTE タイムコードと考えることができます。もっと具体的に言えば、ビニール レコード上の 2 つの異なる曲間のギャップ、または CD 上のトラック番号と考えることができます。

ファイルを変更してコミットタスクに追加し、最終的にコミットを完了すると、新しいコミットハッシュが生成されます。これらのハッシュはそれぞれ、製品の異なるバージョンを表します。

これが、チャーリー・ブラウンのようなミュージシャンがバージョン管理システムとして Git を使用する理由です。

今後の記事では、Git HEADの様々な側面について解説し、タイムトラベルの秘密を真に解き明かしていきます。ご心配なく、そのまま読み進めてください(もしかしたら、もう読み進めているかもしれませんね)。