2017 年度 OSS リテラシー 3 : 第 7 回 Git, GitHub 入門 (1)

git がインストールされているか確認する.

$ sudo -s
# apt-get update

  ... (略) ... 

# apt-get install git

  パッケージリストを読み込んでいます... 完了
  依存関係ツリーを作成しています                
  状態情報を読み取っています... 完了
  git はすでに最新バージョン (1:2.11.0-3+deb9u2) です。
  アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 1 個。

# exit

$ git --version

  git version 2.11.0

git の初期設定を行う

$ git config --global user.name "名前"  (自分の名前をローマ字で書くこと)

$ git config --global user.email "メールアドレス" (自分のメールアドレス)

これにより, ~/.gitconfig に設定が記録される.

$ cat ~/.gitconfig 

  [user]
       name = sugiyama
       email = [email protected]

git の基本的な使い方 (ローカルリポジトリ)

git init

まず, リポジトリの初期化を行う. ディレクトリを作成した上で, git init を実行する.

$ mkdir git-tutorial

$ cd git-tutorial

$ git init

  Initialized empty Git repository in /home/sugiyama/git-tutorial/.git/

git status

作成したリポジトリの状態を確認するには git status を実行する. 現在は "master" ブランチにいることが表示される. ブランチの説明は次週行う. また, 最終行に "nothing to commit" と書かれているように, コミット (commit) するファイルが存在しないことも示されている.

$ git status

  On branch master    (master ブランチ)

  Initial commit

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

コミットが無いということは, 現時点では作成したリポジトリ (git-tutorial) には 何のファイルの何の状態も記録されていないということを意味する. 最初のコミットをするために管理の対象になる README.md ファイルを作成する. 管理対象となるファイルをワークツリー (git-tutorial ディレクトリ) 内に作成すれば良い.

$ touch README.md   (中身は空なファイルを作る)

$ git status

  On branch master

  Initial commit

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

      README.md

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

"Untracked files" に作成した README.md ファイルが表示されていることが確認できる. このように Git のワークツリーやリポジトリに対して何らかの操作を行うと git status コマンドでの表示が変化する.

git add

Git リポジトリのワーキングツリーでファイルを作成しただけでは, Git リポジトリのバージョン管理の対象としてファイルは登録されていない. そのため, README.md ファイルは git status コマンドの表示で "Untracked files" に表示されていた.

そこでファイルを Git リポジトリの管理対象とするために git add コマンドを実行して, ステージ領域と呼ばれる場所にファイルを登録する. ステージ領域とはコミットをする前の一時領域である.

$ git add README.md

$ git status

  On branch master

  Initial commit

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

  new file:   README.md

README.md ファイルをステージ領域に登録したことにより, git status コマンドの 表示が変化した. "Changes to be committed" に README.md ファイルが表示されていることが確認できる.

git commit

git commit コマンドは, ステージ領域に登録されている時点のファイル群を 実際にリポジトリの歴史として記録するコマンドである. この記録を元にファイルをワーキングツリーに復元することが可能となる.

早速, git commit を実行する. "-m" オプションの値 "first commit" は コミットメッセージと呼ばれるもので, 後述する git log で参照できる. コミットメッセージにはコミットに関する要約を書くべきものである.

$ git commit -m "first commit"

  [master (root-commit) 1bab8be] first commit
   1 file changed, 0 insertions(+), 0 deletions(-)
   create mode 100644 README.md

詳細なコミットメッセージを残す場合は -m オプションを付けずに git commit を実行する. まず, コミットした時に立ち上がるエディターを vi に指定する.

$ export EDITOR=vi

先に commit したので, 実行すると "nothing to commit" と言われる. そのため, README.md ファイルを修正する.

$ git commit

  On branch master
  nothing to commit, working tree clean

$ vi README.md

  Git tutorial    (ファイル名に何らかの文字列を書き込む)

改めてコミットする. そのまま git commit するとステージ領域に書き出していないと 文句を言われる. git add してから git commit する.

$ git commit

  On branch master
  Changes not staged for commit:
  modified:   README.md

  no changes added to commit   (変更が add されていないことを示す)

$ git add README.md 

$ git commit

  [master cb505d7] 2017-11-20 README.md is modified by sugiyama
   1 file changed, 1 insertion(+)

git commit を実行すると, エディター (vi) が起動する. コミットメッセージを記述する. コミットメッセージの書式は開発者同士で取り決めておくと良い. 以下の例では変更内容の要約を 1 行で記述している. また, コミットメッセージを何も書かないと 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
# Changes to be committed:
#       modified:   README.md
#

2017-11-21 modified by sugiyama

コミット後の状態を確認するには再度 git status を実行する.

$ git status

  On branch master
  nothing to commit, working tree clean

git log

git log コマンドはリポジトリにコミットされたログを確認できるコマンドである. 誰がいつコミットやまーじをして, どのような差分が発生したかなどを確認できる. 先ほどの git commit コマンドが実際に記録されていることを確認してみる.

$ git log

  commit 5eb4bae90205d953534a45bc8ad26994fbbda385
  Author: sugiyama <[email protected]>
  Date:   Tue Nov 21 01:48:57 2017 +0900

      2017-11-21 modified by sugiyama

  commit cb505d72d4dbaeb4ceb97dc2b3eab3b697c1ca40
  Author: sugiyama <[email protected]>
  Date:   Tue Nov 21 01:42:14 2017 +0900

      2017-11-20 README.md is modified by sugiyama

  commit 1bab8bed19137dbefd7c93d09d42ed1f15a9e8a6
  Author: sugiyama <[email protected]>
  Date:   Tue Nov 21 01:31:11 2017 +0900

      first commit

コミット欄の隣に書かれている "1bab8bed19137dbefd7c93d09d42ed1f15a9e8a6" が, このコミットを指し示すハッシュである. Author 欄には Git で設定されているユーザ名とメールアドレスが記録される.

git に登録されたファイルが複数になった場合, 特定のファイルのログだけ 確認したくなることがある. その場合はファイル名を指定する.

$ git log README.md 

  ... (略) ...

コミットで行われた差分も確認する場合には -p をつけると, コミットメッセージの後ろにファイルの差分が表示される.

$ git log -p

  commit 5eb4bae90205d953534a45bc8ad26994fbbda385
  Author: sugiyama <[email protected]>
  Date:   Tue Nov 21 01:48:57 2017 +0900

      2017-11-21 modified by sugiyama

  diff --git a/README.md b/README.md
  index b399233..6b8af08 100644
  --- a/README.md
  +++ b/README.md
  @@ -1 +1,2 @@
   Git tutorial
  +Git tutorial desu   (先頭に + がついているのが追加した行)

  ... (略) ...

git diff

git diff は, ワークツリー・ステージ領域・最新コミット間の差分を 確認するために利用するコマンドである.

改めて README.md に書き込みをした後に git diff を実行することで 現在のワークツリーとステージ領域の差分を確認できる.

$ vi README.md

  It's Git tutorial  (末尾に追加)

$ git diff

  diff --git a/README.md b/README.md
  index 6b8af08..57c7114 100644
  --- a/README.md
  +++ b/README.md
  @@ -1,2 +1,3 @@
   Git tutorial
   Git tutorial desu
  +It's Git tutorial   (先頭に + がついているのが追加した行)

ステージ領域に変更を add する. この状態で git diff コマンドを実行すると ワークツリーとステージ領域の状態と差分が無いために何も表示されない. 最新コミットとの差分を確認するためには HEAD をつけて git diff を 実行する.

$ git add README.md

$ git diff

$ git diff HEAD

  diff --git a/README.md b/README.md
  index 6b8af08..57c7114 100644
  --- a/README.md
  +++ b/README.md
  @@ -1,2 +1,3 @@
   Git tutorial
   Git tutorial desu
  +It's Git tutorial

git commit を実行する前に git diff HEAD を実行して, 今回のコミットが 前回のコミットからどのような差分があるのか確認をする癖をつけると良いだろう. 確認後に git commit する.

$ git commit -m "Add index"

  [master df2a0a8] Add index
   1 file changed, 1 insertion(+)

コミットの確認のために git log を実行する.

$ git log

  ... (略) ... 

過去のコミットとの比較する場合は log の commit 欄のハッシュを用いる. 以下の例では log を確認し, 初期状態との比較を行う. "+" が付いている行が変更された部分である.

$ git log

  ... (中略) ...

  commit 1bab8bed19137dbefd7c93d09d42ed1f15a9e8a6  (ここのハッシュを使う)
  Author: sugiyama <[email protected]>
  Date:   Tue Nov 21 01:31:11 2017 +0900

      first commit

$ git diff 1bab8bed19137dbefd7c93d09d42ed1f15a9e8a6

  diff --git a/README.md b/README.md
  index e69de29..57c7114 100644
  --- a/README.md
  +++ b/README.md
  @@ -0,0 +1,3 @@
  +Git tutorial
  +Git tutorial desu
  +It's Git tutorial

git rm

ファイルの削除の練習をしてみる. 一度ファイルを作成し, それを削除する. ファイルを追加する場合に add => commit の順で行ったのと同様に, ファイルを削除する場合は rm => commit する. git rm した段階で ワーキングツリー内から該当ファイルは削除されるが, commit しないと最終的に反映されない.

$ touch test.txt

$ ls 

  README.md  test.txt

$ git add test.txt 

$ git commit -m "add test.txt"

  [master 1a061f5] add test.txt
   1 file changed, 0 insertions(+), 0 deletions(-)
   create mode 100644 test.txt

$ git rm test.txt

$ ls 

  README.md

$ git status

  On branch master
  Changes to be committed:
    (use "git reset HEAD <file>..." to unstage)

  deleted:    test.txt

$ git commit -m "remove test.txt"

  [master 322bfbf] remove test.txt
   1 file changed, 0 insertions(+), 0 deletions(-)
   delete mode 100644 test.txt

課題