Git には様々なオプション設定がある。中には挙動を大きく変えるものもあるので注意が必要である。
$ git config --list
システム (/etc/gitconfig) の設定
$ git config --system --list
や、ユーザーごと (~/.gitconfig) の設定
$ git config --global --list
など表示する対象を絞ることもできる。
$ git config --global user.name "John Doe"
$ git config --global user.email "john.doe@example.com"
コミットする時に記録されるユーザー名とメール・アドレスである。
$ git config --global alias.co checkout
これで git co
= git checkout
になる。
$ git config --global core.editor vim
$ git config --global core.pager "nkf -s | LESSCHARSET=utf-8 less"
msysgit ではコミット・ログや diff の日本語が文字化けしてしまうので nkf 等を使って対処してやる必要がある。
~/.inputrc: 最近の msysgit ではマルチバイトの扱いの設定は /etc/inputrc で設定済みなので、~/.inputrc で設定してやる必要は無い。
less: 最近の msysgit では日本語を扱えるものなので差し替える必要は無い。
$ git config --global core.autoCRLF false
true にすると、コミットする時に CR+LF を LF に変換し、チェックアウトする時に LF を CR+LF に変換する。
$ git config user.name "Jane Doe"
設定は .git/config に保存される。
リポジトリの作成からコミットその他、ローカル・リポジトリでのブランチ内作業をざっとまとめる。
$ git init
いつでもどこでも git init
で Git リポジトリを作成することができる。
$ git clone git@yourbox.com:/var/git/my_project clone_project
カレント・ディレクトリに clone_project というディレクトリが作成され、そこにリポジトリが作成される。
リポジトリのルート・ディレクトリに .gitignore という名前のファイルを作成すると、無視するファイルを設定できる (# で始まる行はコメントとみなされる)。
*.log
db/schema.rb
db/schema.sql
Git はデフォルトで空のディレクトリを無視するので、 log/
という名前のディレクトリを含めたいが中にあるファイルは無視したいというような場合は、 .gitignore に log/*
を加えた上で log/.gitignore
を作成すれば良い。
touch log/.gitignore
$ git config --global core.excludesfile $HOME/.gitignore
*.bak や .DS_Store などいちいち指定するのは手間なものをまとめて指定したい場合は ~/.gitignore を作成して core.excludesfile
に指定すると良い。事情があって特定のリポジトリで ~/.gitignore で無視するようにしているファイル (例えば *.bak) を無視しないようにするには、そのリポジトリの .gitignore で、
!*.bak
などと行頭に !
を付けてやれば良い。
$ git add .
カレント・ディレクトリのすべてのファイルとディレクトリがステージに追加される。
$ git status
などといったカレント・ブランチの状態が表示される。
$ git commit -m "First import"
ステージに追加されたファイルだけがコミットされる。
$ git ls-files
コミット前のファイルや .gitignore で指定されているファイルは表示されない。
$ git rm <filename>
次にコミットした時に管理下から削除される。ファイル自体も削除されるので注意が必要。
$ git commit -a
削除されたファイルは反映されるが、新たに作成されたファイルはステージに追加されない。
$ git add <filename>
$ git commit -v
git commit
と git diff
の結果がまとめて表示される。もちろんそのままコミット・メッセージを入力してコミットできる。
$ git commit -m "This is the message describing the commit"
-m
オプションを付けない場合は、設定済みのエディタ (core.editor
) でコミット・メッセージの編集画面が開かれる。
$ git commit --amend
直前のコミットをなかったことにしてやり直すことができる。
$ git reset --soft HEAD^
$ git commit -c ORIG_HEAD
と実行するのとほぼ同じである。
$ git log
デフォルトではコミットのIDやコミットしたユーザー名とメール・アドレス、コミットされた日付、コミット・メッセージが表示される。
$ git log --oneline
各コミットが一行にまとめられたフォーマットで表示される。
$ git log --stat
コミット・メッセージに加えて、ファイルに加わった変更が +
と -
の記号でおおまかに表示される。
$ git shortlog
そのままリリース・ノートに貼り付けられるようにコミット ID 等を省いてコミット・メッセージのみを羅列したフォーマットに整形する。
$ gitk --all
GUI で表示できます!という程度のものと思っておいた方が無難。 Mac OS Xなら GitX が良いという話である。
$ git config --global gui.encoding utf-8
とすると UTF-8 のファイルの変更差分が文字化けしなくなる (コミット・メッセージは常に文字化けしない)。設定しない場合はシステムのデフォルト・エンコーディング (Windows なら Shift_JIS) で表示しようとする。この設定は Git Gui と共通で、 gitk の設定ダイアログでは設定できない。
$ git tag "v1.3"
$ git push --tags
GitHub ではタグをプッシュすると、自動的に tar-ball (zip-ball) を作成してくれる。
Git での開発作業はブランチを作成することで始まり、そのブランチを削除して終わる。
$ git branch <branchname>
作成するだけで、そのブランチに切り替わりはしない。
$ git push origin <branchname>
オプションを省略した場合は設定 (push.default
) によって挙動が大きく変わる。
$ git fetch origin <remote branchname>:<local branchname>
ダウンロードして <local branchname>
でブランチを作成するのみ。
$ git branch
カレント・ブランチの前に *
が付く。
$ git branch -a
リモート・リポジトリのブランチも表示される。
$ git checkout <branchname>
$ git checkout -b <branchname>
<branchname>
でブランチを作成し、すぐにそれに切り替える。
$ git branch <branchname>
$ git checkout <branchname>
と実行するのとほぼ同じである。
$ git branch -d <branchname>
削除しようとしたブランチが他のブランチにマージされていない場合は削除することができない。
$ git branch -D <branchname>
マージされていないブランチも強制的に削除することができる。そのブランチでの作業を復活させることはできない。
$ git rebase master
まずカレント・ブランチでの変更点を一時的に退避させた後、カレント・ブランチを master ブランチの最新の状態に合わせ、カレント・ブランチでの変更点を順に反映していく。 rebase
は強力で便利ではあるが、多くの危険も持ち合わせている。使用にあたっては git help rebase
を熟読した方が良い。
まず master ブランチに戻る。
$ git checkout master
二つのブランチの差分を確認する。
$ git diff master xyz
xyz ブランチを作成した後に master ブランチへ何かしらの変更が加わっていた場合には、両ブランチの最新版同士の差異が表示される。場合によってはそのままマージすると面倒なことになるので、事前に xyz ブランチで `git rebase master` として master ブランチでの変更点を反映させるなどの下準備が必要になるだろう。
マージする。
$ git merge xyz
$ git merge --no-commit xyz
通常はマージした結果コンフリクトが無かった場合は自動的にコミットされる。
$ git reset --hard ORIG_HEAD
マージした直後の場合 (マージした結果が既にコミットされている場合) ORIG_HEAD
はマージする前の HEAD
になる。
$ git cherry-pick <commit ID>
各ファイルに追加されたコンフリクトのマークを目印にして、手作業でファイルを編集しコンフリクトを解決する。そしてステージに追加し、コミットする。
$ git checkout -f
すべてのコミットしていない変更点は破棄され、ブランチの最新のコミットの状態に戻る。 svn revert
相当である。
$ git checkout <filename>
<filename>
のすべてのコミットしていない変更点は破棄される。
分散型バージョン管理システムである Git はリモート・リポジトリを手軽に扱うことができるように作られている。
$ git remote add laptop duo2book.local:repos/m_project
リモート・リポジトリはいくつでも追加することができる。
$ git pull laptop
$ git fetch laptop
$ git merge laptop/xyz
カレント・ブランチに laptop/xyz
(リモート・リポジトリのブランチ)をマージする。
$ git remote show laptop
リモート・リポジトリのURLやブランチの一覧、ローカル・リポジトリのブランチとの対応などが表示される。
$ git branch --track local_branch remote_branch
git push
や git pull
のオプションを省略した時のターゲットとして使われる。
$ git pull
カレント・ブランチがリモート・リポジトリのブランチと関連付けられている場合、オプションは省略することができる。例えば、友人 (Bob) の upgrade というブランチを bobs_upgrade に関連付ける一方で、 origin の master ブランチを master ブランチに割り当てるなど、別々のリモート・リポジトリのブランチを関連付けることもできる。
$ git pull . experimental
ローカルの experimental ブランチからプルする。この場合は merge
と等価で、オプションも共通である。
ブランチと似た動作をするが、一時的な変更に特化させることによって、 git branch
と git commit
、 git merge
等を駆使して行うことを、
$ git stash
$ edit something
$ git commit -a -m "fix something"
$ git stash pop
というように簡潔に行えるようにするコマンドである。
$ git stash save <stashname>
それまでの変更点を <stashname>
に保存した後、前回のコミット時の状態に戻す。オプションは指定しなくても良く、 git stash
だけで自動的に名前が付けられて保存される。
$ git stash list
スタッシュはいくつでも作ることができる。
$ git stash apply
最新のスタッシュから退避した変更を復活させるだけ。オプションとして <stashname>
を指定すると特定のスタッシュから退避した変更を復活させることができる。
$git stash pop
とすると、最新のスタッシュから退避した変更を復活させた上でそのスタッシュを削除する。
$ git stash clear
すべてのスタッシュを削除する。特定のスタッシュを削除する場合は clear
オプションの代わりに drop
オプションを使う。
$ git stash drop <stashname>
スタッシュを復活させることは非常に困難である。
Git から Subversion リポジトリを扱うことを可能にするコマンドである。
$ git-svn clone <svn repository url>
SVN リポジトリの各リビジョンごとにダウンロードし、 Git のコミット・ログを作成しなおすので、履歴が多いほど時間がかかる。
$ git-svn dcommit
$ git-svn rebase
svn update
や git pull
と似たような動作をする。
git log --pretty=format
と git shortlog
は等価ではないので削除したgit merge xyz --no-commit
から git merge --no-commit xyz
とオプション設定をコマンドのすぐ後ろに変更したgit diff master xyz
についての補足説明を追加したcore.excludesfile
では ~/.gitignore
ではなく $HOME/.gitignore
である必要があるようなので修正した