git 環境のセットアップと簡単なチュートリアル

ソーシャル化するOSS開発者たち − @ITGitHub Issue Tracker! - GitHubを見て、github がとても楽しそうなので、git を使い始めました。


良く使いそうなコマンドとかを調べたのでメモ。

git インストール

インストール

Mac なので、macports 使う

$ sudo port install git-core +svn +gitweb
$ git --version
git version 1.6.2.1
  • 今までsvn 使っていて連携したので「+svn
  • gitweb あると、ブラウザからリポジトリをブラウズできるので入れる
PATH を通す

以下をPATH に追加

/opt/local/libexec/git-core
  • git の場合、git rm とかの後にファイル名の補完が効かない
    • なんとかならないだろうか
  • 同様のコマンドであるgit-rm なら補完できる
  • git-rm を使う場合PATH を通す必要がある

github にコミットするまで

はじめてのgithub - blog.katsuma.tvを参考。

github にアカウント作成
  • 1. github のsignup
  • 2. 公開鍵の登録
  • 3. 登録した後に、~/.ssh/config に以下を追加
    • 「IdentityFile」は秘密鍵のパス。僕の場合は「~/.ssh/id_rsa」なので以下のようになります
Host github.com
  User git
  Port 22
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
  TCPKeepAlive yes
  IdentitiesOnly yes
  • 4. テストレポジトリ作成
    • test という名前でgithub 上に作成
    • ここにローカルのプロジェクトをアップすることになる
    • これは後で消せるので、練習用としてばんばん使う
自分の名前とメールアドレスを登録
$ git config --global user.name "lukesilvia"
$ git config --global user.email "lukesilvia@gmail.com"
  • コミットした時にコミッタの情報として記録される
  • これを登録しないとコミットできない
ローカルにテストプロジェクト作成
$ mkdir ~/gittest
$ cd ~/gittest
初期化
$ git init
Initialized empty Git repository in /Users/luke/gittest/.git/
  • git 管理する場合最初にこれを行なう
  • 毎回レポジトリを作成するのでsubversion 使っていると不思議な感じがするけど、これがgit の方法
ローカルにコミット
echo 'hoge' >> hoge.txt
git add .

# 確認してみる
$ git status 
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#       new file:   hoge.txt
#

# コミット
$ git commit -m 'test commit'
[master (root-commit) 1514c69] test commit
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 hoge.txt

# コミットされたか確認
$ git status
# On branch master
nothing to commit (working directory clean)
  • svn と同じようにgit の管理下に置くには「git add」をする必要がある。逆にadd しなきゃコミットされない
  • 「add .」で、カレントディレクトリ以下のファイルを全て最初のコミットに含める
github に公開
  • リモートレポジトリを登録
    • 「git@github.com:lukesilvia/test.git」をorigin という名前でこのレポジトリのリモートレポジトリとして登録
    • origin という名前は「clone」した時とかにgit がデフォルトで使う名前。別にorigin でなくてもOK
$ git remote add origin git@github.com:lukesilvia/test.git
  • リモートレポジトリにpush
$ git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 210 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:lukesilvia/test.git
 * [new branch]      master -> master	
<<
    • origin(git@github.com:lukesilvia/test.git)にmaster ブランチの内容をpush
    • master ブランチはデフォルトのブランチで、実は現在そこにいる。「$ git branch」と打つと、ブランチが表示されて、master に現在のブランチを示す「*」がついているのが分かる
    • このpush でリモートレポジトリにも「master」という名のブランチが作成される
    • このpush でエラーしたら、公開鍵の設定が上手くいってない可能性が高い

これで公開完了。github にアクセスすると公開されていることが分かる。

チュートリアル

公開後に開発を続けていく上で良く行なうことと、その時に使うコマンド。

変更をローカルにコミット
$ echo 'fuga' >> hoge.txt

# 変更の確認
$ git diff HEAD

# ローカルにコミット
$ git commit -a -m 'message'
  • 「git commit -a」で全ての編集、削除をコミットする。新規追加の場合は「$ git add」してやる必要がある
    • 「-a」オプションを使わない場合は、変更したファイルに対してファイル毎に「$ git add」を行なってから「$ git commit」
ローカルの変更をリモートに反映
$ git push origin master
  • orign レポジトリに、master ブランチの内容を反映
変更の取り消し
  • まだコミットしてない変更を取り消す(最新のコミットの状態に戻す)
$ git reset --hard HEAD
  • 特定のファイルの変更だけを取り消す
$ git checkout HEAD path/to/file
  • git add を取り消す
$ git reset path/to/file
ここ2日間の変更を確認
$ git log -p --since="2 day ago"  
間違えてコミットしちゃったのを直す
$ git revert HEAD
  • これにより、直前のコミットを相殺する変更がコミットが生成される。コミットメッセージもgit によって用意される(変更は可能)ので、それをコミット
無視ファイルの定義
  • 共通のignore
    • 以下のコマンドでconfig に設定を追加して。次に無視するファイルを~/.gitignore に書いていく
git config --global --add core.excludesfile "$HOME/.gitignore"
特定の文字列が関連するコミットの調査
$ git log -S"hoge" -p
  • 対象コミット
    • 文字列hoge が追加
    • 文字列hoge が削除
    • 文字列hoge を含むファイルの追加
    • 文字列hoge を含むファイルの削除
  • このメソッドいつ追加された? とかいう場合に便利そう

はまりそうなdiff コマンド

$ git diff --cached # HEAD と索引間の差分;
                    # つまり、"commit" を実行したときにコミットされる内容
$ git diff          # 索引と作業ディレクトリ間の差分;
                    # つまり、"commit" を実行したときに含まれない
                    # 変更内容
$ git diff HEAD     # HEAD と作業ツリー間の差分:
                    # つまり、"commit -a" を実行したときにコミットされる内容

基本的に、「diff HEAD」で差分確認して、「commit -a」でコミットとなると思います