Gitとは? Gitの基礎知識と具体的な使い方
Git とは
Gitとはバージョン管理システムのことです。
バージョン管理するメリットは、
- どのファイルの何を
- 誰が
- いつ
- 何のために
変更したかを残すことができます。
最新のファイル状況がわかるのは、もちろん、複数人で作業しても更新の確認が容易になります。
また、最新のファイルでエラーが起きてしまった場合でも元に戻すことができます。
Git の仕組み
Gitはいつ、誰が、何を、何のために変更したかを時系列順に記録します。
Gitは、差分だけを保存するのではなく、バージョンごとにスナップショットで保存しています。
バージョン管理の際、ブランチごとにバージョンのスナップショットがあることでとても作業が捗るもし差分で保存されていると、変更の都度計算し直さないといけなくなり、とても効率が悪くなります。
git以前のバージョン管理ツールがそう差分での管理でした。バージョンごとにコミットがあることで、コミットを辿ることでバージョンを遡ることができます。
最新のコミットには、その前のコミット(バージョン)が保管されています。
その前のコミットには、その一つ前のコミットが記憶されています。
そして、それぞれのバージョンをスナップショットで保存しているので、以前の状態に簡単に戻すことができます。
Git操作の流れ
基本的な開発の流れは次の通りです。
- ファイルを変更します。
- ファイルを個人リポジトリに登録します。(commit)
- 共有リポジトリに保管する。(push)
リポジトリというのは、ファイルの変更履歴を記録する場所(箱)のことです。
ファイル自体やディレクトリの状態も記録されます。
また、個人リポジトリに変更履歴を預けることを、commit といいます。
個人リポジトリに変更履歴を commit した後、その変更履歴を共有リポジトリというサーバー上に保管します。
この個人リポジトリから共有リポジトリに変更履歴を登録することを、push といいます。
複数人での開発の流れは次の通りです。
- 共有リポジトリの情報を同期する(pull)
- ファイルを変更します。
- ファイルを個人リポジトリに登録します。(commit)
- 共有リポジトリに保管する。(push)
サーバー上の共有リポジトリの情報を取得することを pull といいます。
後の流れは個人のときと同じとなります。
ローカルからリモートへアップする
ローカル(手元のパソコンのこと)は、作業する場所であるワークツリーとローカルリポジトリがあります。
ワークとは作業場のことです。ツリーとはディレクトリやフォルダのことです。リポジトリとはコードの保管場所、履歴データのデータベースのことです。まずワークツリーからローカルリポジトリへスナップショットを記録します。言い換えると、自分の作業した場所から変更履歴を自分のパソコンの変更履歴の保管場所に保存するということです。そして、オンライン上のリモートリポジトリへおなじものを保管します、リモートリポジトリはGitHubのことです。
リモートからローカルへダウンロードする
他の人が行った変更を自分のパソコンに取り込みたいときリモートリポジトリ(GitHub)からローカルリポジトリへ変更履歴を取得します。そして、ローカルリポジトリから自分の作業場所であるワークツリーにに記録を反映させます。
これらのことが、チーム開発をしている場合は他の人のパソコンでも行われます。
ローカルについて
ローカルは、次の3つのエリアに分かれています。
– ワークツリー
– ステージ
– リポジトリ
まず、ワークツリー(作業場所)でファイルを変更します。ワークツリーでファイルの変更を行ったらローカルリポジトリに記録を反映させる前に、ステージという場所に追加します。ステージとは、コミットする変更を準備するための場所です。
コミットとは、スナップショットを記録することです。このワークツリーからステージへ追加するコマンドが、git addです。
なぜステージが必要なのか?
たくさんのファイルを変更した場合、変更が完了したものもあれば、変更が途中のものもある状態になることがあります。その場合、変更が完了したものだけをGitHubにあげたい場合、変更が完了した分だけをステージに追加することで分けることができます。変更が完了したもののみをステージに置くことができます。そして、コミット、つまりスナップショットを記録します。このコマンドがgit commitです。
Gitのデータ管理の仕組みについて
Gitのコマンドの裏で起こっていることどのようにGitはデータを管理しているのか、履歴を保存した時に何が起こっているのかを知っておきましょう。
まずは、概要を理解しておきましょう。
git addの裏側で起きることまずindex.jsというファイルを作ったとしましょう。ステージに追加ためには、まずローカルリポジトリに圧縮したファイルAを保存します。圧縮ファイルは実際はヘッダーとファイル内容をSHA-1というハッシュ関数で
40文字の英数字に変換したハッシュIDが保存されます。そのハッシュIDは必ず一意のIDとなります。同じなら更新はされませんし。内容が少しでも変更されれば新しいIDになります。そして、ローカルリポジトリからステージにインデックスというファイルが保存されます。そのインデックスというファイルには圧縮ファイルAとindex.jsがマッピングされた状態(圧縮ファイルAはindex.jsですよという紐付け情報)が保存されます。これがgit addで起きる概要です。
git commitの裏側で起きること
コミットすると、インデックスファイルを元にツリーファイル1という同じような内容のファイルがローカルリポジトリに作られます。ツリーファイルはファイル名とファイルの中身(各階層ごとのファイル構造も含めて)保存されます。ツリー1が作成されたら、次はコミット1というファイルが作成されます。コミット1には次のような情報が記載されています。
- ツリー1というファイル名→どのスナップショットかわかる
- 作成者(gitに設定した名前とメールアドレス)→誰が変更したかわかる
- コミットしたときの日時→いつ変更したかわか
- るコミットメッセージ→なぜ変更したかわかる
ローカルリポジトリにコミットする際、
ローカルリポジトリには、次の3つのファイルが作成されます。
– 圧縮ファイルAというファイル
– ツリー1というファイル
– コミット1というファイル
これらを保持した状態でデータが保存されています。これがgit commitで起きる概要です。
Gitのデータ構造について
次に、ワークツリー(パソコンの作業場所)でsrc/style.cssというファイルを作成したとします。
これをgit addすると、同じように圧縮ファイルBがローカルリポジトリで作成されます。そして、ステージにあるインデックスファイルに、src/style.cssは圧縮ファイルBですよというマッピングされた情報が追加されます。
次にgit commitすると、ツリー2というファイルが作成されます。そこにはインデックスで追記したファイル構成が保存されます。そして、コミット2というファイルが作成されます。
– ツリー2
– 作成者
– 日時
– コミットメッセージ
に加えて、親コミットとしてコミット1が保存されます。直前のコミットを親コミットとして記録します。
これがあることで、変更履歴を辿れるようになります。このコミットの連鎖をたどることで変更履歴、つまりバージョン管理が可能なります。
Gitで大事なことは、データを圧縮しているということ、そして差分ではなくスナップショットで保存しているという点です。これらを踏まえてGitのコマンドをみてみましょう。
圧縮ファイルというのは、blob(ブロブ)オブジェクトというの正式です。ツリーファイルは、treeオブジェクト、コミットファイルはcommitオブジェクトと言います。
Githubに新規リポジトリを追加して新しいプロジェクトを開始する手順
Githubに新規リポジトリを追加して新しいプロジェクトを開始するまでのgitコマンドです。
-
cd フォルダ名
ターミナル上でアプリ作成のためのルートディレクトリに移動します。
-
git init
初期化します。
-
git add -A
git commit -m "Initialize repository"
addしてcommitしておきます。
- githubのページにアクセスして、New repositoryをクリックします。
- Repository nameなどを設定してCreate repositoryをクリックします。
- 「…or push an existing repository from the command line」のところに書かれている
git remote add origin https://github.com/名前/リポジトリ名.git
をターミナルに入力します。
-
git push origin master
ローカルリポジトリの内容をリモートリポジトリに反映します。
Gitの基本コマンドの使い方について、こちらの記事を参考にしてください。