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 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
参考文献
- サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
- 最初に読むのにちょうどよい。
- Git - Book
- 詳しさがちょうどいい感じのチュートリアル。
- タグ「git」を検索 - はてなブックマーク
- はてなブックマークで人気のある記事は間違いが少ない。
- 入門Git
- Gitのメンテナによる著作。今の自分にはちょっと詳しすぎた。