Gitを一人で使うときのメモ


このエントリーをはてなブックマークに追加

Mac, Linux, CygwinなどのCUIからGitを使う時の個人用メモ。

準備

Gitの設定を行う。

$ git config --global user.name "Your Name"
$ git config --global user.email your_email_address@example.com
$ git config --global core.editor emacs
$ git config --global color.ui auto

とすると、設定が~/.gitconfigに書き込まれる。

リポジトリを作る

バージョン管理したいディレクトリに移動し

$ git init

とすればOK。自動的に.git/ディレクトリが作られる。やっぱりバージョン管理したくなくなったときは、.git/ディレクトリを消せばよい。

コミットする

git addして次のコミットに加えたいファイルを指定する。その後、git commit -m '(コミットのメッセージを記述)'する。

$ git add file.cpp
$ git add README
$ git commit -m 'added.'

ここでgit addしてファイルを次のコミットに備えることを、「ファイルをステージング・エリアに追加する」という言い方をする。

初めてファイルをGitに追跡させるときは、必ずgit addが必要。追跡中のファイルについて、差分のあるファイルすべてをgit addなしでいきなりコミットしたい場合は

$ git commit -a -m '(コミットのメッセージを記述)'

とする。

ファイルの状態を確認する

$ git status

無視したいファイルを指定する

例えば拡張子が.oや.aのファイルや、emacsなどによって作られるバックアップファイル、中間物が生成されるディレクトリをバージョン管理したくない場合は、.gitignoreファイルに以下のように書く。#で始まる行はコメント。

# 中間ファイル
*.[oa]
# バックアップファイル
*~
# 中間物のためのディレクトリ
tmp/

差分を見る

現在の状態(after)と、git addした状態(before)との差分を見る。つまり、まだステージングされていない情報を知る。

$ git diff

git addした状態(after)と、前のコミット後の状態(before)との差分を見る。つまり、今git commitしたときにコミットされる情報を知る。

$ git diff --staged

$ git diff --cachedとしてもよいが、--stagedの方が覚えやすい。

ファイルの追跡をやめる

git rmを使う。

$git rm foo.c

しかし、この方法だとfoo.cファイルが作業ツリーから消えてしまうので注意。Gitによる追跡はやめたいが、ファイルは作業ツリーに残したい、という場合は--cachedオプションを使う。

$ git rm --cached foo.c

git rmでglobパターンを使うこともできる。シェルによって*が解釈されることを避けるため、*の前にバックスラッシュを付けていることに注意。

$ git rm \*~

コミットの履歴を見る

git logを使う。

$ git log

logには豊富なオプションが存在する。

  • 変更内容も見たいときは-pを付ける。
  • 最近の変更2つ分のみ見たいときは-2を付ける。
  • 最近の2週間に行った履歴のみ見たいときは--since=2.weeksを付ける。
  • 統計情報を見たいときは--statを付ける。
  • 変更を1行で見たいときは--pretty=onelineを付ける。もしくは--onelineでもよい。
  • --graphを付けるとブランチやマージの歴史を視覚的に確認できる。
  • --branchesを付けると自分が今いるブランチ以外のブランチも表示される。
  • --decorateを付けるとHEADやtagも表示される。

個人的には以下のコマンドの使い勝手が気に入っている。

$ git log --oneline --graph --decorate --branches

以下のようにaliasを定義すれば、git loggとするだけで上記コマンドを呼べるようになる。

$ git config --global alias.logg 'log --oneline --graph --decorate --branches'


gitの履歴を確認するGUIツールとしてgitkが、CUIツールとしてtigが存在する。

直近のコミットの変更

git commit --amendを使う。例えば前回のコミットのメッセージを修正したいとき、

$ git commit --amend -m '新しいメッセージ'

とする。また、例えばファイルをaddし忘れた場合は、

$ git add 追加ファイル	
$ git commit --amend

とする。

git addしたけどやっぱりやめる

$ git reset HEAD (addしたけどやめたいファイル)

ファイルの変更を捨てて、一番最近にコミットした状態に戻したい

ファイルの変更は失われるので注意。

$ git checkout -- (戻したいファイル)

この--は、以下にファイル名が来ますよという意味。たまたまGitで予約されているキーワードと同じ名前(たとえばHEAD)を持つファイル名であっても、--の後ならGitが混乱なく扱える。ファイル名がGitの予約語と同じでなければ--は不要。

タグを付ける

特定のコミットに、人が見て分かる印を付ける。
軽量版のタグを付けるには

$ git tag v1.2.1

注釈付きのタグを付けるには

$ git tag -a v1.2.1 -m 'メッセージ'

ブランチを使ったワークフロー

新しい機能を加える、バグを直す、など何か新しいことを始めるたびにブランチを作るのがGit流らしい。

$ git checkout -b featureA  # 新しいブランチ'featureA'を作成して、そのブランチに移動
$ (ファイルを編集)
$ git add (ファイル)
$ git commit -m '機能Aを追加'
$ git checkout master # マスターブランチに戻る
$ git merge featureA # featureAに加えた機能をマスターブランチにマージ
$ git brand -d featureA #featureAブランチは用済みなので削除

ここでgit mergeに--no-ffオプションを付けて、fast-forwardマージを禁止するのがよいという意見が存在する。自分もブランチをマージした痕跡がgraphから消えるのが嫌だったので、常にmergeが--no-ffオプション付きで行われるように以下の設定を行った。

$ git config --global --add merge.ff false

自分の.gitconfigファイル

user欄は除く…

[core]
        editor = emacs
[color]
        ui = auto
[alias]
        co = checkout
        ci = commit
        br = branch
        st = status
        unstage = reset HEAD --
        last = log -1 HEAD
        logg = log --oneline --graph --decorate --branches

参考文献