1. 設定
  2. 基本
  3. ブランチ
  4. リモート・リポジトリ
  5. git-stash
  6. git-svn
  7. 参考
  8. 修正履歴

設定

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

全リポジトリ共通の .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 commitgit 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 等を省いてコミット・メッセージのみを羅列したフォーマットに整形する。

GUI で履歴を表示

$ gitk --all
gitk は日本語をうまく扱えない。

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>

マージされていないブランチも強制的に削除することができる。そのブランチでの作業を復活させることはできない。

master ブランチでの変更点ををカレント・ブランチに反映させる

$ git rebase master

まずカレント・ブランチでの変更点を一時的に退避させた後、カレント・ブランチを master ブランチの最新の状態に合わせ、カレント・ブランチでの変更点を順に反映していく。 rebase は強力で便利ではあるが、多くの危険も持ち合わせている。使用にあたっては git help rebase を熟読した方が良い。

xyz ブランチを master ブランチにマージさせる

まず 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 pushgit pull のオプションを省略した時のターゲットとして使われる。

オプションを指定せずにプルする

$ git pull

カレント・ブランチがリモート・リポジトリのブランチと関連付けられている場合、オプションは省略することができる。例えば、友人 (Bob) の upgrade というブランチを bobs_upgrade に関連付ける一方で、 origin の master ブランチを master ブランチに割り当てるなど、別々のリモート・リポジトリのブランチを関連付けることもできる。

ローカル・ブランチからプルする

$ git pull . experimental

ローカルの experimental ブランチからプルする。この場合は merge と等価で、オプションも共通である。

git-stash

ブランチと似た動作をするが、一時的な変更に特化させることによって、 git branchgit commitgit 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-svn

Git から Subversion リポジトリを扱うことを可能にするコマンドである。

SVN リポジトリをクローンしてローカルに Git リポジトリを作成する

$ git-svn clone <svn repository url>

SVN リポジトリの各リビジョンごとにダウンロードし、 Git のコミット・ログを作成しなおすので、履歴が多いほど時間がかかる。

リモートの SVN リポジトリにコミットする

$ git-svn dcommit

リモート・リポジトリ (SVN) での変更点をローカル・リポジトリ (Git) へ反映させる

$ git-svn rebase

svn updategit pull と似たような動作をする。

参考

修正履歴

  1. 2009-06-18: フィードバックの反映他
    • git log --pretty=formatgit shortlog は等価ではないので削除した
    • git merge xyz --no-commit から git merge --no-commit xyz とオプション設定をコマンドのすぐ後ろに変更した
    • git diff master xyz についての補足説明を追加した
    • 重複していた git-rebase コマンドの解説をまとめた
  2. 2009-06-22: フィードバックの反映
    • gitk の補足説明を更新して gui.encoding についての簡単な説明を追加した
  3. 2009-10-07: フィードバックの反映
    • 実体参照化されていなかった部分を修正した
  4. 2009-11-24: 修正
    • core.excludesfile では ~/.gitignore ではなく $HOME/.gitignore である必要があるようなので修正した