skillup

技術ブログ

Git

gitの作業ディレクトリ・インデックス・HEADに関して

投稿日:2015年12月8日 更新日:

gitを使い始めてしばらくたちますが、まだ明確なイメージがつかめていないです(汗)

みようみまねでやっていて、ポイント、ポイントで困ったことは検索してなんとか対応してきましたが、体系的な理解ができていなことが大きいかなと思います。

そこで今回は個別のポイントではなく、gitの仕組み(作業ディレクトリ、インデックス、HEADなど)についてメモしておきたいと思います。

作業ディレクトリ、インデックス、HEAD

gitではファイルの履歴を登録する場合、大きく分けるとファイルの状態は3つあります。

1つ目は作業ディレクトリ(Working Directory)と呼ばれます。

これは作業者が普段、触っているファイル群のことです。

次にコミットする前段階としてインデックスという状態があります。

gitの場合、作業ディレクトリのファイルをいきなり、履歴管理するのではなくこのインデックスといわれる状態に登録しておきます。(git addで登録できます。)

しかし、インデックスに状態を登録してあるファイル群は言ってみれば仮登録のような状態です。

これを本登録するためにはコミット(git commit)といわれる処理を行います。

コミットをしますと、

  • その時に記録された時間
  • 記録されたファイル
  • 前回のコミットとの差分
  • 登録者
  • その時のコミットを識別するための文字

などの情報が追加されます。

基本的にファイルの履歴とはこのコミットの履歴のことをいいます。また最新のコミットのことをHEADと呼びます。

上記が基本的な流れです。要は作業フォルダ→インデックス→コミットという流れをおっていけばいいのですが、複雑になってくるとこれが混乱したりします。

以下によく使われるコマンドを列挙します。

git add ファイル名

最もよく使われるコマンドですが、これは作業ディレクトリにあるファイルをインデックスに登録するコマンドです。

git ls-files

インデックスに登録されているファイルの一覧を見たい場合です。様々なオプションがあり、見れる状態をカスタマイズできます。(下記リンク参照)

git ls-files

git rm

間違ってindexに登録したファイルなどを削除するときに行うコマンドです。これも作業ディレクトリのファイルは残しておき、インデックスだけに登録しないなどさまざまなオプションがあります。(下記リンク参照)

gitの管理対象から特定のファイル、ディレクトリを削除する

.gitignore

コマンドではないですが、インデックスに登録しないファイルを登録しておきます。

例えばバイナリ系のファイル、一時的なログファイルなどがそれに当たります。

ここに記述しておくと以降はgitの管理対象外となり、git addを加えても追加されません。

なおこのファイルに記述する前にaddで登録してしまった場合は先ほどのgit rmを使います。

.gitignoreでインデックスに登録したくないファイルを指定する

git status

現在のファイルの状態がどうなっているかを教えてくれるコマンドです。

下記のようなメッセージがでることが一般的です。

ステージングの変更を確認する

修正したファイルをGitでインデックスに追加してみる

git addでステージングしたファイルをアンステージング(キャンセル)する

git reset

gitの操作をやり直すコマンドです。といっても複数のオプションがありますが、例えばインデックスに登録したファイルを取り消したり、コミット自体をとりけすなどです。

git reset がわからない

git-resetは結局何を戻すのか

git checkout

通常はブランチを切る場合に使いますが、作業ファイルを任意のバージョンに戻すときにも使えます。

コツ

わかりにくい場合は作業ディレクトリ、インデックス、HEADの状態をノートなどにかいてみるとよいかもしれません。

それを数回繰していき感覚をつかんでいく必要がありますね。

参考リンク

Git初心者に捧ぐ!Gitの「これなんで?」を解説します。

はじめてgitをつかったのでコマンドを復習します

Git の基礎勉強 〜Git によるバージョン管理を使う〜

-Git
-

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

no image

Gitでのbranch 新ブランチの作成&リモート反映&別環境反映

gitを使っているとわけのわからないことは多いのですが(爆)、その中の1つがbranch(ブランチ)でしょう。 これも説明をきいてもわからないのですが、自分でそのケースを学習してみればすぐにわかると思 …

no image

githubのremoteリポジトリへの登録

githubにgit pushしようとしたときにエラーがでたんでちょっとメモ。 githubに登録する場合、設定が適切でないと、

など …

no image

Gitで統合 merge関連

本日はずっとブランチ間の統合を行っておりました。 たとえばhogeブランチとfooブランチの統合をする場合、差分を最初に確認すると思いますが、 [crayon-5f07e4d6e75f83999055 …

no image

Gitデタッチ、インデックス、プッシュなど

まとまってませんが、Gitであったトラブルについてのメモです。 Contents1 デタッチ状態2 インデックス一覧&削除2.1 インデックスの一覧2.2 インデックスから取り除くとき3 git pu …

no image

GitLabのCI/CD

GitLabをGitHubがわりに使っているプロジェクトがあったのですが色々調べているうちにCI/CD的な使い方ができるといことで調査することに。 jenkinsでやったようなCI/CDができます。お …