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の管理下に置きましょう。

まずは作業場所を整え、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.

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)。 自分が作業コピーに加えた修正は、リポジトリに反映されています。

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

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を使いなさいとアドバイスが表示されています。

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というブランチもできている

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)

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の基礎練習は以上です。 お疲れさま。

プル。

フェッチ。

タグ。

複数人での利用方法（コンフリクトの解決）

UNIXでの利用方法

その他、Gitが持っているたくさんの機能の解説

2010年5月6日 リンク追加。

2009年8月27日 書籍リンク追加。

2009年8月25日 少し修正。

2009年8月23日 少し修正。

2009年8月22日 書き始める。公開。

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

あなたの名前： メール：

学年・職業など： 年齢： 男性 女性

（上の情報は、いずれも未記入でかまいません）

(お気軽にどうぞ)

お手数ですが、以下の問いに答えてから送信してください（迷惑書き込み防止のため）。

今年は西暦何年ですか？



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

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