バージョン管理を行うためのソフトウェア. CVSやSVNよりも若いソフトウェアで,集中管理でなく,分散管理なので,オフライン環境でもcommitが可能.

Gitを用いてソフトウェアのバージョン管理を行うことで,Githubという無料のソフトウェア・ホスティングサービスを利用することができ,ソフトウェアの公開や共有が容易に行えるようになる.

Gitの設定1

まず,使用しているコンピュータでいくつかの初期設定をしておく.しなくても良いが毎回同じことを聞かれたりしないように設定しておくと良い.

$ git config --global user.name "Your NAME"
$ git config --global user.email your_name@example.com

リポジトリの作成

projectという名前のディレクトリで何らかの作業をしており,その作業用のリポジトリを作成したいとする.

 $ git init

として,そのディレクトリにリポジトリを作成する..git/というディレクトリが作成される.(ドットで始まる名前なので,ls -aとしないと見えない.) 作業中のファイルをリポジトリに登録する.

 $ git add file1 file2 ...

こうすることで,file1file2などがリポジトリに登録される準備ができた.

 $ git status

とすると,どのファイルがtrack(追跡)され,どのファイルがtrackされないのかが分かる. 実際に登録するには,

 $ git commit

とする必要がある.emacsviが起動して,コメントを求めてくるので,簡潔かつ充分なコメントを書いておく.

 $ git commit -m 'Some comments.'

としてコメント付きのcommitも可能.

commit

何か作業ディレクトリ内のtrackされているファイル(hoge)を変更したら,

 $ git status

で以前のcommitから変更されたことが確認できる. hogeに関する新たな変更をcommitしたいときは,

 $ git add hoge
 $ git commit -m 'Changed hoge.'

とすれば,変更がcommitされる.

 $ git commit -am 'Changed some...'

のように,-aオプション付きでcommitすれば,(既にtrackされているファイルの内で)変更されたファイルが自動的にaddされてcommitを行う.

archive

プログラム・パッケージを誰かに渡す,もしくは公開する際には,

 $ git archive --format=tar --prefix=project-name/ HEAD | gzip > project-name.tgz

のようにして,HEADをproject-name/が先行するtarアーカイブとして生成する.prefixの最後には「/」を付けておかないとディレクトリの中にソースファイルをという意味にならないので注意(すべてのファイル名の前にprefixがついてしまう).

GitHubからgit clone

$ git clone ssh://github.com/[account-name]/[project-name].git ./[project-name]

のようにしてGitHubの公開リポジトリからクローンを作成することができる.


既存のGitリポジトリをGitHubで公開する

GitHubというgitリポジトリをホストするサービスがあるのでそれを利用する場合. GitHubにアカウントを持っていることを仮定している.

GitHub上にリポジトリを作成する

GitHubサイトのどこかにある「Create a repository」というリンクをクリックし,自分のアカウント内にリポジトリを作成する. README.mdLICENSE.gitignoreなどを作成するかチェック欄があるので,自分のローカルリポジトリに既に存在するなら不要だし,なくて追加したいなら作成するようにチェックする.

ローカルのgitリポジトリにremoteを登録

ローカルgitリポジトリにて,

$ git remote add origin git@github.com:[gitユーザ名]/[プロジェクト名].git

とする. あとはpushすれば良いのだが,GitHub上でREADME.mdなんかを作成していた場合は,まずはgit fetchもしくはgit pullしてmergeしてから,

$ git push -u origin master

としてローカルのmasterをリモートのoriginへpushすれば登録完了.


独自に公開リポジトリを作成する

git-daemonコマンドを使用するが,/opt/local/bin/gitがあるのに,git-daemon/opt/local/libexec/git-core/に存在している.ややこしい. 自分のディレクトリ/Users/username/git/を公開リポジトリのベースディレクトリに指定して公開するには,

 $ sudo /opt/local/libexec/git-core/git-daemon --export-all --base-path=/User/username/git

公開リポジトリに(外部から)新しいリポジトリを作成する

  • 公開リポジトリが存在するホスト名:host
  • リモート端末名:remote

まずは,hostにてリポジトリを作成しなければいけない(と思う)ので,hostにて,作成したいプロジェクト名(project.gitとする)のディレクトリを作成する.そして,そのディレクトリでinitする.

 [host] $ mkdir /Users/username/git/project.git
 [host] $ cd /Users/username/git/project.git
 [host] $ git --bare init

これでhostでの準備はできたので,remote側で作成したプロジェクトを登録する.

 [remote] $ cd /somewhere/project
 [remote] $ git commit -m "Comment something."
 [remote] $ git remote add origin ssh://username@host/~/git/project.git

ここでは,このプロジェクトが既にgitを使用していることを仮定している.git remote add originコマンドによって,/somewhere/project/.git/configファイルに,

 [remote "origin"]
       url = ssh://username@host/~/git/project.git
       fetch = +refs/heads/*:refs/remotes/origin/*

という行が追加されたと思うので,これで準備完了.

 [remote] $ git push origin master

とすることで,現在のmasteroriginにコピーされる(コマンドはoriginmasterにコピーしている様に感じるが...).


Tag

Tagを付ける

$ git tag -a name -m 'comment about the tag.'

Tag名の変更

$ git tag new-tag old-tag             <--- old-tagと同じコミットにnew-tagを付ける
$ git tag -d old-tag                  <--- old-tagを消す
$ git push origin :refs/tags/old-tag  <--- old-tagを消したことをリモートリポジトリに伝える
$ git push --tags origin              <--- 追加したtagをpushする

deleted file の復元

間違ってファイルを消してしまい,まだcommitしていない場合,当該ファイルのHEAD状態をcheckoutすることで復元できる.

$ git checkout HEAD deleted-file-name

Footnotes

  1. Gitの設定