読者です 読者をやめる 読者になる 読者になる

No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Gitコマンドリファレンス

Git

このリファレンスはGitのコマンドの網羅的な説明にはなっていません。よく使う(と思われる)機能をさらっと調べるためのリファレンスですので、より詳細な機能を調べる際にはGit ユーザマニュアル (バージョン 1.5.3 以降用)Gitマニュアルなどをご参照下さい。
それではスタートです。

設定と初期化

グローバルなユーザ名とメールアドレスを設定する
$ git config --global user.name "hoge"
$ git config --global user.email "hoge@hoge.com"
特定のリポジトリ用のユーザ名とメールアドレスを設定する
$ cd /path/to/repo
$ git config user.name "hoge"
$ git config user.email "hoge@hoge.com"

グローバルとの違いは--globalオプションの有無。

Gitの出力の色分けを有効にする
$ git config --global color.ui "auto"
日本語ファイル名がクォートされないように設定する
$ git config --global core.quotepath false
Gitコマンドのエイリアスを作る
$ git config --global alias.co 'checkout'
$ git config --global alias.st 'status'
$ git config --global alias.ci 'commit -a'
$ git config --global alias.di 'diff'
$ git config --global alias.br 'branch'

git co でチェックアウト, git brでブランチなどが出来るようになります。

新しいリポジトリの初期化する
$ mkdir /path/to/repo
$ cd /path/to/repo
$ git init
(リポジトリを作ったよというメッセージ)
$ git add .
$ git commit -m "<メッセージ>"
(コミットができたよというメッセージ)
リポジトリのクローンを作る
$ git clone <リポジトリのURL>
(クローンできたよというメッセージ)
既存のディレクトリをGitリポジトリ化する
$ cd /path/to/existing/directory
$ git init
(リポジトリを作ったよというメッセージ)
$ git add .
$ git commit -m "<メッセージ>"
(コミットができたよというメッセージ)
新しいリモートリポジトリの追加する

リポジトリのディレクトリ内で実行

$ git remote add <リモートリポジトリ名> <リポジトリのURL>

日常の作業

新しいファイルの追加や既存のファイルのステージをしてコミットする
$ git add <ファイル*>
$ git commit -m "<メッセージ>"

は複数指定可。

ファイルの一部をステージする
$ git add -p <ファイル*>
(コミットするハンクを選択)
対話的にファイルを追加する
$ git add -i
追跡しているファイル*1への修正をすべてステージする
$ git add -u <パス*>
追跡しているファイルへの修正をすべてコミットする
$ git commit -m "<メッセージ>" -a
作業ツリーにおける変更を元に戻す*2
$ git checkout HEAD <ファイル*>
コミットしていないステージをリセットする*3
$ git reset HEAD <ファイル*>
直近のコミットを修正する

必要な変更を施したら、それをステージする。

$ git commit -m "<メッセージ>" --amend
前回のコミットを修正する(コミットメッセージは再利用する)
$ git commit -C HEAD --amend

ブランチ

ローカルのブランチを表示する
$ git branch
リモートのブランチだけを表示する
$ git branch -r
ローカルとリモートのブランチをすべて表示する
$ git branch -a
現在のブランチから新しいブランチを作る
$ git branch <新しいブランチ名>
別のブランチをチェックアウトする
$ git checkout <ブランチ名>
現在のブランチから新しいブランチを作り、ついでにチェックアウトまでする
$ git checkout -b <ブランチ名>
別の時点を起点にしたブランチを作る
$ git branch <新しいブランチ名> <起点>

リポジトリの履歴のどの時点からでも、そこを<起点>にしたブランチを作れる。<起点>にするのは、<別のブランチ名>でも<コミット名>でも<タグ名>でもいい。

ブランチの移動または名前の変更
$ git branch -m <既存のブランチ名> <新しいブランチ名>
<新しいブランチ名>が存在しない場合のみ成功。
別のブランチを現在のブランチにマージする
$ git merge <ブランチ名>
マージだけしてコミットしない(寸止め)
$ git merge --no-commit <ブランチ名>
コミットのチェリーピック(つまみ食い)
$ git cherry-pick -n <コミット名>
チェリーピックだけしてコミットしない(つまみ食いの寸止め)
$ git cherry-pick --no-commit
マージ済みのブランチ一覧を表示する
$ git branch --merged
未マージのブランチ一覧を表示する
$ git branch --no-merged
1つのブランチの履歴を圧縮して別の履歴にする
$ git merge --squash <ブランチ名>
ブランチを削除する
$ git branch -d <削除するブランチ名>

ブランチが現在のブランチにマージされている場合のみ成功。

ブランチをなにがなんでも削除する
$ git branch -D <削除するブランチ名>

ブランチが現在のブランチにマージされていなくても成功。

タグ

タグを表示する
$ git tag
タグを付ける
$ git tag <タグ名>

現在のブランチのHEADにタグが付けられる。

別の時点のコミットにタグを付ける
$ git tag <タグ名> <コミット名>
タグを削除する
$ git tag -d <タグ名>

履歴

履歴をすべて表示する
$ git log
変更を示すパッチと一緒にログを表示する
$ git log -p
表示するログを1つに限定する
$ git log -1

1はエルじゃなくていちです。

表示するログを20に限定し、パッチも表示する
$ git log -20 -p
過去6時間のコミットを表示する
$ git log --since="6 hours"
2日以上前のコミットを表示する
$ git log --before="2 days"
HEADから2つ前のコミットのログだけを表示する
$ git log -1 HEAD~3

または

$ git log -1 HEAD^^^

または

$ git log -1 HEAD~1^^
2つの時点間のコミットを表示する
$ git log <起点>...<終点>

<起点>および<終点>は<コミット名>、<ブランチ名>、<タグ名>のいずれかの名前。異なるものを組み合わせてもよい。

ログの履歴を1行ずつで表示する
$ git log --pretty=oneline
ログのエントリごとに影響を受けた行の統計情報を表示する
$ git log --stat
コミットにより影響を受けたファイルの状態を表示する
$ git log --name-status
現在の作業ツリーのステージングエリアとの差分を表示する
$ git diff
ステージングエリアとリポジトリとの差分を表示する
$ git diff --cached
作業ツリーとリポジトリとの差分を表示する
$ git diff HEAD
作業ツリーと以前のリポジトリとの差分を表示する
$ git diff <起点>

<起点>はコミット名、ブランチ名、タグ名のいずれかの名前。

リポジトリの2つの時点間での差分を表示する
$ git diff <起点> <終点>
差分の統計情報を表示する
$ git diff --stat <起点> [<終点>]

<終点>は省略可。

指定したファイルについて、コミットの情報を注釈付きで表示する
$ git blame <ファイル>
ファイル内でのコピペおよび行の移動を含めて、コミットの情報を注釈付きで表示する
$ git blame -M <ファイル>
行の移動とオリジナルのファイルを表示して、コミットの情報を注釈付きで表示する
$ git blame -C -C <ファイル>
  • Cを2回付ける。
ログの中でコピペについて表示する
$ git log -C -C -p -1 <時点>
  • Cを2回付ける。

リモートリポジトリ

リポジトリのクローンを作る
$ git clone <リポジトリのURL>
リポジトリのクローンを作るが、直近の200コミットだけをダウンロードする
$ git clone --depth 200 <リポジトリのURL>
新しいリモートリポジトリを追加する
$ git remote add <新しいリモートリポジトリ名> <リポジトリのURL>
リモートブランチをすべて表示する
$ git branch -r
リモートブランチからローカルブランチを作る
$ git branch <新しいブランチ名> <リモートブランチ名>
リモートタグからローカルブランチを作る
$ git branch <新しいブランチ名> <リモートタグ名>
originリポジトリから変更を取得するが、ローカルブランチにはマージしない(寸止め)
$ git fetch
origin以外のリモートリポジトリから変更を取得するが、ローカルブランチにはマージしない(寸止め)
$ git fetch <リモートリポジトリ名>
リモートリポジトリから変更を取得し、現在のブランチにマージする
$ git pull <リモートリポジトリ名>
originリポジトリから変更を取得し、現在のブランチにマージする
$ git pull
ローカルブランチを同じ名前のリモートブランチにプッシュする
$ git push

引数を省略すると origin という名前のリモートリポジトリに現在のブランチをプッシュする。origin に同じ名前のブランチがない場合は、引数を省略せずに明示的にリポジトリとブランチを作成する必要がある。

ローカルブランチをリモートブランチにプッシュする*4
$ git push <リモートリポジトリ名> <ローカルブランチ名>:<リモートブランチ名>

リモートブランチが存在しない場合、リモートリポジトリに新しくその<リモートブランチ名>でブランチを作成する。

リモートブランチを削除する
$ git push <リモートリポジトリ名> :<リモートブランチ名>

<リモートブランチ名>の前の:(コロン)の前にはスペースが必要。

古くなったリモートブランチを取り除く
$ git remote prune <リモートリポジトリ名>
リモートリポジトリと、それに関係するブランチをすべて取り除く
$ git remote rm <リモートリポジトリ名>

サブモジュール

※以下コマンドはワーキングツリーのトップレベル*5で実行する必要があります。

サブモジュールを作成する
$ git submodule add <リポジトリのURL> <クローン先のパス>

サブモジュールを作成すると.gitmodulesという平文の設定ファイルが作成され、指定したリポジトリがクローンされてきます。
しかし、トップレベルの方ではステージされた状態で止まっているため、作成後にコミットが必要です。

$ git commit -m 'add submodule'
サブモジュールを確認する
$ git submodule

-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx path/to/submodule
のように先頭が-で始まる場合、まだ初期化されていません。初期化すると-が消えます。

サブモジュールを初期化する
$ git submodule init <サブモジュールのパス>

サブモジュール定義を含むリポジトリをクローンしてきた場合などは必要です。*6

サブモジュールを更新する
$ git submodule update <サブモジュールのパス>

サブモジュール定義を含むリポジトリをクローンしてきた場合などは必要です。*7

GitとSubversionの橋渡し

Subversionリポジトリ全体のクローンを作る
$ git svn clone <Subversionのリポジトリ>
標準のレイアウトを持つSubversionのリポジトリ全体のクローンを作る
$ git svn clone -s <Subversionのリポジトリ>

trunk、branches、tags による標準の構造を持つSubversionリポジトリのクローン作成に使う。

標準のレイアウトではないSubversionのリポジトリ全体のクローンを作る
$ git svn clone -T <trunkのパス> \
                -b <branchesのパス> \
                -t <tagsのパス> \
                <Subversionのリポジトリ>
標準のレイアウトを持つSubversionのリポジトリのリビジョン1234のクローンを作る
$ git svn clone -s -r 1234
標準のレイアウトを持つSubversionのリポジトリからクローンを作り、リモートブランチにすべてプレフィックスを付ける
$ git svn clone -s --prefix svn/ <Subversionのリポジトリ>
上流のSubversionのリポジトリから更新を取得してリベースする
$ git svn rebase
上流のSubversionのリポジトリに変更をプッシュして戻す
$ git svn dcommit
上流にプッシュされるコミットの一覧を表示する
$ git svn dcommit -n
リポジトリのSubversionログを表示する
$ git svn log
ファイルのsvn blameを表示する
$ git svn blame <ファイル>

参考

入門git

入門git


git/コマンドの省略(alias)設定をする方法 - TOBY SOFT wiki
git/日本語ファイル名をgit statusなどで表示する方法 - TOBY SOFT wiki
git submodule - みずぴー日記
[Git] Git コマンドメモ - それはBlog

*1:「追跡しているファイル」とは、過去にgit addコマンドなどによりGitが追跡対象と認識しているファイルを指す。ファイルの修正だけでなく削除も適切に処理される。

*2:git checkoutにおいてHEADの指定は省略できる。masterのようにブランチなどと同じ名前のファイルを作ってしまった場合は、git checkout -- master のようにすればよい。git checkout . とすると作業ツリーのすべての変更が元に戻る。

*3:git reset も git commit と同様にHEADの指定は省略できる。単にgit resetするとすべてのステージがリセットされる。

*4:git pushにより作成・削除されるリモートブランチは、リモートリポジトリのローカルブランチと同じもの。リポジトリ上でgit branchなどにより直接操作できる。

*5:.gitのあるディレクトリ

*6:順序としてはgit submodule init/git submodule update

*7:順序としてはgit submodule init/git submodule update