入門 git 入門

Git ユーザマニュアル (バージョン 1.5.3 以降用) を読んで、全体を把握するのは少しきついので、全体像を把握したくて、入門git を購入。

技術系の入門書は、いかに概念がわかりやすく書かれているかが重要だと思うが、概念的な説明、基本的なチュートリアルという意味で、本書は入門書としてはわかりやすい良書だと思う。

で、そんなわかりやすい、入門git のチュートリアルのさらに要点を以下にメモ。

分散バージョン管理システム(DVCS : Distributed Version Control System)

リポジトリ

Git は従来の集中型 バージョン管理システム(VCS : Version Contorol System) とは、異なり、分散型だといわれるが、では具体的に何が分散なのか?と考えていたが、リポジトリが分散しているということらしい。

分散しているといっても、ユーザーが断片を所持しているのではなくて、プロジェクトのすべての履歴を保持したリポジトリをユーザーが、各自で持つという意味で分散。

作業ツリー

様々なファイルに変更を加える場所が、作業ツリー。

集中型では、"あちら側" のサーバーにあり、分散型(Git)では、"こちら側" の自分のコンピュータ にある。

git01

Git の使い方

Git のセットアップ

Cygwin を使うのではなく、Windows ネイティブへGitを移植した Git on MSys もある

Git を使う

大まかな使い方の全体像は、以下のような感じか。

自分の認識を図にしただけなので、間違ってたらごめんなさい。

git02

この全体像を元に、具体的な手順を以下にまとめ。チュートリアルを追った詳細はこちら

リポジトリの作成 (git init)

  • リポジトリと作業ツリーはどちらも.git ディレクトリに存在
  • リポジトリを作るには、まずプロジェクトコードを格納したい場所を決め(例として、mysite とする)、git init とする
$ mkdir mysite
$ cd mysite
$ git init

リポジトリへの追加(git add)

  • 例えば、ファイル(index.html) を リポジトリへ追加するには、git add ファイル名とする
$ git add index.html 

コミット(git commit)

  • コミットは、リポジトリに格納される1つ1つの履歴
  • コミットでは、ユーザー名、メールアドレス、コミットメッセージが格納される
$ git commit -m "add in hello world HTML"

コミットの確認(git log)

  • コミットの確認
  • 先頭行はコミット名、SHA-1のハッシュ値によりユニークに識別
$ git log
commit 6b4f2e70a4e1950083000148ec8b625be8a86eee
Author: YAGI Hiroto 
Date:   Mon Dec 6 22:10:38 2010 +0900

    add in hello world HTML

作業ツリーを Git がどう認識しているかを確認 (git status)

  • 作業ツリーをGitがどう認識しているか確認する
  • index.html を編集し、git status を行うと、Changed but not updated (変更されているが更新されていない) に分類される
$ git status
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   index.html
#
no changes added to commit (use "git add" and/or "git commit -a")

変更をステージ(再度 git add)する

  • ステージングエリアは、作業ツリーとリポジトリの間にあるバッファ。リポジトリにコミットしたい変更だけをアレンジ。
  • Change to be commitd (コミットされる変更)に状態が変わる
$ git add index.html 
$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       modified:   index.html
#

ブランチを作る git branch

  • git branch [作りたいブランチの名前] [分岐元にしたいブランチの名前]
  • master は Gitでのデフォルトブランチ名
$ git branch RB_1.0 master

ブランチを切り替える(git checkout)

$ git checkout RB_1.0

タグを打つ(git tag)

  • git [タグ名] [タグを打つポイント]
$ git tag 1.0 RB_1.0 
  • タグの一覧
$ git tag

リベース(git rebase)

例えば、ブランチを切って、以下のような状況、「現時点で、ブランチが2つあり、それぞれが関知していないコミットを持っている。RB_1.0(リリース1.0) に変更がなされたことを、master ブランチ(リリース2.0向けの作業)にも知らせる必要がある。」になった場合、ランチから変更を取り出してきて、別のブランチの先頭で再生するのがリベース(rebase)

この状態をリベースすることで、

git03

この状態にする

git04

先ずは、ブランチを切り替えて master ブランチに戻る

$ git checkout master
Switched to branch 'master'

rebase コマンドの実行

 git rebase RB_1.0
Current branch master is up to date.

ブランチの削除 (git branch -d)

タグをつけたブランチを削除しても、タグを指定してブランチを作成できるため問題ない

$ git branch -d RB_1.0

タグからブランチを作る (git branch)

  • タグ 1.0 から、 RB_1.0.1 をブランチ
$ git branch RB_1.0.1 1.0

アーカイブを作成(tar)

$ git archive --format=tar --prefix=mysite-1.0/ 1.0 | gzip > mysite-1.0.tar.gz
$ ls
index.html  mysite-1.0.tar.gz
パラメータ 内容
--format=tar tarを出力することを伝えている
--prefix=mysite-1.0/ 全体をmysite-1.0/ ディレクトリ以下に置くように指定
1.0 使用するタグを指定している

 

アーカイブを作成(zip)

$ git archive --format=zip --prefix=mysite-1.0/ 1.0 > mysite-1.0.zip
$ ls
index.html  mysite-1.0.zip

リモートリポジトリのクローンを作る(git clone)

  • リモートリポジトリで作業を始めるためには、git clone でクローンを作成する
  • クローンとは、作業を始めるリポジトリの完全なコピー

以下のプロトコル

プロトコル 書式 特徴
SSH
ssh://[user]@[server][リポジトリのパス] 
  • ドメイン名と、ユーザー名を付加する以外は、ファイルシステムから直接アクセスする場合と同様
git
git://[server][リポジトリ] 
  • スピード重視の独自プロトコル
  • 9418ポートを使うのでファイアーウォールの設定が必要
  • パスは、リポジトリだと見なすパスをGitサーバー起動時に指定するので、クライアントはリポジトリ名を指定
  • くの git:// は読み取り専用として、書き込みには、ssh:// を使うことが多い
HTTP/HTTPS
http://[server][リポジトリのパス] 
 
  • 困ったときの最後のプロトコル
  • 効率的ではないが、厳格なファイアーウォールでも許可されていることが多い

 

別クライアントからアクセスし、クローンを作成する例

git clone ssh://piroto@192.168.24.53/home/piroto/git_test/mysite

git_cyg01

以上。