Gitコマンドリファレンス - 事前準備、開発中、バグ調査などで使うコマンド一覧

More than 3 years have passed since last update.

Git使用時に使うコマンド群を事前準備~コミット、マージまで含めて記載します。

(使っているコマンドを書いていったら思ったより長くなってしまいました...こんなに長いと使い勝手が悪いですね、反省。)


紹介しているコマンド一覧


事前準備内容で紹介しているコマンド一覧

git config --global user.name ユーザ名 ユーザ名設定

git config --global user.email メールアドレス アドレス設定

git config --global push.default current プッシュ挙動設定

git config --global --add merge.ff false マージ挙動設定

git config --global --add pull.ff only プル挙動設定

git config --global merge.tool vimdiff マージツール設定

git config credential.helper 'cache --timeout=3600' ログイン時間設定


開発中など - 基本で紹介しているコマンド一覧

git clone レポジトリ取得

git init レポジトリ初期化

git remote add origin https://ユーザ名@レポジトリ.git レポジトリURLセット

git remote set-url origin https://ユーザ名@レポジトリ.git レポジトリURLセット後の変更

git status --short --branch カレントブランチと修正内容表示

git log --oneline --graph グラフでログ表示

git fetch --parge リモートの更新内容有無確認

git pull リモートの更新内容取得

git add . ローカル更新内容一括追加

git rm $(git ls-files --deleted) 削除済ファイルのレポジトリからの一括削除

git commit -m "コメント内容" コミット+一行コメント

git commit -ac HEAD コミット+変更済ファイル追加+ひとつ前のコミットメッセージ活用

git tag -a "タグの名前" -m "タグの中身を示すコメントなど" タグ追加

git push origin "タグの名前" タグをリモートにPush

git checkout 取り消したいファイル名 ファイル変更取消

git clean -f トラッキング対象にしていないファイルの削除

git reset --hard HEAD トラッキング対象にしているファイルの変更取消

git commit --amend -m "新しいコメント" コミットメッセージの変更

git commit --amend --no-edit コミット漏れファイル追加後に実施で、コミットにファイル追加

git reset --soft HEAD^ 直前コミット取り消し

git push origin :消したいブランチ名 ブランチ削除


開発中など - コンフリクト/バグ調査で紹介しているコマンド一覧

git mergettool マージツール起動

git blame ファイル名 変更者の調査

git bisect start 問題のあるコミット番号 問題のないコミット番号 バグの入ったコミットの調査


事前準備


Commit時などに記録されるユーザ名とメールアドレスを設定する

git config --global user.name ユーザ名

git config --global user.email メールアドレス

ちなみに、--globalをつけると、自分の全Gitのレポジトリを対象に設定することになる。

例えば、普段は会社のユーザ名・アドレスでやっているが、このレポジトリだけは別、という場合は、対象のレポジトリ上で、--globalを除いて、次のように実行する。git config系のコマンドは以下同様。

git config user.name ユーザ名

git config user.email メールアドレス

参考:Setting your username in Git

参考:Setting your email in Git


git pushを実行したときの挙動に関する設定をする

git config --global push.default current

simpleが既定であり、間違いも少ないので使いやすいですが、currentもお薦めです。

参考:gitのpush.defaultに関するノウハウ


git mergeを実行したときの挙動に関する設定をする

git config --global --add merge.ff false

↑をconfigで設定することは、マージの際に

git merge ターゲットブランチ名 --no-ffとするのと同じ。

--no-ffにすると、マージの取り消しに対処しやすいなどの私はメリットを感じていますが、一部議論の余地もあるようです。

参考:「こわくない Git」というスライドを発表しました


merge.ff falseを設定したときのgit pullの挙動に関する設定をする

git config --global --add pull.ff only

↑をconfigで設定することは、プルの際に

git pull ターゲットブランチ名 --ff-onlyとするのと同じ。

--ff-onlyは、merge.ff false時、特に変更を加えていないのにプルする度にマージコミットが発生してしまうことを防ぐための設定です

(当初記載が漏れていたので、追加をしました)


コンフリクト発生時に利用するgit mergetoolを設定する

git config --global merge.tool vimdiff

コンフリクト発生時に、git mergetoolを呼びマージすることで、コンフリクト箇所が明示され、解消が楽になります。設定しなくてもデフォルトではvimdiffが呼ばれますが、間に確認のプロンプトが表示されてしまうので設定をお薦めします。

参考:Gitコンフリクト解消ガイド(git mergetoolの使い方)


リモートレポジトリでの認証を楽にする

git config credential.helper 'cache --timeout=3600'

1時間=3600秒の間、認証結果を保持する、という指定です。

その時間内なら、一度認証すれば、次はIDやパスワードを打たないで済みます。

(Windows上では上記のとおりにいかないとの旨、コメントいただきました。

Windows且つ非Cygwin環境で利用される方はご注意ください。)


開発中など - 基本


Gitのレポジトリを用意する

git clone レポジトリのURL or git init

既にあるものを取ってくるならclone、新規に始めるならinit

ちなみに、ローカルのディレクトリを新たにGitのレポジトリにセットする場合には、次のようにセットします。(ここでは例としてマイクロソフトのPICTのレポジトリをセットするとします。 https://github.com/Microsoft/pict.git)

git remote add origin https://ユーザ名@github.com/Microsoft/pict.git

初めてリモートレポジトリを追加するのではなく、変更する場合はaddset-urlにします。

git remote set-url origin https://ユーザ名@github.com/Microsoft/pict.git

ユーザ名@の部分は必須でなく、省略しても構いませんが、指定しておくと、レポジトリへのアクセスの度にユーザ名を聞かれる手間が省けるのでおすすめです。

参考:Gitを使いこなすための20のコマンド 2ページ


現在の自分のブランチや変更状況を端的に把握する

git status --short --branch

Mは修正済、Aは追加済、など

参考:gitのdiff, status, logを極限までコンパクト化+便利化する


過去のコミットのログを一行表示+グラフ表示する

git log --oneline --graph

Macで言うところのsource treeのように、グラフィカルに表示します。一つ一つのコミットのログが長いと見辛くなってしまうので--onelineをつけることにより、全体の流れの把握をしやすいようにしています。


レポジトリの更新状況を取得する

git fetch --parge

--pargeをつけると、リモートで削除済のブランチをローカルにあるリモートブランチ一覧から消すといったことが出来ます。


リモートレポジトリからの取得する

git pull

或いは、

git fetch後、git merge 対象のブランチ名

対象のブランチ名はこの場合リモートを対象にしたいので、例えばorigin/masterと打ちます。

(origin/を入れないと、master=ローカル上にある最新の更新が反映されてないレポジトリを対象にしてしまうことになる)


更新内容を全て一括で追加する

git add .

カレントディレクトリ以下にあるファイルを全て追加します。


削除済ファイルを一括で削除する

git rm $(git ls-files --deleted)

ディスクから直接削除したファイルについて、一括でgit上から削除します。

尚、ディスクから直接削除せずにgit rm 対象ファイルとして削除した場合はここで紹介している内容の実施は不要です。

参考:ディスクから削除したファイルを簡単に git rm する


更新内容を一行コメントでコミットする

git commit -m "コメント内容"

一行コメントではなく複数行にしたい場合は

git commit -a

とすればOKです。


更新内容全てを一括で追加+前回のコメントを使ってコメントする

git commit -ac HEAD

-c HEADの記述により、HEADのコメント内容を使うということになります。

既にHEADのコメントが入っている状態でエディタが起動するので、そこから編集すればOKです。


コミットに別名(タグ)をつける

git tag -a "タグの名前" -m "タグの中身を示すコメントなど"

後からある時点のコミットを簡単に取り出したいときなどにタグを打つと便利です。コミット番号は4ae3b3...のように覚えるのが難しいですが、タグであれば任意の名前がつけられるので、例えばVersion1.0.0のアプリをリリースした際のコミットにv1.0.0と名付けておくと後から遡るのが楽になります。

タグのpushはgit push origin "タグ名"です。尚、タグ一覧を表示したい場合はgit tag、タグのコミット内容を見たい場合はgit show "タグ名"で可能です。

参考:2.6 Git の基本 - タグ


更新内容の内、一部のファイルのみを取り消す

git checkout 取り消したいファイル名

これにより更新反映前の状態に戻すことが出来ます。

また、数コミット前の状態に戻したい場合は、

git checkout 戻したいコミット番号 戻したいファイルの名前

とします。

戻したいコミット番号はgit log --onelineなどで確認できます。


更新内容の内、トラッキング対象にしていないファイルを一括で取り消す

git clean -f

取り消す前に、取り消す内容について確認したい場合は、

git clean -igit clean -nを使います。

参考:ヾ(o゚ω゚o)ノ゙ git Untracked files(未追跡ファイル)を1発で消し去る


更新内容を全て一括で取り消す

git reset --hard HEAD

HEAD(=更新内容を反映する前の状態)にまるごと戻します。

但し、HEADに含まれていなかったファイルがある場合は、

git add .により全てをトラッキング対象にした上で

git reset --hard HEADをします。


コミットした内容のコメントを変更する

git commit --amend -m "新しいコメント"

--amendを使えば修正可能です。

-mをとれば、勿論、複数行のコメントが出来ます。


コミットした内容にファイルを追加する

git add 足したいファイル(e.g.例えば "."でカレントフォルダ以下すべて)後に git commit --amend --no-edit

--no-editをつけることによってコメントを付け直す処理を省略しています。

参考:git commit --amendでaddし忘れたファイルを救済する


更新内容はそのままにコミットだけ取り消す

git reset --soft HEAD^

直近で実施したコミットを取り消します。ファイル自体は変更しないので、一つのコミットにあれもこれも詰め込みすぎてしまった...といったときなどに使って、git addからやり直す際などに使います。

参考:git commitをやり直しする&取り消しする(「get commit --amend」と「git reset」)


リモートのブランチを消す

git push origin :消したいブランチ名

上記は本来、次のように使います。

git push origin push元のローカルブランチ:push先のリモートブランチ

即ち、:消したいブランチ名というのは、

何もない空のブランチをリモートにpushする=消す、という動作になっています。


開発中など - コンフリクト/バグ調査


マージツールgit mergetoolを起動する

git mergetool

既に紹介した通り、git config --global merge.tool vimdiffを設定している前提です。

<<HEADといったような表記がファイル上を賑わせている状況かと思いますので、差分を見た上で解消していきます。

解消が済んだら、起動しているvim上で:wqaと打てば、保存してマージは終了となります。

マージツールを実行すると、コンフリクトを起こしたファイルの変更前のファイルがファイル名.origとして残ってしまうので、先ほど紹介したgit clean -fなどを実行すると良いでしょう。

尚、参考のリンク内に記載がありますが、既存のvimの設定では非常に見辛いので、.vimrcに対して次の内容を追加すると良いでしょう。

highlight DiffAdd    cterm=bold ctermfg=10 ctermbg=22

highlight DiffDelete cterm=bold ctermfg=10 ctermbg=52
highlight DiffChange cterm=bold ctermfg=10 ctermbg=17
highlight DiffText cterm=bold ctermfg=10 ctermbg=21

参考:Gitコンフリクト解消ガイド(git mergetoolの使い方)


変更を加えた人を調べる

git blame ファイル名

ある行について、誰がいつどのコミットで変更を加えたのか、を知ることができます。基本的に、書いた人が一番そのコードに詳しいと思うので、コードの処理内容について誰に聞くべきかを知るのに良い手段です。


バグの発生箇所を特定する

git bisect start 問題のあるコミット番号 問題のないコミット番号

バグが入りこんだ時点と、少なくともそのバグがなかった時点をそれぞれコミットとして特定します。コミット番号は例えば64aabc...のようなもので、これを調べるにはgit logなどを使います。尚、git tagで打ったタグや、HEADなども使用可能です。

個人的に非常にこのコマンドは気に入っていて、一度git bisect startをしたら後は、二分探索で、挙動に問題がなければgit bisect good、問題があるならgit bisect badと打って次々にチェックしていくというシロモノです。

git bisectgit blameを組み合わせて使えば、誰がどのタイミングでどんなバグを入れ込んでしまったのかが特定しやすくなるので、影響ブランチ・コミットの特定や、直すべき場所の特定が出来て助かりますね。

参考:git bisect で問題箇所を特定する


参考ファイル

GitHub上に、私が使っているconfigファイルを公開していますので、ご活用ください。

(上記記載の設定が反映されています)

myconfig/.gitconfig at master · tkhm/myconfig · GitHub github.com