トップ 一覧 ping 検索 ヘルプ RSS ログイン

Git チュートリアルの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
!!!Git チュートリアル
[Git]
*この本からのメモ
{{amazon 427406767X}}


!!!リポジトリの作成
*subversion などたいていのVCSはリポジトリと作業ツリーは別の場所にあるが、Gitでは、どちらも.git ディレクトリに存在する
*Gitでリポジトリを作るには、まずプロジェクトコードを格納したい場所を決める(例として、mysite とする)
*mysite ディレクトリを作成し、その中で git init とする

 $ mkdir mysite
 $ cd mysite
 $ git init
 Initialized empty Git repository in /home/piroto/git_test/mysite/.git/

*これでリポジトリが作成された
*リポジトリのあらゆるメタデータを格納する .git ディレクトリ、mysite が リポジトリからチェックアウトしたソースの作業ツリーとなる

!!!変更を加える
!!ファイル(index.html)の追加
::index.html
 <html>
 <body>
 <h1>Hello World.</h1>
 <body>
 </html>

!!リポジトリへの追加
*2段階の手順
!git add
*リポジトリへの追加を指示
*1つ以上のファイル名を指定
 $ git add index.html 
!git commit
*コミットの実行
*コミットは、リポジトリに格納される1つ1つの履歴
*コミットでは、ユーザー名、メールアドレス、コミットメッセージが格納される
 $ git commit -m "add in hello world HTML"
 [master (root-commit) 6b4f2e7] add in hello world HTML
 1 files changed, 5 insertions(+), 0 deletions(-)
 create mode 100644 index.html
!git log
*コミットの確認
*先頭行はコミット名、SHA-1のハッシュ値によりユニークに識別
 $ git log
 commit 6b4f2e70a4e1950083000148ec8b625be8a86eee
 Author: YAGI Hiroto <piroto@ryujyu.typea.info>
 Date:   Mon Dec 6 22:10:38 2010 +0900
 
     add in hello world HTML

!!!プロジェクト作業の開始
!!index.html の編集
*<head> と <title> を追加
 <html>
 <head>
 <title>Hello World in Git</title>
 </head>
 <body>
 <h1>Hello World.</h1>
 </body>
 </html>
!!git status
*作業ツリーをGitがどう認識しているか確認
*Changed but not updated (変更されているが更新されていない) に分類されているが、コミットするには、変更をステージ(stage)する必要がある
*ステージするとコミットの準備を整えたことになる
 $ 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:   index.html
 #
 no changes added to commit (use "git add" and/or "git commit -a")

!!Gitではプロジェクトコードが保持される場所が3つある
+作業ツリー
+インデックス(ステージングエリア)
+リポジトリ

""ステージングエリアは、作業ツリーとリポジトリの間にあるバッファ。リポジトリにコミットしたい変更だけをアレンジ。

!!変更をステージ(再度 git add)する
*Change to be commitd (コミットされる変更)に状態が変わる
 $ git add index.html 
 $ git status
 # On branch master
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #       modified:   index.html
 #
!!コミット
!git commit
*-m パラメータは複数追加でき、それぞれ段落になる
 $ git commit -m "add <head> and <title> to index" \
 > -m "This allows for a more semantic document."
 [master 372e445] add <head> and <title> to index
 1 files changed, 3 insertions(+), 0 deletions(-)

!git log
*git log に数値を渡すことで、任意のコミットを表示できる
 $ git log -1
 commit 372e445146791569f4e2b68d04d730c58e6b2ec9
 Author: YAGI Hiroto <piroto@ryujyu.typea.info>
 Date:   Mon Dec 6 22:48:06 2010 +0900
 
     add <head> and <title> to index
     
     This allows for a more semantic document.

!!!ブランチ
!!2つの便利な使いかた
+プロジェクトの別バージョンを別ブランチにする
+特別な機能を使うための目的別ブランチ
!!使いかた
!ブランチを作る git branch
 git branch [作りたいブランチの名前] [分岐元にしたいブランチの名前]
::例
  $ git branch RB_1.0 master
 *master は Gitでのデフォルトブランチ名
*RB は Release Branch の略
""これで、リリース準備が整ったブランチが切り離せたので、影響をあたえずに変更できる
!HTMLをさらに編集
     :
 <body>
 <h1>Hello World.</h1>
 <ul>
   <li><a href="bio.html">BIografy</a></li>
 </u>
 </body>
     :
!変更をコミット
* -a パラメータを付けてGitが変更があったと認識している全てをコミット
 git commit -a 
::コメントの入力を促されるので、入力してエディタを終了させる
 # Please enter the commit message for your changes. Lines starting
 # with '#' will be ignored, and an empty message aborts the commit.
 #
 # Committer: root <root@ryujyu.typea.info>
 #
 # On branch master
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #       modified:   index.html
 #
!ブランチを切り替える git checkout
*リリースバージョンのブランチに切り替えて修正を施してみる
::ブランチの切り替え
 $ git checkout RB_1.0
 Switched to branch 'RB_1.0'

!リリースバージョンのHTMLを修正
* meta タグを追加
 <head>
 <title>Hello World in Git</title>
 <meta name="description" content="hello world in Git" />
 </head>
!コミット
 $ git commit -a
* エディタにより、メッセージの保存を行う 

!!!リリース
!!タグ
!タグを打つ
*タグを打つことで、リポジトリの特定の時点に目印を付けて参照しやすくする。
 git [タグ名] [タグを打つポイント]
 $ git tag 1.0 RB_1.0 
!タグの一覧
*リポジトリにおけるタグの一覧
 $ git tag
 1.0

!!リベース
*以下のためには、git rebase コマンドを利用する
""現時点で、ブランチが2つあり、それぞれが関知していないコミットを持っている。RB_1.0(リリース1.0) に変更がなされたことを、master ブランチ(リリース2.0向けの作業)にも知らせる必要がある。
*ブランチから変更を取り出してきて、別のブランチの先頭で再生するのがリベース(rebase)
::この状態を
{{ref_image rebase01.jpg}}
::こうする
{{ref_image rebase02.jpg}}
::まずは、ブランチを切り替えて master ブランチに戻る
 $ git checkout master
 Switched to branch 'master'
::rebase コマンドの実行
 $ git rebase RB_1.0
 Current branch master is up to date.
::ブランチの削除
*リポジトリは、上記の下図の状態になったので、リリースブランチを削除する
*先ほど作ったタグが、RB_1.0 と同じコミットを指しているため、失うものはない
*git branch -d で削除
 $ git branch -d RB_1.0
 Deleted branch RB_1.0 (was d0068a8).
::内容を確認
 $ cat index.html 
 <html>
 <head>
 <title>Hello World in Git</title>
 <meta name="description" content="hello world in Git" />
 </head>
 <body>
 <h1>Hello World.</h1>
 <ul>
   <li><a href="bio.html">BIografy</a></li>
 </u>
 </body>
 </html>

!!タグからブランチを作る
*リリースブランチ(RB_1.0)を削除してしまったが、タグを指定してブランチを作成できる
*タグ 1.0 から、 RB_1.0.1 をブランチ
 $ git branch RB_1.0.1 1.0

!!アーカイブ
*アーカイブを作成するために、git archive コマンドが用意されている
!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 clone ssh://piroto@192.168.24.53/home/piroto/git_test/mysite
{{ref_image git_cyg01.jpg}}
::git
*スピード重視の独自プロトコル
*9418ポートを使うのでファイアーウォールの設定が必要
*パスは、リポジトリだと見なすパスをGitサーバー起動時に指定するので、クライアントはリポジトリ名を指定
*多くの git:// は読み取り専用として、書き込みには、ssh:// を使うことが多い
 git://[server][リポジトリ] 
::HTTP/HTTPS
*困ったときの最後のプロトコル
*効率的ではないが、厳格なファイアーウォールでも許可されていることが多い
 http://[server][リポジトリのパス] 

!!!Subversion とのコマンド対比
,subversion,git
,svnadmin create,git init
,svn checkout,git clone
,svn update,git pull
,svn add,git add
,svn commit,git add、git commit
,svn status,git status
,svn switch <branch>,git checkout <branch>
,svn merge <branch>,git merge <branch>
,svn revert <file>,git checkout <file>

!!!リモートでの作業
*http://git-scm.com/book/ja/v1/Git-%E3%81%AE%E5%9F%BA%E6%9C%AC-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E3%81%AE%E4%BD%9C%E6%A5%AD
*http://naokirin.hatenablog.com/entry/20111201/1322576109

!!git init --bare
*bareオプションをつけた場合、bareリポジトリを作成します。
*bareリポジトリは、作業ファイルがなく、管理ファイルのみのリポジトリになります。
*コミットなどはそのリポジトリでは行われません。(というか行えない。)
*bareリポジトリは、サーバ側のリモートリポジトリとして使うリポジトリを作成する際に使用します。

 # git init --bare hoge
!!git init --bare --shared=true
*通常リモートリポジトリはようにします。グループで共有するためには--shared=trueを指定しないといけないみたいです。


!!git remote add
*リモートリポジトリの追加
*新しいリモート Git リポジトリにアクセスしやすいような名前をつけて追加する
 git remote add [shortname] [url] 
 $ git remote
 origin
 $ git remote add pb git://github.com/paulboone/ticgit.git
 $ git remote -v
 origin  git://github.com/schacon/ticgit.git
 pb  git://github.com/paulboone/ticgit.git