【gitをソフト開発で使いこなそう:第3回】ファイルの変更をどうやってgitに記録する?

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

前回は、Gitの導入方法について解説しました。
今回は、Gitを実際に使うにあたって必要不可欠な「ファイルの変更をGitに追加する」方法を学びます。

追記

2020/02/02:git statusについての説明を追加。

ファイルの変更を記録するには?

ファイルの変更をGitに保存する場合、

  1. ファイルの内容を変更する
  2. その時点でのファイルの状態をGitに保存する

という手順を踏む必要があります。このうち2の操作をコミットと言います。

alt

ここで注意が必要なのは、Gitはファイルの差分を記録しているのではなくコミットが行われた時点でのファイル全てを記録しているという点です。(効率化のために変更がないファイルは、上の図にある通り前のコミットへのリンクが追加されます。)
このような構造にすることでブランチ(次回解説します。)の作成を高速に行うことが出来ます。

実際にコミットしてみる

以上のことを踏まえて、実際にコミットを行ってみましょう。

リポジトリの作成

リポジトリを作成します。
空のフォルダを新しく作成し(場所はどこでもよい)GitBashを開きます。
そこで、以下のコマンドを入力します。

git init

リポジトリの作成に成功すると以下のようなメッセージが表示されます。

Initialized empty Git repository in <フォルダ名>

ファイルを追加する

今回は、ソフト開発を想定して以下の2つのソースコードを追加します。
main.c,test.hを先ほど作成したフォルダに作成し、以下の内容を追加してください。

main.c
#include<stdio.h>

int main(void){
    printf("%d",add(1,2));
    return 0;
}
test.h
#ifndef TEST_H
#define TEST_H

int add(int,int);

#endif
test.c
#include "test.h"

int add(int a,int b){
    return a + b;
}

コミットする

以下のコマンドを続けて入力します。

git add --all
git commit -m "commit message"

前者のコマンドの意味は、後程解説します。

後者のコマンドでコミットを行います。各コミットには、コミットメッセージと呼ばれるコミットの内容について説明した文を付けることが出来ます。
コミットメッセージは上のコマンドのように、git commit -m "<コミットメッセージ>"とするとつけることが出来ます。

コミットされているか確認する

以下のコマンドを入力すると、今まで行ったコミットが全て表示されます。

git log
commit fb1e8f0021f40e0efd065633694c12b2c3b6c719 (HEAD -> master)
Author: username <mailAddress>
Date:   Sun Oct 6 17:25:44 2019 +0900

    commit message

commit,Author(コミットを行った人物。第二回で登録したユーザ名とメールアドレスが表示される),Date(コミットを行った日付)の下にコミットメッセージが表示されているのがわかります。今回は、コミットメッセージにcommit messageを指定したためcommit messageと表示されています。

Column:分かりやすいコミットメッセージを付ける

先ほども解説した通り、コミットメッセージはコミットの内容を解説したものです。わかりやすいコミットメッセージをつけることによってどのコミットでどのような変更が行われたかが、分かりやすくなります。

どのようなコミットメッセージをつけるかは基本的に自由ですが、普通次のようにします。

  • 1行目に変更内容の概要を書く
  • 2行目は空行にする
  • 3行目に変更の理由を書く
複数行のコミットメッセージを入力するには、「git commit -F- << EOM」と入力します。
「git commit -F- << EOM」と入力すると、複数行入力するためのプロンプトが表示されます。入力を終了したい場合は「EOM」と入力してください。

ステージングエリアって何?

この記事の冒頭で、ファイルの変更をGitに記録するステップを次のように解説しました。

  1. ファイルの内容を変更する
  2. その時点でのファイルの状態をGitに保存する

ですが、実際には1と2のステップの間に以下の操作が入ります。

  • コミットするファイルをある領域に追加する

Gitでは、変更された全てのファイルを変更するのではなくある領域に追加されたファイルだけをコミットします。
このある領域のことをステージングエリアと呼びます。ステージングエリアに追加するファイルを指定することで、「このファイルはコミットせずに、あのファイルだけコミットする」といったことが可能になります。

実際にやってみる

ステージングエリアについてより深く理解するために、実際にステージングエリアを使用してみましょう。
使用するリポジトリは先ほど使用したもので構いません。

新たにDocument.txtを追加し、test.c,test.hを以下の内容に変更してください。

Document.txt
add関数は、与えられた二つの数を加算した数を返します。
sub関数は、(後でsub関数の説明を書く。)
test.h
#ifndef TEST_H
#define TEST_H

int add(int,int);
int sub(int,int);
#endif
test.c
#include "test.h"

int add(int a,int b){
    return a + b;
}

int sub(int a,int b){
    return a - b;
}

ここで、「Document.txtは書きかけだからコミットしたくないが、とりあえずtest.cとtest.hだけコミットしたい」という場合を考えてみます。
このような場合test.cとtest.hだけステージングエリアに追加する必要があります。
test.cとtest.hをステージングエリアに追加するには、次のコマンドを入力します。

git add test.c test.h

この状態で以下のコマンドを入力し、実行するとtest.cとtest.hのみコミットされます。

git commit -m "test.cとtest.hを変更"

git status

git statusコマンドを使うと、どのファイルが変更されているのか、どのファイルがステージングエリアにあるのか、どのファイルが新たに追加されたのかを調べることが出来ます。

簡単な例を一つ挙げてみましょう。
test2.txt、test.txt、test3.txtがあってそれぞれ

  1. test2.txt:ステージングエリアにあるファイル
  2. test.txt:ステージングエリアに追加されていない、変更されたファイル
  3. test3.txt:新たに追加されたファイル

であるとします。
ここで

git status

と入力すると次のように表示されます。

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

        new file:   test2.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   test.txt

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

        test3.txt

上から順に「ステージングエリアにあるファイル(Changes to be committed)」、「ステージングエリアに追加されていない、変更されたファイル(Changes not staged for commit)」、「新たに追加されたファイル(Untracked files)」が表示されていることが分かります。

あとがき

次回は、gitでよく登場する「HEAD」という用語を解説します。

この記事について

この記事について、誤字や間違っている所がある場合は私のTwitterか、コメント欄から連絡をお願いします。

参考文献

Pro Git

Git,GitHubの使い方について、非常に詳しく丁寧に解説されています。
ですが、内容が初心者には難しいと思われるため一度入門記事等を読んで一通りGit,Githubを勉強してから読まれると理解が深まると思います。
pdf形式であれば、日本語版が無料で公開されています。 git-scm.com

次回の記事

terapotan.hatenablog.jp

前回の記事

terapotan.hatenablog.jp

連載記事一覧

terapotan.hatenablog.jp