基本的なコミット関連とかのコマンドについてザックリで説明していきます。主に何となく知っているレベルなので正確性に欠く可能性があります。

リポジトリの作成


git initコマンドでgitリポジトリを作成することができます。

1
2
$ git init
Initialized empty Git repository in /mnt/c/Users/N.Yoshinori/work/tmp/.git/

この時--bareオプションを付与することでベアリポジトリを作成することができます。

git status


git statusというコマンドはgitのファイル状況を確認するコマンドです。先ほど作成したリポジトリを確認してみましょう。

1
2
3
4
5
6
$ git status
On branch master

No commits yet

nothing to commit (create/copy files and use "git add" to track)

まだ何もファイルがないのでNo commits yetという結果が返ってきました。

trackedとuntracked


gitにはtracked(追跡)されているファイルとuntracked(追跡されていない)ファイルの2種類があります。

  • 一度コミットされたものがtrackedファイル
  • 一度もコミットされていないものはuntrackedファイル

で覚えればよいです。たぶん。

コミットとステージ


さて、untracked(追跡されていない)ファイルを含む、ファイルの追加・変更時はコミット前に一旦ステージに入ることになります。ステージに入った追加・変更のみがコミットの対象になります。

変更内容のリポジトリへの記録より

というわけで、まずファイルを作成してgit statusで確認してみます。

1
2
3
4
5
6
7
8
9
10
11
12
$ echo "test" > example.md
$ git status
On branch master

No commits yet

Untracked files:
(use "git add <file>..." to include in what will be committed)

example.md

nothing added to commit but untracked files present (use "git add" to track)

これはまだuntrackdeな状態ですので、これをステージに追加してからもう一度確認してみます。ステージへの追加はgit addで行います。

1
2
3
4
5
6
7
8
9
10
$ git add example.md
$ git status
On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file: example.md

全てのファイルをステージに追加したいということもあると思います。その場合はgit add -Aで行います。ファイルを複数作成して追加してみます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ echo "test2" > example2.md
$ echo "test3" > example3.md
$ git add -A
$ git status
On branch master

No commits yet

Changes to be committed:
(use "git rm --cached <file>..." to unstage)

new file: example.md
new file: example2.md
new file: example3.md

では上で作成したファイルをgit commitコマンドでコミットしてみます。

実行するとgit statusの内容がコメントアウトの状態で表示されます。このgit statusの内容はコミットメッセージには記録されません。先頭に空行があるのでそこにコミットメッセージを記載します。

1
2
3
4
5
6
7
8
9
10
11
12
13
Initial commit
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
#
# Initial commit
#
# Changes to be committed:
# new file: example.md
# new file: example2.md
# new file: example3.md
#

コミットメッセージを入力し終えたら、エディタを閉じます。例えばvimの場合は:wqなどです。すると、コミットの結果が表示されます。

1
2
3
4
5
[master (root-commit) 685276c] Initial commit
3 files changed, 3 insertions(+)
create mode 100644 example.md
create mode 100644 example2.md
create mode 100644 example3.md

コミットメッセージについて


コミットメッセージの書き方はプロジェクトによってだいたい決められていると思いますが、私は主に下記のやり方でやってます。

  • 1行目は内容の要約(50文字以内くらい)
  • 2行目は空行
  • 3行目以降に変更詳細を箇条書きで記載

これは確かgitの公式リポジトリのコミットメッセージの書き方だったと思います。箇条書きする際は*を用いています。また、ITSなどの課題追跡システムを使用している場合は1行目の頭にその番号を記載するようにしています。

最近では1行目のコミットメッセージにchoreとかfixとか書くのが流行ってきてるらしいです。これに関しては詳しくないので具体的には下記を参考にしてください。

JavaScript-Plugin-Architecture

コミットハッシュについて


gitはコミットごとにSHA1ハッシュを振ります。各コミットは前(親)のコミットのハッシュを保持しています。

試しにファイルを編集してコミットしてみます。

1
2
3
4
5
$ echo "hoge" > example.md
$ git add example.md
$ git commit
[master 7254e78] Write hoge
1 file changed, 1 insertion(+), 1 deletion(-)

今までの作業でコミットが2つできました。今回のコミットのSHA1は7254e78なので、この親コミットのハッシュはgit show --pretty=%P 7254e78で確認できます。[1]

1
2
3
4
5
6
7
8
9
10
$ git show --pretty=%P 7254e78
685276ca301f707ebe329513b33f5cd48b97e644

diff --git a/example.md b/example.md
index 180cf83..2262de0 100644
--- a/example.md
+++ b/example.md
@@ -1 +1 @@
-test2
+hoge

少し余談になりますが、gitにはいくつか履歴改変が可能な操作があります[2]。gitではこれらの履歴改変は内部的に再度コミットを行っています。つまりコミットハッシュを振りなおします。それが例え、特定のコミットのみの改変であっても以降のコミットも親コミットのハッシュを持っているため以降のすべてのコミットのハッシュが書き換わります。

つづき


つづきです。ブランチとかコミットオブジェクトについて記載しています。

参考


Git公式ドキュメント


  1. 実際はgit logとかで確認した方がはやいです。

  2. git filter-branchなど