Gitの基礎練習

結城浩

バージョン管理ツールGitの基礎練習です。 Windows XPのコマンドプロンプトでGitの基本的なコマンドを動かしていきます。 Gitを学び始めるきっかけにどうぞ。
(筆者もまだGitを使いこなしているわけではありません。 誤りのご報告、改善提案などは大歓迎です。フィードバックからよろしくお願いします)

目次

はじめに

Windows XPのコマンドプロンプトで、 バージョン管理ツールGitの基本的なコマンドを動かしてみましょう。

この文書の通りに実行すると、 基本的なGitのコマンドをひととおり試すことができます(できるはずです)。

バージョン管理というものやGitについての解説は省き、 オペレーションだけを示します。

ダウンロードとインストール

Gitのホームページにある、 Downloadのページから、 Win と書かれている二つのリンクのうち、 msysGitと書かれている側のリンク、 http://code.google.com/p/msysgit/downloads/listをたどります。 ファイルの一覧が出るので、新しいものを選んでダウンロードします。

(もう一つのリンクのほうはCygwinです。 Cygwinに慣れている人やSubversionの連携を考えている人はこちらがいいという話もありますが、 結城はまだ試してません。ごめんなさい。 WindowsのGit環境については、WindowsでのGit環境構築とその注意点もご参考にどうぞ)

結城が以下で使ったファイルは、 Git-1.6.4-preview20090730.exe です。

ダウンロードしたファイルを動かすとインストールが始まります。 インストール先はデフォルトのまま、 C:\Program Files\Git としました。

ファイルをGitの管理下に置きましょう

ファイルをGitの管理下に置きましょう。

ディレクトリとファイルを作成しましょう

まずは作業場所を整え、readme.txtというファイルを作ります。

C:\> mkdir work

C:\> cd work

C:\work> mkdir myproject

C:\work> cd myproject

C:\work\myproject> echo This is a readme file. > readme.txt      ※readme.txtを作った

C:\work\myproject> type readme.txt        ※内容の確認
This is a readme file.

カレントディレクトリ以下のファイルすべてをGitの管理下に置きましょう

C:\work\myproject> git init ※Gitの初期化をします
Initialized empty Git repository in C:/work/myproject/.git/

C:\work\myproject> git add . (最後のピリオド(カレントディレクトリの意)を忘れずに)

C:\work\myproject> git commit -m "Initial commit." ※修正をメッセージ付きでコミットします
[master (root-commit) a4f79ce] Initial commit.
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 readme.txt

C:\work\myproject> git log ※作業ログを見ます
commit a4f79ce23435c30a16f14fae32d9d8cfa0aa1f92
Author: hyuki <hyuki@example.com>
Date:   Sat Aug 22 15:41:14 2009 +0900

    Initial commit.

実は、ここには管理用のディレクトリ .git も作られています。

C:\work\myproject> dir /b       ※/bオプションで名前だけ見る
.git                          ※管理用のディレクトリ
readme.txt

差分を確認しましょう

readme.txtファイルに一行追加してから差分を確認してみましょう。

C:\work\myproject> echo Nice to meet you. >> readme.txt

C:\work\myproject> type readme.txt
This is a readme file.
Nice to meet you.

C:\work\myproject> git diff               ※差分を見ましょう
diff --git a/readme.txt b/readme.txt
index 277c8cc..5eed5b3 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
 This is a readme file.
+Nice to meet you.

現在の状態を見てみましょう

C:\work\myproject> git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   readme.txt     ※readme.txtが修正されてます(modified)
#
no changes added to commit (use "git add" and/or "git commit -a")

コミットすると編集結果が反映されます

行った修正は、コミットしてはじめてリポジトリに反映されます。 コミットするときには、-mオプションで修正内容を書きます。

C:\work\myproject> git commit -a -m "Add a greeting."  ※-aオプションは、変更したファイルを自動的にgit addします
[master a8055f0] Add a greeting.
 1 files changed, 1 insertions(+), 0 deletions(-)

新しいファイルを追加します

作業コピーの状態を確かめます

C:\work\myproject> git status
# On branch master
nothing to commit (working directory clean)

コミットし忘れているファイルはありません(nothing to commit)。 自分が作業コピーに加えた修正は、リポジトリに反映されています。

新しいhello.txtファイルを作ります

C:\work\myproject> echo Hello. > hello.txt

C:\work\myproject> type hello.txt
Hello.

新しく作ったファイルはまだGitの管理下にありません

C:\work\myproject> git status
# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       hello.txt
nothing added to commit but untracked files present (use "git add" to track)

git statusで、現在の状態がわかります。 いま作ったばかりのファイル(hello.txt)が、まだGitの管理下にないことがわかります。 Gitは、hello.txtのことを追跡していません(untracked)。 追跡するためにはgit addを使いなさいとアドバイスが表示されています。

hello.txtを追加します

C:\work\myproject> git add hello.txt

C:\work\myproject> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   hello.txt

git addで、 ファイルhello.txtをGitの管理下に置きました。 でも、まだリポジトリには反映していません。

git statusを実行すると、 追加したけれどまだコミットしていないファイルがわかります(new file:という印がつきます)。

コミットしてリポジトリに反映します

C:\work\myproject> git commit -a -m "Add hello.txt."
[master a07d6dc] Add hello.txt.
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hello.txt

C:\work\myproject> git status
# On branch master
nothing to commit (working directory clean)

git commitでリポジトリにコミットしました。

再度git statusしてみると、 さっきコミットしてないと言われたファイル(hello.txt)の名前は、もう表示されません。 すでにコミットされたからです。

新しいディレクトリを追加します

新しいディレクトリに新しいファイルを作り、リポジトリにコミットしてみましょう。

C:\work\myproject> mkdir src ※srcディレクトリを作成します

C:\work\myproject> cd src ※srcディレクトリへカレントディレクトリを変更します

C:\work\myproject\src> ※ここで、エディタを使ってGood.javaを作成します

C:\work\myproject\src> type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good");
    }
}

C:\work\myproject\src> git add Good.java

C:\work\myproject\src> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   Good.java
#

C:\work\myproject\src> cd ..

C:\work\myproject> git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   src/Good.java
#

C:\work\myproject> git commit -a -m "Add a Java source file."
[master 9437904] Add a Java source file.
 1 files changed, 5 insertions(+), 0 deletions(-)
 create mode 100644 src/Good.java

C:\work\myproject> git status
# On branch master
nothing to commit (working directory clean)

編集からコミットまでの流れはこんな風に進みます

C:\work\myproject> cd src

C:\work\myproject\src> ※ここで、エディタを使ってGood.javaを編集する

C:\work\myproject\src> type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!");
    }
}

C:\work\myproject\src> git diff                     ※差分を見てみましょう
diff --git a/src/Good.java b/src/Good.java
index 1c1f198..ab7c9e5 100644
--- a/src/Good.java
+++ b/src/Good.java
@@ -1,5 +1,5 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good");
+        System.out.println("Good!");
     }
 }

C:\work\myproject\src> git commit -a -m "Add an exclamation mark."
[master 83f63df] Add an exclamation mark.
 1 files changed, 1 insertions(+), 1 deletions(-)

ブランチを使ってみましょう

新しいブランチを作ります

C:\work\myproject\src> git branch mytrial ※mytrialというブランチを作りました

C:\work\myproject\src> git branch ※現在のブランチは?
* master           ※masterが現在のブランチ(*)印
  mytrial          ※mytrialというブランチもできている

ブランチをmytrialに切り替えましょう

C:\work\myproject\src> git checkout mytrial     ※mytrialにブランチを切り替えます
Switched to branch 'mytrial'

C:\work\myproject\src> git branch               ※現在のブランチは?
  master
* mytrial                          ※mytrialが現在のブランチになりました

C:\work\myproject\src> dir /b
Good.java

C:\work\myproject\src> ※ここで、エディタを使ってGood.javaを編集する

C:\work\myproject\src> type Good.java
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!!!!!!!!!");
        System.out.println("Try!Try!Try!");
        System.out.println("Good!Good!Good!");
    }
}

C:\work\myproject\src> git diff
diff --git a/src/Good.java b/src/Good.java
index ab7c9e5..79acd88 100644
--- a/src/Good.java
+++ b/src/Good.java
@@ -1,5 +1,7 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good!");
+        System.out.println("Good!!!!!!!!!");
+        System.out.println("Try!Try!Try!");
+        System.out.println("Good!Good!Good!");
     }
 }

C:\work\myproject\src> git commit -a -m "Add messages."
[mytrial f48fecb] Add messages.                         ※これはmytrialブランチへのコミットです
 1 files changed, 3 insertions(+), 1 deletions(-)

C:\work\myproject\src> git status
# On branch mytrial
nothing to commit (working directory clean)

ブランチをmasterに戻してmytrialブランチの変更をマージしましょう

C:\work\myproject\src> git branch
  master
* mytrial

C:\work\myproject\src> git checkout master  ※ブランチをmasterに戻します
Switched to branch 'master'

C:\work\myproject\src> type Good.java ※mytrialでの修正はまったくmasterに影響しません
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!");
    }
}

C:\work\myproject\src> git diff mytrial  ※masterとmytrialとの違いを見てみましょう
diff --git a/src/Good.java b/src/Good.java
index 79acd88..ab7c9e5 100644
--- a/src/Good.java
+++ b/src/Good.java
@@ -1,7 +1,5 @@
 public class Good {
     public static void main(String[] args) {
-        System.out.println("Good!!!!!!!!!");
-        System.out.println("Try!Try!Try!");
-        System.out.println("Good!Good!Good!");
+        System.out.println("Good!");
     }
 }

C:\work\myproject\src> type Good.java ※違いを見ただけなので、masterはまだそのまま
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!");
    }
}

C:\work\myproject\src> git merge mytrial ※ここで、mytrialの修正をマージします(コミットもされます)
Updating 83f63df..f48fecb
Fast forward
 src/Good.java |    4 +++-
 1 files changed, 3 insertions(+), 1 deletions(-)

C:\work\myproject\src> type Good.java ※はい、mytrialの修正がマージされました
public class Good {
    public static void main(String[] args) {
        System.out.println("Good!!!!!!!!!");
        System.out.println("Try!Try!Try!");
        System.out.println("Good!Good!Good!");
    }
}

C:\work\myproject\src> git diff ※すでにコミットされています

C:\work\myproject\src> git status ※すでにコミットされています
# On branch master
nothing to commit (working directory clean)

ここまでの作業ログを見ましょう

C:\work\myproject\src> git log
commit f48fecb045ef796be3feb956d50a6b9af809dcee
Author: hyuki <hyuki@example.com>
Date:   Sat Aug 22 16:16:32 2009 +0900

    Add messages.

commit 83f63df5e2e130cba3cb2d74dccb4f16e3d61cd8
Author: hyuki <hyuki@example.com>
Date:   Sat Aug 22 16:08:45 2009 +0900

    Add an exclamation mark.

commit 94379041c045a206fb665d90802728e115631471
Author: hyuki <hyuki@example.com>
Date:   Sat Aug 22 16:06:38 2009 +0900

    Add a Java source file.

commit a07d6dc586da881b2917f190432253d4a616aabd
Author: hyuki <hyuki@example.com>
Date:   Sat Aug 22 15:53:59 2009 +0900

    Add hello.txt.

commit a8055f0b91d5a811f1b66c1adf3f9c917248ed69
Author: hyuki <hyuki@example.com>
Date:   Sat Aug 22 15:49:59 2009 +0900

    Add a greeting.

commit a4f79ce23435c30a16f14fae32d9d8cfa0aa1f92
Author: hyuki <hyuki@example.com>
Date:   Sat Aug 22 15:41:14 2009 +0900

    Initial commit.

Gitの基礎練習は以上です。 お疲れさま。

この文書に書かなかったこと

関連リンク

更新履歴

ぜひ、感想をお送りください

あなたのご意見・感想をお送りください。 あなたの一言が大きなはげみとなりますので、どんなことでもどうぞ。

あなたの名前: メール:
学年・職業など: 年齢: 男性女性
(上の情報は、いずれも未記入でかまいません)

お手数ですが、以下の問いに答えてから送信してください(迷惑書き込み防止のため)。
今年は西暦何年ですか?

何かの理由でうまく送れない場合にはメールhyuki dot mail at hyuki dot comあてにお願いします。

豊かな人生のための四つの法則