Gitがどんなツールか伝えたくてざっと実例をまとめました

| カテゴリ:Web・IT
昔は使っていなかったのに、なくても平気だったのに、今ではなくてはならない私のパートナー、バージョン管理ツールGit(ギット)。
使い始めたときはその便利さに腰が抜けそうになるほど感動しました。
ということで、自分が好きなものは人に薦めたいという原始的感情に基づき、Gitがどういうツールなのか、今さらの今さらの今さらながら簡単にご紹介。
初心者向けというより、これからGitを使ってみようと思っている、勉強しようと思っているGitを知らない人向け。
Gitをインストールして一通りこの手順をなぞるとGitのさわりがわかるようにって意識して書いたつもりです。
(インストール方法はMacなら最速で Git を Mac にインストールして基本的なコマンドを使う方法 | ウェブル、WinならmsysGitのインストール - ふってもハレてもあたりを参照すれば良いかと)
行頭に > がついている行がターミナル(Mac)やコマンドプロンプト(Win)で入力する部分となります。
CUIベースです。登場するコマンドはinit、add、commit、log、reset、reflog、branch、checkout、merge。
リポジトリの複製には触れていないためcloneコマンドも出てきません。
「git-commit --amendぐらいは使えよ!」「そんな効率悪い使い方するな!」「環境を分散させろ、分散!」「Gitの価値は複数人での共有にこそあるだろう!」「ツールじゃなくてシステムって呼べ!」等々、言いたいことは多数あるかと思いますが、導入記事ということでご容赦くださいませ。
みんなGit使おうよ!

まずはinitでリポジトリの作成

まずは、リポジトリってものを生成します。
リポジトリとは、要は情報を管理するものです。
たとえば、ユーザールートのDocuments配下にgittestというディレクトリがあって、そこを管理対象にしたいとします。
> cd ~/Documents/gittest/
にて移動して(説明不要かと思いますが、↑はgitのコマンドではないですよ)
> git init
initコマンド実行!
Initialized empty git repository in /Users/hoge/Documents/gittest/.git/
こう画面に表示されます。
はい、これだけでリポジトリできました。
配下のディレクトリも管理対象になります。

ファイルつくってcommitしてみよう

このディレクトリに新しく、text.txtというテキストファイルを作ったとします。
中身は↓
テストデータだよ。
この時点でコミットしてみます。
コミットっていうのは超端的に言えば状態の記録。
> git add .
> git commit -m "最初のコミットだよ!"
commitコマンド実行!
commitの前のaddはどのファイルを対象とするかの指定なのですが、 .(半角スペースと.)とすることで全ファイルを対象とできます。
"〜"の中身はなにをしたコミットか後でわかるようにするためのコメントです。
[master (root-commit) e8c1294] 最初のコミットだよ! 1 file changed, 1 insertion(+) create mode 100644 test.txt
画面には何個のファイルをどれだけ変更したかの情報が表示されます。
これで現在の状態が記録されました。

logで履歴の確認

ここで
> git log
って打つと
commit e8c129432853bc0f4e3c7d74e6d0b6888982731b
Author: TaguchiKatan
Date: Sat Sep 29 00:55:00 2012 +0900

最初のコミットだよ!
という風に履歴確認できます。
このときにcommitの後ろに表示される文字列は、特定のコミットまで戻したいとき等に使用します(後述しますが、全桁はいらないです)。

やっぱり今のコミットなしなし! そんなときはreset --soft

たとえば、ファイルの変更とコミットを繰り返したとします。
テストデータだよ。お腹空いたよ。
> git add .
> git commit -m "二度目のコミットだよ!"
テストデータだよ。お腹空いたよ。眠いよ。
> git add .
> git commit -m "三度目のコミットだよ!"
テストデータだよ。お腹空いたよ。眠いよ。秋だね。
> git add .
> git commit -m "四度目のコミットだよ!"
git便利でお腹がすいた。
> git add .
> git commit -m "五度目のコミットだよ!"
いったん履歴を見てみましょう。
履歴を見るのはlogコマンドですが、オプションを指定すると省略形で見やすくなります。
> git log --oneline
0ba26ab 五度目のコミットだよ!
715a0e6 四度目のコミットだよ!
4a8fc57 三度目のコミットだよ!
2d82027 二度目のコミットだよ!
e8c1294 最初のコミットだよ!
オプションは色々あるので、複雑な開発をするときは調べてみると良いですよ!
さて、この状態で最後にしたコミットを取り消したいときはreset!
> git reset --soft HEAD^
これで五度目のコミットはなかったことに!
logを見てみると
> git log --oneline
715a0e6 四度目のコミットだよ!
4a8fc57 三度目のコミットだよ!
2d82027 二度目のコミットだよ!
e8c1294 最初のコミットだよ!
こう変わってます。
コマンドで使用したHEADは最新のコミットを意味します。
HEADの後ろの^はいくつ前かを意味します。
HEAD^ならHEADの一つ前。
HEAD^^ならHEADの二つ前。
つまり、上のコマンドは、最新のコミットの一つ前にsoftに(ファイルはいじらずコミットの記録だけ)戻す、って意味です。
ファイルそのものは変わっていません。
このHEAD^の部分にはlogコマンドで取得した文字列を指定することもできます。
文字列全部を入力せず、--onelineを指定したときに出た先頭数桁だけで大丈夫です。

ファイルそのもの元に戻したい! そんなときはreset --hard

ファイルそのものを二度目のコミットまで戻したい。
そんなときは、softではなくhard!
今は四度目のコミット時点にいるので、二度目のコミットまで戻すには^が二つ。
> git reset --hard HEAD^^
test.txtを開くと
テストデータだよ。お腹空いたよ。
二度目のコミット時点のデータまで戻った!
ちなみに、^を一つもつけなければ最新のコミットに戻ります。
最後のコミット以降の変更をすべて削除したいときにどうぞ。

ファイルを元に戻しすぎちゃった! そんなときはreflog

本当に戻したかったのは二度目じゃなくて三度目のコミットだった!
というときはまずreflogコマンド。
> git reflog
2d82027 HEAD@{0}: reset: moving to HEAD^^
715a0e6 HEAD@{1}: reset: moving to HEAD^
0ba26ab HEAD@{2}: commit: 五度目のコミットだよ!
715a0e6 HEAD@{3}: commit: 四度目のコミットだよ!
4a8fc57 HEAD@{4}: commit: 三度目のコミットだよ!
2d82027 HEAD@{5}: commit: 二度目のコミットだよ!
e8c1294 HEAD@{6}: commit (initial): 最初のコミットだよ!
はい、これまでやったことが全部出ました。
三度目のコミットはHEAD@{4}なので
> git reset --hard HEAD@{4}
test.txtを開くと
テストデータだよ。お腹空いたよ。眠いよ。
はい、元通り!

branchで枝分かれ

gitにはブランチというものがあります。
一言で言うなら枝分かれ。
要は今のファイル構成を複製した別環境を用意すること。
> git branch
と入力すると
* master
こう表示されました。
これは、今masterというブランチにいるよという意味です。
branchの後ろになにもつけないと今いるブランチが確認できます。
masterブランチはデフォルトで作られます。
> git branch master_temp
と入力すると新たにmaster_tempというブランチが作られ
> git branch
* master
master_temp
状態はこうなります。
> git checkout master_temp
と入力するとmaster_tempに移動します。
現在の状態を確認すると
> git branch
master
* master_temp
こうなります。
*の位置がmaster_tempに変わりました。
master_tempの中身はmasterと現時点では同じです。
さて、master_tempに移った状態で、test.txtを
テストデータだよ。お腹空いたよ。眠いよ。
から
中身を変えてみたよ。
こう変えて
> git add .
> git commit -m "大幅に変えてみたよ!"
コミット実行!
このコミットはmaster_tempで行われたもののため、masterには影響していません。
> git checkout master
masterに戻って、test.txtを見ると
テストデータだよ。お腹空いたよ。眠いよ。
はい、変わっていません!

mergeでブランチの内容を適用!

masterにmaster_tempで行った変更を適用したいときは
> git branch
* master
master_temp
今masterにいることを念のため確認してから
> git merge master_temp
test.txtを開くと
中身を変えてみたよ。
となります!
不要になったブランチを削除するなら
> git branch -d master_temp
-dと削除するブランチ名をつけてbranch実行。
状態を確認すると
> git branch
* master
ばっちり消えました!

最後に

まだまだGitの魅力の1/100も伝えられていません!
続きはぜひ使ってあなた自身の目で、身体で、気持ちで感じてください!
GitHubについてや複数人での使用についてもそのうちまとめたいところ。
みんなGit使おうよ!(二度目)

概要

青春B運営メンバー多口カタンによる雑記blogです。
自己紹介はこちら。開発物をまとめたものはこちら
 
ヘッダーイラストはkojiさん制作です。
感想・意見・要望等ありましたら気軽にフォームにてコンタクトくださいませ。
 
Twitterはじめましたので誰でも気軽に声かけてくださいね。