当メモは2010-11-07に投稿されたものを加筆修正し、再掲したものです。
基本的に当時の内容そのままとなっておりますので、8割りくらいは今でも通用すると思いますが、
廃止になっている機能もあるかもしれませんのでご注意下さい。
このリファレンスはGitのコマンドの網羅的な説明にはなっていません。
よく使う(と思われる)機能をさらっと調べるためのリファレンスですので、
より詳細な機能を調べる際にはGit ユーザマニュアル (バージョン 1.5.3 以降用)やGitマニュアルのリファレンスなどをご参照下さい。
目次
設定と初期化(config)
現在の設定のリストを出力する
git config --global -l
グローバルなユーザ名とメールアドレスを設定する
git config --global user.name "hoge" git config --global user.email "hoge@hoge.com"
グローバルなユーザ名とメールアドレス設定を削除する
git config --global --unset user.name git config --global --unset user.email
グローバルなコミットやタグのメッセージ編集用のエディタを設定する
git config --global core.editor emacs
特定のリポジトリ用のユーザ名とメールアドレスを設定する
$ cd /path/to/repo git config user.name "hoge" git config user.email "hoge@hoge.com"
特定のリポジトリ用のユーザ名とメールアドレス設定を削除する
$ cd /path/to/repo git config --unset user.name git config --unset user.email
特定のリポジトリ用のコミットやタグのメッセージ編集用のエディタを設定する
$ cd /path/to/repo git config core.editor emacs
- グローバルとの違いは
--global
オプションの有無です。
Gitの出力の色分けを有効にする
git config --global color.ui "auto"
日本語ファイル名がクォートされないように設定する
git config --global core.quotepath false
- 日本語のファイル名が以下のように文字化けするときは
core.quotepath false
を設定すると文字化けしなくなります。
create mode 100644 "_draft/IT\351\226\242\351\200\243/access.md"
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
でブランチなどが出来るようになります。
リポジトリの初期化(init, clone)
新しいリポジトリの初期化する
$ 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>
- リポジトリのディレクトリ内で実行して下さい。
日常の作業(add, restore, commit, checkout, reset)
新しいファイルの追加や既存のファイルのステージをしてコミットする
git add <ファイル*> git commit -m "<メッセージ>"
*
は複数指定可能です。
ファイルの一部をステージする
git add -p <ファイル*> (コミットするハンクを選択)
対話的にファイルを追加する
git add -i
追跡しているファイルへの修正をすべてステージする
git add -u <パス*>
- 「追跡しているファイル」とは、過去に
git add
コマンドなどによりGitが追跡対象と認識しているファイルを指します。 - ファイルの修正だけでなく削除も適切に処理されます。
追加したファイルやディレクトリを取り消す
git restore --staged <パス*>
追加したすべてを取り消す
git restore --staged .
追跡しているファイルへの修正をすべてコミットする
git commit -m "<メッセージ>" -a
作業ツリーにおける変更を元に戻す
git checkout HEAD <ファイル*>
git checkout
においてHEAD
の指定は省略できます。master
のようにブランチなどと同じ名前のファイルを作ってしまった場合は、git checkout -- master
のようにすればよいです。git checkout .
とすると作業ツリーのすべての変更が元に戻ります。
コミットしていないステージをリセットする
git reset HEAD <ファイル*>
git reset
もgit commit
と同様にHEADの指定は省略できます。- 単に
git reset
するとすべてのステージがリセットされます。
--soft:HEADの位置のみ戻す
git reset --soft HEAD
--mixed:HEADの位置とステージング状態を戻す
git reset --mixed HEAD または git reset HEAD
--hard:HEADの位置とステージング状態と作業ディレクトリの編集内容を戻す(つまり編集内容を完全に捨てて戻す)
git reset --hard HEAD
- よく使うのは
--hard
です。 --soft
と--mixed
はこちらで用例など説明しています。
直近のコミットを修正する
git commit -m "<メッセージ>" --amend
- 必要な変更を施したら、それをステージします。
前回のコミットを修正する(コミットメッセージは再利用する)
git commit -C HEAD --amend
変更の退避(stash)
変更を退避する
git stash push または git stash
- コミットされていない変更が退避されます。(
add
したものと、していないものが含まれる) push
は省略可能です。
変更を退避するとき、addしたものは退避しない
git stash push -k または git stash push --keep-index
変更を退避するとき、新規作成されたファイルも一緒に退避する
git stash push -u または git stash push --include-untracked
-k
と-u
は共存して指定させることもできます。その場合、新規作成されたファイルは含めるけど、addしたものは退避しないという感じになります。
変更を退避するときにメッセージも付けて退避する
git stash push -m "メッセージ" または git stash -m "メッセージ"
- メッセージは一覧を見る時に確認できます。
- 同じことをするのに
stash save
というコマンドがありますが、こちらは古いコマンドで、v2.13.2
以降では推奨されないとのことです。
退避した作業の一覧を見る
git stash list
退避した作業を戻す
git stash apply <スタッシュ名>
<スタッシュ名>
はgit stash list
で見た時に出てくるstash@{0}
のようなものです。apply
すると、add
していた変更もadd
されていない状態で戻ります。
退避した作業をaddした状態のまま戻す
git stash apply <スタッシュ名> --index
add
した状態のまま戻したい場合は、apply
するときに--index
を付けます。
退避した作業を消す
git stash drop <スタッシュ名>
退避した作業をすべて消す
git stash clear
退避した作業を元に戻すと同時に、stashのリストからも消す
git stash pop <スタッシュ名> または git stash pop
apply
してからdrop
するのと同じです。<スタッシュ名>
を省略した時は、直近にstashしたが選ばれます。
退避した変更のファイル一覧を見る
git stash show <スタッシュ名>
退避した変更の詳細を見る
git stash show <スタッシュ名> -P
参考
- (Qiita) 【git stash】コミットはせずに変更を退避したいとき
- (サル先生のGit入門) Stash
- (モヒカンメモ) 名前をつけてgit stashする
- Git - git-stash Documentation
ブランチ(branch, merge, cherry-pick)
ローカルのブランチを表示する
git branch
リモートのブランチだけを表示する
git branch -r
ローカルとリモートのブランチをすべて表示する
git branch -a
現在のブランチから新しいブランチを作る
git branch <新しいブランチ名>
別のブランチをチェックアウトする
git checkout <ブランチ名>
現在のブランチから新しいブランチを作り、ついでにチェックアウトまでする
git checkout -b <ブランチ名>
別の時点を起点にしたブランチを作る
git branch <新しいブランチ名> <起点>
- リポジトリの履歴のどの時点からでも、そこを
<起点>
としたブランチを作成できます。 <起点>
にするのは、別のブランチ名
でもコミット名
でもタグ名
でもよいです。
ブランチの移動または名前の変更
git branch -m <既存のブランチ名> <新しいブランチ名>
<新しいブランチ名>
が存在しない場合のみ成功します。
ブランチの名前変更(強制)
git branch -M <新しいブランチ名>
- 現在のブランチのブランチ名を強制で
<新しいブランチ名>
に変更します。 - 既に
<新しいブランチ名>
のブランチが存在する場合は上書きしてしまいますので注意してください。
ローカルブランチとそれに対応するリモートブランチの状態を確認
git branch -vv
別のブランチを現在のブランチにマージする
git merge <ブランチ名>
マージだけしてコミットしない(寸止め)
git merge --no-commit <ブランチ名>
強制的にマージコミットを作りながらマージ(ファストフォワードしない)
git merge --no-ff <ブランチ名>
特定のコミットのみ取り込む(チェリーピック)
git cherry-pick <コミット名>
特定のコミット範囲(Aの一つ後~Bまで)のみ取り込む(チェリーピック)
git cherry-pick <コミットA>..<コミットB>
- 範囲指定する際、始点の
<コミットA>
は開始範囲に含まれないことに注意して下さい。 <コミットA>
~<コミットB>
を取り込みたい場合は、コミットA^..コミットB
のようにして、<コミットA>
の一つ前から指定します。
特定のコミット範囲(AからBまで)のみ取り込む(チェリーピック)
git cherry-pick <コミットA>^..<コミットB>
チェリーピックだけしてコミットしない(つまみ食いの寸止め)
git cherry-pick -n <コミット名> または git cherry-pick --no-commit <コミット名>
- コミットはされず、ステージされた状態となります。
マージ済みのブランチ一覧を表示する
git branch --merged
未マージのブランチ一覧を表示する
git branch --no-merged
1つのブランチの履歴を圧縮して別の履歴にする
git merge --squash <ブランチ名> git commit
<ブランチ名>
のブランチでコミットした内容が圧縮されてステージされた状態になりますので、その後コミットして下さい。
ブランチを削除する
git branch -d <削除するブランチ名>
- ブランチが現在のブランチにマージされている場合のみ成功します。
ブランチをなにがなんでも削除する
git branch -D <削除するブランチ名>
- ブランチが現在のブランチにマージされていなくても成功します。
参考
タグ(tag)
タグを表示する
git tag
タグを付ける
git tag <タグ名>
- 現在のブランチのHEADにタグが付けられる。
別の時点のコミットにタグを付ける
git tag <タグ名> <コミット名>
タグを削除する
git tag -d <タグ名>
タグをoriginにpushする
git push origin <タグ名>
タグをoriginにpushする(強制上書き)
git push origin <タグ名> -f
- タグはブランチをpushしただけでは、originにpushされない(参照)ので、個別にpushする必要があります。
originのタグを削除する
git push origin :<タグ名> または git push --delete origin <タグ名>
- 1つ目の指定方法は、
<タグ名>
の前にコロン(:
)が必要です。 - これは、
<ローカルのタグ名>:<リモートのタグ名>
を表す形式の、ローカルのタグ名が省略されているパターンです。 - ローカルのタグを失くして、その状態をpushするところをイメージすると分かりやすいかもしれません。
参考
履歴(log, diff)
履歴をすべて表示する
git log
変更を示すパッチと一緒にログを表示する
git log -p
表示するログをひとつに限定する
git log -1
- 1はアルファベットの「エル」ではなく数字の「いち」です。
表示するログを20個に限定し、パッチも表示する
git log -20 -p
過去6時間のコミットを表示する
git log --since="6 hours"
2日以上前のコミットを表示する
git log --before="2 days"
HEADから3つ前のコミットのログだけを表示する
git log -1 HEAD~3 または git log -1 HEAD^^^ または git log -1 HEAD~1^^
2つの時点間のコミットを表示する
git log <起点>...<終点>
<起点>
および<終点>
はコミット名
、ブランチ名
、タグ名
のいずれかの名前を入れます。- 異なるものを組み合わせてもよいです。
ログの履歴を1行ずつで表示する
git log --pretty=oneline
ログをグラフで表示する
git log --graph
ログのグラフで表示する(履歴は1行で表示)
git log --graph --pretty=oneline
--graph
についてはこちら紹介されている以下のエイリアスを設定するとキレイなグラフが簡単に見れるようになります。
.gitconfig
[alias] lg = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative lga = log --graph --all --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative
ログのエントリごとに影響を受けた行の統計情報を表示する
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回付けます。
リモートリポジトリ(remote)
リポジトリのクローンを作る
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 fetch --prune または git fetch -p
- リモートで削除されたブランチに対応するローカルのリモート追跡ブランチを削除します。
リモートリポジトリから変更を取得し、現在のブランチにマージする
git pull <リモートリポジトリ名>
originリポジトリから変更を取得し、現在のブランチにマージする
git pull
ローカルブランチを同じ名前のリモートブランチにプッシュする
git push
- 引数を省略すると
origin
という名前のリモートリポジトリに現在のブランチをプッシュします。 origin
に同じ名前のブランチがない場合は、引数を省略せずに明示的にリポジトリとブランチを作成する必要があります。
ローカルブランチをリモートブランチにプッシュする
git push <リモートリポジトリ名> <ローカルブランチ名>:<リモートブランチ名>
- リモートブランチが存在しない場合、リモートリポジトリに新しくその
<リモートブランチ名>
でブランチを作成しにいきます。 git push
により作成・削除されるリモートブランチは、リモートリポジトリのローカルブランチと同じものです。- リポジトリ上で
git branch
などにより直接操作できる。
リモートブランチを削除する
git push <リモートリポジトリ名> :<リモートブランチ名>
<リモートブランチ名>
の前の:(コロン)
の前にはスペースが必要です。
古くなったリモートブランチを取り除く
git remote prune <リモートリポジトリ名>
リモートリポジトリと、それに関係するブランチをすべて取り除く
git remote rm <リモートリポジトリ名>
サブモジュール(submodule)
※以下コマンドはワーキングツリーのトップレベル(
.git
のあるディレクトリ)で実行する必要があります。
サブモジュールを作成する
git submodule add <リポジトリのURL> <クローン先のパス> git commit -m 'add submodule'
- サブモジュールを作成すると
.gitmodules
という平文の設定ファイルが作成され、指定したリポジトリがクローンされてきます。 - しかし、トップレベルの方ではステージされた状態で止まっているため、作成後にコミットが必要です。
サブモジュールを確認する
git submodule
-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx path/to/submodule
のように先頭が-
で始まる場合、まだ初期化されていません。- 初期化すると
-
が消えます。
サブモジュールを初期化する
git submodule init <サブモジュールのパス>
- サブモジュール定義を含むリポジトリをクローンしてきた場合などは必要です。
- 順序としては
git submodule init → git submodule update
サブモジュールを更新する
git submodule update <サブモジュールのパス>
- サブモジュール定義を含むリポジトリをクローンしてきた場合などは必要です。
- 順序としては
git submodule init → git submodule update
GitとSubversionの橋渡し(svn)
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 <ファイル>
参考
元記事
関連メモ
参照
参考サイト
- (Hack Your Design!) 美しき git log --graph のエイリアス
- (Qiita) git で branch を push しただけじゃ tag は push されない話
- (Qiita) 【git stash】コミットはせずに変更を退避したいとき
- (Qiita) マージコミットとFast-forwardマージ
- (Stack Overflow) How to delete a remote tag?
- (dackdive's blog) [git]複数のcommitをまとめてcherry-pickする)
- (まくまくGitノート) git diff や git status での日本語の文字化けを防ぐ (core.page, core.quotepath)
- (サル先生のGit入門) 7. merge --squash
- (サル先生のGit入門) Stash
- (モヒカンメモ) 名前をつけてgit stashする
- (侍エンジニアブログ) git cherry-pickを完全マスター!特定コミットのみを取り込む方法
- (未来エンジニア養成所Blog) 【Git&GitHub】ステージした変更を取り消す(git restore --stagedコマンド)
- Git - git-stash Documentation
- [Git] Git コマンドメモ - それはBlog
- git submodule - みずぴー日記
- 慣れてきたらコミットをまとめてPull Requestしよう(git merge --squash)