Skip to content
This page has been auto-translated and may contain errors.View in English

初めてのリポジトリ

docs.scrimba.com

ここに至る方法は通常2つあります。すでにローカルで構築しているweather-appなどのプロジェクトフォルダがあり、Gitにその履歴の記録を開始させたい場合。または誰か他の人がすでにプロジェクトを構築し、それがGitHub上にあり、あなたのマシンに自分の作業用コピーが欲しい場合。どちらも3つの小さなコマンドから始まり、この章の終わりまでに、これら3つすべてを実際に使用することになります。ただし、その前に、10秒で完了するチェックがあります。Gitがあなたのマシンに実装されているかどうかを確認することです。

Gitをインストールしていますか?

このハンドブックのすべてはターミナルで行われるため、最初のステップはターミナルを開くことです。**ターミナル**は、テキストとしてコマンドを入力し、プログラムがテキストで応答するアプリです。すでにあなたのコンピュータにあります:

  • macOS: アプリはTerminalという名前です。Cmd+Spaceを押し、「terminal」と入力して、Enterを押します。
  • Windows: 今のところPowerShellを開きます(スタートメニューで「powershell」を検索)。下記のGitをインストールすると、これ用に設計されたGit Bashというターミナルも追加されます。どちらでも同じGitコマンドを実行できます。
  • Linux: Terminal または Console という名前のアプリを探します。多くのディストリビューションではCtrl+Alt+Tでこれが開きます。

Git自体はコマンドラインプログラムです。独自のウィンドウはなく、gitという単語で始まるコマンドを入力して、それが出力するものを読むことで使用します。このハンドブックのすべてのコードブロックを読む方法も同じです。$で始まる行はあなたが入力するコマンド($自体は除く)で、その下の行はGitの応答です。

それでは、チェックです。ターミナルに以下を入力してEnterを押します:

bash
$ git --version
git version 2.45.1

バージョン番号が返ってくることは、Gitがインストールされており、セットアップが完了しているという意味です。 あなたの番号はこれと異なる可能性があり、それで問題ありません。代わりに「command not found」または「git is not recognized」が表示される場合、Gitはまだあなたのマシンにはなく、インストールするのは1回限りの作業です:

  • macOS: git --versionを実行すると通常、Apple のCommand Line Toolsをインストールするように勧めるダイアログが開きます。それを受け入れると、macOSがGitをインストールします。
  • Windows: git-scm.com/downloadsからGit for Windowsをダウンロードしてインストーラーを実行します。デフォルトはすべて合理的な選択であり、プロセス中にGit Bashもインストールされます。
  • Linux: ディストリビューションのパッケージマネージャーでgitパッケージをインストールします。例えば、UbuntuとDebianではsudo apt install gitを実行します。

インストールが完了したら、ターミナルを閉じて、新しいターミナルを開き、再びgit --versionを実行します。バージョン番号が出ていれば、セットアップは完全に完了しています。このハンドブックの残りの部分では、何もインストールする必要はありません。

バージョン番号は見た目以上に重要です。このハンドブックは2019年にGit 2.23で登場した最新の動詞git switchgit restoreを使用しているため、非常に古いプリインストール済みGitを持つマシンは、正しい例で「not a git command」にぶつかることがあります。ここ数年のGitはすべてそれらを持っています。あなたのが2.23より古い場合は、上記の同じ場所から更新してください。

また、グラフィカルGitツールにも出会うことになります。GitHub Desktop、VS Codeのパネル、ほとんどのエディタの組み込みサポート。すべてはこの同じGitプログラムを下で実行するフロントエンドです。最初にコマンドを学習することは、その場所でも報酬を得ることになります。なぜなら、これらのツール内のすべてのボタンは、すでに理解しているコマンドにマップされているからです。

Gitは1つの自己完結型プログラムであり、サービスではありません。バックグラウンドで何も実行されず、フォルダを監視するものがなく、サインインするアカウントはありません。すべてのコマンドは開始され、リポジトリ内のファイルを読み取りまたは書き込み、答えを出力し、終了します。これはまた、すべてがオフラインで機能する理由でもあります。which gitを実行します(Windows ではwhere git)。ディスク上のプログラムの正確な位置を確認します。

知っておく価値のあるプラットフォームの癖が1つあります。macOSでは、AppleはCommand Line Toolsで独自のGitビルドを提供しており、通常はgit-scm.comの最新リリースより1〜2バージョン遅れています。このハンドブックのすべて、ほぼすべての日常業務に対して、その差は重要ではありません。

JunoGitをインストールしていますか? Gitはターミナルにコマンドを入力して話しかけるプログラムで、git --versionはそれがあなたのマシンにあるかどうかを示します。バージョン番号が表示されればセットアップ完了で、「command not found」と表示されればgit-scm.comまたはあなたのシステムのインストーラーからインストールします。これは1回だけです。セットアップはどのハンドブックでも最も楽しくない部分なので、よくできました!
JunoGitをインストールしていますか?git --versionはインストール質問を1行で解決します。合理的に最近のものはすべて機能しますが、このハンドブックが使用するswitchrestore動詞にはGit 2.23以上が必要なため、それより古い場合は更新してください。GitHub Desktopなどのツールはこの同じプログラムを下で実行するため、ここで学習したすべてがそれらに無料で転送されます。
JunoGitをインストールしていますか? Gitはデーモンとアカウントのない1つのローカルプログラムです。入力すると実行され、リポジトリ内のファイルにタッチして終了するため、すべてがオフラインで機能します。which gitはバイナリの位置を示します。Appleのバンドルされたビルドは最新リリースより1〜2バージョン遅れていますが、14年間、その差は何も費用がかかっていません。

フォルダをリポジトリに変える

ターミナルを開き、cd(「change directory」の略)を使用してプロジェクトフォルダに移動してから、1つのコマンドgit initを実行します:

bash
$ cd weather-app
$ git init
Initialized empty Git repository in /Users/mara/projects/weather-app/.git/

そのフォルダは現在**リポジトリ**です。Gitが監視するプロジェクトで、作業するときにそのスナップショットを記録する準備ができています。git initは毎回同じことをします。隠された.gitフォルダを探し、ない場合は作成し、その時点からフォルダはGitの監視下にあります。

新しいリポジトリのデフォルトブランチはmainという名前です。 古いチュートリアル、古いリポジトリ、または数年前に記録されたコースに着地する場合、同じことに対してmasterが使用されているのを見るでしょう。これは古い名前の同じ最初のブランチです。このハンドブックは常にmainを使用します。

ブランチとは何ですか?

ブランチはコミットがランディングする独立した履歴の線です。mainはすべての新しいリポジトリが開始するものです。ブランチは、ブランチの作成と切り替えについて説明しています。

git initはフォルダが空かどうかを気にしません。index.htmlsrc/フォルダがすでにそこにあるweather-app内で実行してください。Gitは現在の場所からそのプロジェクトを追跡開始します。既存のファイルは変更されません。同じリポジトリで2回目にgit initを実行するのも無害です。Gitは.gitフォルダがすでに存在することに気付き、すでに持っている履歴に触れずにその場で再初期化します。習慣で再度実行しても何の費用もかかりません。

git initは1つのことを行います。.gitフォルダを作成し、この章の後半で詳しく説明します。リポジトリについてのすべて、その履歴、設定、ref は、initが作成する瞬間からそのフォルダ内に存在します。プロジェクトで見て編集するファイルは、追跡されているものの作業用コピーです。.gitフォルダはリポジトリ自体です。

Junoフォルダをリポジトリに変えるgit init任意のフォルダをGitリポジトリに変え、Gitが追跡を開始する準備ができています。プロジェクトフォルダ内で1回実行するとセットアップ完了です。後で再度実行しても害はありません。新しいリポジトリはデフォルトでmainというブランチで、古いものは通常masterというブランチ名です。
Junoフォルダをリポジトリに変えるgit initは空のフォルダまたはすでにファイルでいっぱいのフォルダで機能し、すでにセットアップしたリポジトリで再度実行しても害はありません。Git は.gitフォルダがすでにあることを認識します。デフォルトブランチ名はmainです。古いものではmasterが使用されることを予期します。
Junoフォルダをリポジトリに変えるgit init.gitフォルダのみを作成します。これが実際のリポジトリです。作業ファイルはそのフォルダが追跡するもののチェックアウトです。作業ファイルと追跡するファイルを追跡する.gitフォルダとの分割を保留してください。

Gitに自分が誰であるかを教える

最初のコミットの前に、Gitはそれを作成している人を知りたいと思っています。2つの値を一度設定すると、Gitはこのマシンでするすべてのコミットでそれらを記憶します:

bash
$ git config --global user.name "田中 太郎"
$ git config --global user.email "[email protected]"

作成するすべてのコミットは、その名前とメールアドレスでスタンプされます。このステップをスキップしてください。Gitはあなたのコンピュータのユーザー名とホスト名から推測されたものにフォールバックします。コミットは選択しなかった身元を記録します。

最初のコミットの前に、名前とメールアドレスを設定します。 最初にコミットしてから設定すると、その間違いはそのコミットの履歴にベイクされます。さらに悪いことに、一部のホスト(GitHubを含む)はメールアドレスであなたのアカウントにコミットをマッチングするため、間違ったアドレスまたは推測されたアドレスで行われたコミットは、匿名の見知らぬ人の作業として表示されます。

--globalフラグは**config scope**を設定します。--globalはあなたのマシン全体に適用され、--localはコマンドを実行するリポジトリにのみ適用されます。これにより、設定を階層化できます。グローバルメールはすべてのリポジトリをデフォルトでカバーし、1つの特定のリポジトリで--localオーバーライドはそこで優先度を優先し、他の場所ではありません。これは、作業プロジェクトが個人プロジェクトと異なるアドレスが必要な場合に便利です:

bash
$ cd weather-app
$ git config --local user.email "[email protected]"
$ git config user.email
[email protected]

スコープフラグのないgit config user.emailを実行することは、ここで実際に適用される値を読み込みます。ローカルを設定した場合はローカル、そうでない場合はグローバルな値を読み込みます。

両方のスコープはGitが固定順序で読む取るテキストファイルです。グローバルスコープはホームフォルダの~/.gitconfigに格納されます。ローカルスコープはリポジトリ自体の.gitフォルダ内の.git/configに格納されます。Gitはローカル設定を最初に読み取り、グローバル設定をオーバーライドすることを許可します。これが階層化メカニズム全体であり、自分で開いて読むことができるプレーンテキストファイルに配置されています。

JunoGitに自分が誰であるかを教えるgit config --global user.namegit config --global user.emailは、Gitが作成するすべてのコミットに記録する名前とメールアドレスを設定します。最初のコミットの前に設定します。メールアドレスを設定する前に行われたコミットは、推測された身元で属するため、GitHubなどのホストがそれをあなたのアカウントに接続しない可能性があります。一度行うと、マシン上のすべてのリポジトリがそれを記憶します。
JunoGitに自分が誰であるかを教える--globalはマシン上のすべてのリポジトリに適用され、--localは現在のリポジトリのみをオーバーライドします。個人のメールアドレスを仕事のメールアドレスから分割するのに便利です。両方が設定されている場合、ローカル設定が優先されます。git config user.emailは特定のリポジトリで実際にアクティブな値を示します。
JunoGitに自分が誰であるかを教える 設定スコープは階層化されたテキストファイルです。グローバルは~/.gitconfigに存在し、ローカルはリポジトリ内の.git/configに存在します。両方が値を設定する場合、ローカルが優先されます。メールアドレスを設定せずに省略すると、Gitはユーザー名とマシン名から構築された推測された身元にフォールバックします。これが、奇妙な名前での誤ったコミットがほぼ常に欠けているuser.emailに遡る理由です。

git cloneで既存のプロジェクトをコピーする

時々、プロジェクトはすでに他の場所に存在し、あなたのマシンに作業用コピーが必要です。git cloneはそれを1つのコマンドで行います:

bash
$ git clone https://github.com/octocat/Hello-World.git
Cloning into 'Hello-World'...
remote: Enumerating objects: 13, done.
remote: Total 13 (delta 0), reused 0 (delta 0), pack-reused 13
Receiving objects: 100% (13/13), done.

GitはHello-Worldという名前の新しいフォルダを作成し、プロジェクトの完全な履歴をダウンロードしてそこに配置し、すぐに読み取りや編集を開始できるようにファイルを配置します。別のgit initステップは必要ありません。クローン作成はダウンロードの一部としてリポジトリをセットアップします。

プロジェクトがすでに存在し、接続されたコピーが必要な場合はgit cloneに到達します。まだ存在しない新しい何かを開始している場合はgit initに到達します。クローン作成はまたoriginという名前で、あなたがクローン作成したその場所への接続を結線します。initだけではそのような接続は決して行われません。その接続は、後の章がコミットを送受信するときに使用するものです。

クローン作成はプロジェクト全体の履歴、それが持つすべてのコミット、およびあなたのマシン上の全体的な.gitフォルダをもたらします。git initはそれを空のままにします。年単位の履歴を持つプロジェクトのクローン作成は、正確にこの理由のために、その後何を見ても最新のファイルのスナップショットのように見えるという事実でさえ、一瞬かかることができます。

Junogit cloneで既存のプロジェクトをコピーするgit clone <url>は誰かのリポジトリをダウンロードし、完全な履歴をプロジェクト名に基づいて新しいフォルダに含めます。プロジェクトがすでに存在する場合はそこに到達します。ゼロから開始している場合はgit initに到達します。クローン作成が完了したら、調べるか追加する準備ができた完全な作業用コピーがあります。
Junogit cloneで既存のプロジェクトをコピーする プロジェクトがすでにどこかに存在し、接続されたコピーが必要な場合はクローン作成します。何も存在しない場合は初期化します。クローン作成はoriginという名前で、あなたがクローン作成したその場所への接続を自動的に結線します。初期化だけではそのような接続をセットアップしません。
Junogit cloneで既存のプロジェクトをコピーする クローン作成は、プロジェクトが持つすべてのコミット全体の.gitフォルダを再作成します。これには完全な履歴が含まれるため、古いプロジェクトをクローン作成すると、その後現在のファイルのみが表示されている場合でも、一瞬かかることがあります。

隠された.gitフォルダの中身

git initgit cloneどちらで到達したリポジトリでも、ルートに隠された.gitという名前のフォルダがあります。デフォルトでは隠されているため、ls -aを使用してターミナルに完全なリストを求めます(lsはフォルダの内容をリストしており、-aは隠されたエントリを含みます)。通常のプロジェクトファイルの隣にあることを確認します:

bash
$ ls -a
.  ..  .git  README.md  src

そのフォルダが実際のリポジトリです。作成したすべてのコミット、ブランチ、上記のセクションからの設定を保有しています。.gitフォルダを削除するとプロジェクトはその全体履歴を失います。通常のフォルダに戻り、Gitはそれを追跡しなくなります。プロジェクトの他のすべてのものは、.gitが保有しているもののの作業用コピーです。

内部を見ると、いくつかの認識可能な部分が見つかります。configファイル(上記のセクションのローカル設定)、HEADファイル、およびobjectsrefsという名前のフォルダです。これらのいずれかを手で開いたり編集したりする必要はありませんが、名前を認識することは、エラーメッセージまたは検索結果で登場したときに役立ちます。

これらの名前のいくつかはちゃんと知る価値があります。objectsフォルダはリポジトリの**object database**です。すべてのファイルのすべてのバージョンとすべてのコミット、ファイル名ではなくコンテンツ自体による圧縮と保存。refsフォルダはブランチを保有し、各ブランチはコミットidを指す小さなファイルです。HEADはあなたが現在チェックアウトしているブランチを記録する単一のファイルです。configは上記で説明したローカル設定ファイルです。

これはあなたが日常で手で編集するものではありません。あなたの全体の履歴が、サーバーのどこかに隠されているのではなく、通常のファイルとして保有されていることを見ることは、クローン作成が完全なオフライン履歴を提供する理由を説明し、.gitを削除しても何かきちんと整理されない理由を説明します。プロジェクトがこれまで持っていたすべてのコミットを消去します。

Juno隠された.gitフォルダの中身 すべてのリポジトリはそのルートに隠された.gitフォルダを持ちます。そのフォルダが実際のリポジトリです。全体的な履歴と設定がそこに存在します。デフォルトで隠されているため、プロジェクト内でls -aを実行してそれを確認します。実際にプロジェクトの全体的な履歴を削除したい場合を除いて、決してそれを削除しないでください。削除するとフォルダが通常のフォルダに戻り、Gitが追跡しなくなるためです。
Juno隠された.gitフォルダの中身.gitの内部では、configファイル(ローカル設定)、HEADファイル、およびobjectsrefsフォルダを認識します。日常で手でこれらにタッチしません。ただし、名前はエラーメッセージとGitドキュメントに表示されます。クローン作成はこのフォルダ全体をコピーします。これが、クローンが最新のファイルのみではなく完全な履歴で到達する理由です。
Juno隠された.gitフォルダの中身objectsはリポジトリのobject databaseです。すべてのファイルのすべてのバージョンとコミットを保有し、ファイル名ではなくコンテンツでアドレス指定されます。refsはブランチを通常のファイルとして保有します。コミットidを指しており、HEADはチェックアウトしたブランチを記録します。そこに何もが手編集を必要とされません。それが通常のファイルとしてディスク上に見えることがクローン作成が完全なオフライン履歴を提供する理由であり、.gitを削除することがすべてを削除する理由です。

リポジトリとコミットという用語がまだ曖昧な場合、What is Gitはこれらのコマンドが構築する心的モデルをカバーしており、Glossaryはこの章のすべての用語の短い定義を持っています。身元が設定され、作業するリポジトリがあるとき、The commit loopは、今後常に使用する編集、ステージング、およびコミットの日常サイクルをカバーしています。