Git

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

push

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

誰かのリポジトリのデータを手元に落としてくる(pull)

$ git pull (pullするリモートリポジトリ) 

クローン元からpullするときはリポジトリ指定はいらない

$ git pull

なお、GITのmasterブランチはSVNでいうtrunkに相当する。

svnから移行

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 ./変更したファイル

とする。

Eclipseで使う

EGitプラグインをインストール

Windows

Puttyで鍵を生成している場合は秘密鍵をOpenSSH形式に変換しておく。

以下の設定を開く

メニュー -> Window -> Preference -> General -> Network Connections -> SSH -> General 

SSH2 HOMEのディレクトリに秘密鍵を置くか、ディレクトリを変更する。add private key で設置した秘密鍵を追加する。

git pullのやり方が分からん…

msysgit

Windows用のクライアント。Git Bashというシェル環境がインストールされ、コマンドでGitを操作できる。貧弱ながらGit GUIというGUIアプリも用意されている(WindowsのGUI環境で本格利用するならば、別途TortoiseGitを入れるとよい)。

msysgit - Git for Windows - Google Project Hosting

Cygwin利用者は、msysgitを使わずCygwin環境からGitをインストールするのが良い。

SSHでリモートリポジトリにアクセス

インストール時に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

config

設定をみる

$ git config -l

設定する

$ git config key value

config直接書き換える(あまりやらない方がいいかも…)

$ git config remote.origin.url ssh://wiki.paulownia.jp/var/git/hoge.git
 
git.txt · 最終更新: 2011/10/25 16:01 by nullpon
 
特に明示されていない限り、本Wikiの内容は次のライセンスに従います: CC Attribution-Share Alike 3.0 Unported
Recent changes RSS feed Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki