Gitは、フリーでオープンソースのバージョンコントロールシステム。Linuxのカーネル開発のためにLinus Torvaldsによって開発された。現在のRailsなど有名なプロダクトの開発もGitを使って行われており、人気が高まっている。
Debian系
sudo aptitude install git-core
MacOSX(オプションがいくつかあるのでvariantsで調べて)
sudo port install git-core
Gitは基本的にSVNのように中央リポジトリを必要としない。ワーキングディレクトリがそのままGitのリポジトリになる。
cd my_project git init
コミット対象に追加
git add ファイルorディレクトリのパス
コミット
git commit
変更されたファイルを全部対象にしてコミット(新しく作成したファイルは対象にならないので個別にadd)
git commit -a
最後にコミットしたバージョンに戻す(svnのrevert)
git checkout ファイルorディレクトリのパス
コミッタ名とメールアドレスを変える
git config user.name nullpon git config user.email nullpon@example.com
サーバ上に公開リポジトリを設置する。
サーバ上の /var/git/repo/hoge.git というディレクトリ(ディレクトリ名は必ず 〜.git という名前にすること)で
$ git --bare init
hoge.gitが公開ディレクトリとなる。bareリポジトリはワーキングディレクトリとして使えない。
現在作業中のリポジトリからbareリポジトリを作成する場合は、以下のようにクローンを作成。
$ git --bare clone project project.git
作成したbareリポジトリをサーバに設置し、以下のコマンドを実行
$ git update-server-info
Webサーバ上の公開リポジトリからcloneやpullできる。
$ git clone http://paulownia.jp/repo/hoge.git
pushしたいならssh経由でクローンするのが楽。
$ git clone ssh://nullpon@paulownia.jp/var/git/repo/hoge.git
pushされた内容はpushしただけではbareリポジトリに反映されない。pushする度にupdate-server-infoする必要がある。これをpush時に自動で実行するにはhoge.git/hooksにある post-update.sample をpost-updateにリネームして実行権限を付加する。 post-update.sample はシェルスクリプトで update-server-info のコマンドが書いてある。
手元のリポジトリをサーバに置いたbareリポジトリのcloneと同じ状態にする(bareリポジトリに対して引数無しでpush, pullできるようにする)
$ git remote add origin ssh://wiki.paulownia.jp/var/git/fuga.git $ git config branch.master.remote origin $ git config branch.master.merge refs/heads/master
bareリポジトリをクローンする
$ git clone ssh://nullpon@paulownia.jp/var/git/repo/hoge.git
ローカルのリポジトリにコミット
$ git add lib/hoge.rb $ git commit
ローカルのコミットをリモートのリポジトリに送信(push)するには
$ git push ssh://nullpon@paulownia.jp/var/git/repo/hoge.git master:master $ git push (pushするリモートリポジトリ) (自分のブランチ):(push先のブランチ)
リポジトリのURLは clone したときにoriginという名前が付いているので、originと書くことができる。
$ git push origin master:master
push先ブランチを省略すると手元もリモートもmasterブランチを指定したことになる。
$ git push origin master
リポジトリもブランチも指定しないと、clone元のオリジナルのリポジトリとブランチが指定される(通常はorigin masterを指定するのと同じ)
$ git push
と書くことができる。
誰かのリポジトリのデータを手元に落としてくる(pull)
$ git pull (pullするリモートリポジトリ)
クローン元からpullするときはリポジトリ指定はいらない
$ git pull
なお、GITのmasterブランチはSVNでいうtrunkに相当する。
git-svnを使う
svnリポジトリからクローン。trunk, tags, branchesの構成になっていれば、それも変換される。信じられないほど時間がかかるので注意
$ git svn clone -s svn+ssh://nullpon@example.com/path/to/svn_repo .
どうせ古いのは不要なのでHEADだけ取得、
$ git svn clone -s -rHEAD svn+ssh://nullpon@example.com/path/to/svn_repo .
svn commit相当の操作
$ git svn dcommit
svn update相当の操作
$ git svn rebase
ブランチ一覧を見る
git branch
ブランチ作成
git branch ブランチ名
ブランチ切り替え
git checkout ブランチ名
ブランチの削除
git branch -d ブランチ名 (他のブランチにマージしないと削除できない) git branch -D ブランチ名 (マージされていないブランチを強制削除)
マージの仕方(ブランチhogeをmasterにマージ)
git checkout master git diff hoge (差分の確認) git merge hoge git merge --no-commit hoge(コミットせずに作業領域にマージする) git merge --squash hoge(ブランチの変更を1つのコミットとしてマージする)
checkoutサブコマンドはローカルの変更を取り消してリポジトリの最新バージョンに戻す(svnのrevertに相当する)機能もある。仮にブランチ名と同じファイルがあるとブランチ変更が優先される。その場合でファイルを戻したい時は
git checkout -- 変更したファイル git checkout ./変更したファイル
とする。
EGitプラグインをインストール
Puttyで鍵を生成している場合は秘密鍵をOpenSSH形式に変換しておく。
以下の設定を開く
メニュー -> Window -> Preference -> General -> Network Connections -> SSH -> General
SSH2 HOMEのディレクトリに秘密鍵を置くか、ディレクトリを変更する。add private key で設置した秘密鍵を追加する。
git pullのやり方が分からん…
Windows用のクライアント。Git Bashというシェル環境がインストールされ、コマンドでGitを操作できる。貧弱ながらGit GUIというGUIアプリも用意されている(WindowsのGUI環境で本格利用するならば、別途TortoiseGitを入れるとよい)。
msysgit - Git for Windows - Google Project Hosting
Cygwin利用者は、msysgitを使わずCygwin環境からGitをインストールするのが良い。
インストール時にOpenSSHを使うか、TortoisePLinkを使うか聞かれる。既にTortoiseSVNを使っているかTortoiseGitを使うならばTortoisePLinkを使うとよい。
TortoisePLinkを選択した場合は、Puttyをインストールしておき、あらかじめセッションの設定を保存しておく。例えばmyhomeserverという名前でPuttyのセッションを保存し、Git Bashで
$ git clone ssh://myhomeserver/path/to/repo.git
でクローンできる。SSHログインユーザの指定、公開鍵、ポートの設定などはPuttyセッションで指定すると良い。
コミットのやり直しは自分の手元のリポジトリのみにすべきで、みんながpull、pushするために作成したリポジトリで行うべきではない。
addし忘れて、コミット対象からファイルが漏れていた場合、
$ git add 忘れたファイル $ git commit --amend
入れ忘れたファイルがHEADのリビジョンに追加される。
最後のコミットを取り消す。ワーキングツリーはそのまま
$ git reset --soft HEAD^
最後のコミットを取り消し、ワーキングツリーも戻したコミットの状態にする。
$ git reset --hard HEAD^
コマンドの意味は「コミットを取り消す」ではなく「HEAD^ (=1つ前のコミット) にリセットする」という意味。HEAD^ はHEADの1つ前、HEAD^^は2つ前という意味である。また HEAD~2 も2つ前を示す。したがって、以下のコマンドで2つ前のコミットがリポジトリの最新バージョンとなる(ラスト2つのコミットを取り消す)
$ git reset --soft HEAD^^ $ git reset --soft HEAD~2
ワーキングツリーとインデックス(最後にaddされた状態)の比較
$ git diff $ git diff ファイル名 $ git diff -- ファイル名
ワーキングツリーとコミットを比較
$ git diff コミット名
インデックスとコミットを比較、コミット名を省略するとHEADとの比較
$ git diff --cached $ git diff --cached コミット名
コミット同士を比較
$ git diff 古いコミット名 新しいコミット名
コミット名の指定方法は、 HEAD^^ HEAD~2 のようなHEADからの相対指定、またはハッシュ値による絶対指定のいずれか。
$ git log
5つ前までのログ
$ git log -5 $ git log -n 5
差分も表示
$ git log -p
変更されたファイル名と変更された行数などを表示
$ git log --stat
変更されたファイル名を表示
$ git log --name-status
指定ファイルのログを表示、ファイル名が他の意味を持ってしまう場合は – を使ってファイルであることを示す
$ git log filename $ git log -- filename
設定をみる
$ git config -l
設定する
$ git config key value
config直接書き換える(あまりやらない方がいいかも…)
$ git config remote.origin.url ssh://wiki.paulownia.jp/var/git/hoge.git