Edited at

意外と知らない? Gitコマンド 100本ノック

More than 1 year has passed since last update.


概要

みなさん、Git使ってますか?

もしくは、使いこなしていますか?

独習Gitを読んで、思いの外Gitコマンドが多かったので、

タイトルの通り、Gitコマンドで100本ノックをまとめてみました。

Gitの環境構築が終わっている状態からを想定しています。

git initでローカルにリポジトリを用意してください。

問題に対して、直後に回答を載せる形式にしています。

Git初心者の方も、目を通して知らないオプションをググれば勉強になると思います。


参考文献

独習Git


100本ノック


Gitに馴染む


1. メールアドレスをGitのグローバル設定に追加

git config --global user.email "Your E-mail@example.com"


2. user.nameの設定値を表示

git config user.name


3. user.emailの設定値を表示

git config user.email


4. Gitヘルプシステムのヘルプ

git help help


5. Gitで利用できる全コマンドのリスト

git help -a


6. すべてのGitコマンドをページで表示

git --paginate help -a


7. すべてのGitガイドを表示

git help -g


8. Gitの用語集(glossary)を表示

git help glossary


リポジトリの作り方と使い方


9. カレントディレクトリ内のGitリポジトリを初期化

git init


10. Gitに関するカレントディレクトリの状態を表示

git status


11. ファイルをGitに追跡させる(ファイルはステージングエリアに追加される)

git add FILE


12. 変更をGitリポジトリにコミットし、メッセージを付ける

git commit -m "Message"


13. Gitリポジトリのログ(ヒストリー)を表示

git log


14. ログとともに、変更されたファイルを表示する

git log --stat


15. リポジトリ内のファイルをリスト表示

git ls-files


ファイルの追跡と更新


16. カレントディレクトリ内で追跡されているファイルと、リポジトリ内のファイルとの間に変更があれば、それを示す

git diff


17. git addを実行してから、ログメッセージとともにgit commitを実行する

git commit -a -m "Message"


18. ステージングエリアとリポジトリの間に変更があれば、それを示す

git diff --staged


19. git addで何が実行されるかを示す

git add --dry-run .


20. カレントディレクトリ内の新しいファイルをすべて追加する

git add .


21. 履歴をコミットごとに1行で表示し、各コミットで変更されたファイルのリストを1行で表示する

git log --shortstat --oneline


変更箇所をコミットする


22. ファイルを作業ディレクトリとステージングエリアから削除(remove)する

git rm FILE


23. 作業ディレクトリとステージングエリアで、FILE1の名前をFILE2に変更する

git mv FILE1 FILE2


24. ステージングエリアに追加(add)すべき変更部分を手作業で選択(pick)する

git add -p


25. ステージングエリアをリセット(reset)して、ファイルをコミット予定から外す

git reset FILE


26. ファイルの「最後にコミットしたバージョン」をチェックアウトして、localの作業ディレクトリに入れる

※まだcommitしていないファイルの差分が消えます

git checkout FILE


Gitというタイムマシン


27. ヒストリー表示。個々のコミットで、親コミットのSHA1 IDも表示する。

git log --parents


28. ヒストリー表示。個々のコミットで、親コミットのSHA1 IDも短縮表示する。

git log --parents --abbrev-commit


29. ヒストリーを簡潔に(各コミットを1行で)表示する

git log --oneline


30. ヒストリー表示。個々のコミットにおけるファイルの差分を示す。

git log --patch


31. SHA1_IDにタグを付ける。タグ名にTAG_NAME、メッセージにTAG_MESSAGEを使う

git tag -a TAG_NAME -m TAG_MESSAGE SHA1_ID


32. ヒストリー表示。patchとstatの出力を組み合わせる。

git log --patch-with-stat


33. ブランチ名を、特定のSHA1 IDに変換する(tagでもできる)

git rev-parse BRANCH


34. 作業ディレクトリを、YOUR_SHA1_IDで指定されたバージョンと一致するものに変更する

git checkout YOUR_SHA1_ID


35. YOUR_SHA1IDを参照するTAG_NAMEという名のタグを作る。このタグには短いメッセージ(MESSAGE)が割り当てられる

git tag TAG_NAME -m "MESSAGE" YOUR_SHA1ID


36. すべてのタグのリストを出力する

git tag


37. TAG_NAMEというタグに関する情報を示す

git show TAG_NAME


ブランチ(支線)を辿る


38. すべてのブランチのリストを表示

git branch


39. BRANCHという名前のブランチを新規に作成する

git branch BRANCH


40. 作業ディレクトリを変更して、BRANCHという名前のブランチを反映させる

git checkout BRANCH


41. リポジトリの履歴をすべてのブランチを通じて閲覧する

git log --graph --decorate --pretty=oneline --all --abbrev-commit


42. git logコマンドのためにlolという名前の別名(alias)を作る(logのオプションは任意)

git config --global alias.lol "log --graph --decorate --pretty=oneline --all --abbrev-commit"


43. すべてのブランチのリストをSHA1ID情報を付けて表示

git branch -v


44. YOUR_SHA1IDを開始地点としてブランチNEW_BRANCHを作る

git branch NEW_BRANCH YOUR_SHA1ID


45. BRANCH_BASEを開始地点としてBRANCH_NEWを作り、即座にチェックアウトする

git checkout -b BRANCH_NEW BRANCH_BASE


46. これまでに(git checkoutやgit reset等によって)行ったブランチ切替のすべての記録を表示する

git reflog


47. 現在進行中の作業(WIP)をスタッシュ(安全な隠し場所)に入れて、git checkoutを実行できるようにする

git stash


48. スタッシュに対比させたWIPのリストを表示

git stash list


49. 最後にスタッシュに入れた内容を現在の作業ディレクトリに反映させ、スタッシュから消去する

git stash pop


ブランチをマージ(統合)する


50. 2本のブランチ間の差分を最初に違いが現れた場所から相対的に示す

---X---------BRANCH1


--------BRANCH2

git diff BRANCH1...BRANCH2


51. YOUR_SHA1_IDを開始地点としてブランチNEW_BRANCHを作る

git branch NEW_BRANCH YOUR_SHA1_ID


52. BRANCHを現在の(カレント)ブランチにマージする

git merge BRANCH


53. git log -n 1の短縮形(最新のコミットだけを表示する)

git log -1


54. BRANCH1とBRANCH2に共通するベースコミットを表示する

git merge-base BRANCH1 BRANCH2


クローン(複製)を作る


55. ソースの位置にあるGitリポジトリのクローンを、複製先ディレクトリに作る

git clone SOURCE DESTINATION_DIR


56. すべてのブランチから、すべてのコミットログエントリを表示する(通常のgit logは、カレントブランチからのエントリだけを表示する)

git log --oneline --all


57. ローカルブランチだけでなく、リモート追跡ブランチも表示する

git branch --all


58. SOURCEにあるGitリポジトリのクローンを、複製先ディレクトリに、ペアリポジトリとして作る(複製先ディレクトリの名前は、規約に従って .gitで終わるようにする)

git clone --bare SOURCE DESTINATION_DIR


59. HEADのすべてのファイルを表示する

git ls-tree HEAD


リモートとの共同作業


60. masterブランチをチェックアウトする。現在のブランチに変更があれば、それらは破棄される。

git checkout -f master


61. 現在のリポジトリにあるリモートの名前を表示する

git remote


62. リモートの名前を、対応するリモートURLとともに表示する

git remote -v show


63. BOBという名前のリモートを追加する。そのリモートは、ローカルリポジトリ../math.bobを指し示す。

git remote add BOB ../math.bob


64. リモートリポジトリREMOTEのリファレンスを表示する(現在のローカルリポジトリを指定するには、REMOTEとして . を使う)

git ls-remote REMOTE


65. リモートとのネットワーク通信の内容を表示する

GIT_TRACE_PACKET=1 git ls-remote REMOTE


変更をプッシュ(送出)する


66. masterブランチをoriginという名前のリモートにプッシュする

git push origin master


67. 現在のブランチを、デフォルトのリモート追跡ブランチにプッシュする。デフォルトは、git checkoutまたはgit push --set-upstreamにより設定される

git push


68. ORIGINという名前のリモートにあるNEW_BRANCHへのリモート追跡ブランチを作成する

git push --set-upstream ORIGIN NEW_BRANCH


69. 名前にBRANCHという言葉が含まれているGit構成設定のリストを表示する

git config --get-regexp BRANCH


70. BRANCHという名前のローカルブランチを削除する

git branch -d BRANCH


71. REMOTE_BRANCHという名前のリモートブランチを、originという名前のリモートから削除する

git push origin :REMOTE_BRANCH


72. SHA1IDにタグを付ける。タグ名にTAG_NAME、メッセージにTAG_MESSAGEを使う

git tag -a TAG_NAME -m TAG_MESSAGE SHA1ID


73. TAGNAMEという名前のタグを、originという名前のリモートにプッシュする

git push origin TAGNAME


74. すべてのタグをデフォルトのリモートにプッシュする

git push --tags


75. originという名前のリモートから、TAGNAMEという名前のタグを削除する

git push origin :TAGNAME


76. ローカルリポジトリから、TAGNAMEという名前のタグを削除する

git tag -d TAGNAME


77. Git構成のpush.defaultを、simpleという値に設定する。これは、アクセスできるすべてのリポジトリに(グローバルに)設定される

git config --global push.default simple


同期を保つ(プル)


78. リポジトリと上流リポジトリと同期させる(git fetchとgit mergeの2つで構成される)

git pull


79. リモートリポジトリから新しいコミットが取り込まれ、リモート追跡ブランチが更新される

git fetch


80. FETCH_HEADからの新しいコミットを、カレントブランチにマージする

git merge FETCH_HEAD


81. --ff-onlyスイッチを指定すると、FETCH_HEADがカレントブランチの子孫である場合に限り、マージが許可される(fast-forwardマージ)

git pull --ff-only


ソフトウェア考古学(ログ)


82. マージの結果であるコミットのリストを表示

git log --merges


83. FILEに影響を与えたコミットのリストを表示

git log --oneline FILE


84. コミットメッセージがSTRINGを含んでいるコミットのリストを表示

git log --grep=STRING


85. 2つの日付の間に作られたコミットのリストを表示

git log --since MM/DD/YYYY --until MM/DD/YYYY


86. 著者名によるコミットの要約

git shortlog


87. 著者名によるコミットの要約で、メールアドレスも表示する

git shortlog -e


88. AUTHORを著者とするコミットのリスト(名前とメールアドレスを表示)

git log --author=AUTHOR


89. 現在のコミットと、その親の間にあるコミット(と、そのファイル)のリスト

git log --stat HEAD^..HEAD


90. 現在のコミットと、その親の間にあるコミット(と、テキストの変更)のリスト

git log --patch HEAD^..HEAD


91. すべてのブランチのリストをコラムに分けて表示する

git branch --column


92. 指定したSHA1_IDの名前を最も近いブランチをベースとして表示する

git name-rev SHA1_ID


93. 指定のSHA1_IDを含む、すべてのブランチを識別する(-rはリモート追跡ブランチを指定する。これを略すとローカルブランチだけが表示される)

git branch -r --contains SHA1_ID


94. STRINGを含む、すべてのファイルを探し出す

git grep STRING


95. FILEのblame出力をコマンドラインで表示する

git blame FILE


@culage 様より、 git gui blame FILE を使うと見やすいそうです!


96. FILEのblame出力をコマンドラインで、FILE-annotateに保存する

git --no-pager blame FILE > FILE-annotate


git rebaseを理解する


97. masterブランチの先で、BRANCHブランチまでにあるコミットを表示

git log --oneline master..BRANCH


98. カレントブランチをmasterの最新コミットにリベースする

git rebase master


99. HEAD@{n}によって表現されるSHA1_IDを指し示すように、HEADをステージングエリアと作業ディレクトリの両方でリセットする

git reset --hard HEAD@{n}


100. masterの最新コミットをカレントブランチに、対話処理でリベースする。これによってエディタが開き、どのコミットをリベースに含めるかの取捨選択が可能となる

git rebase --interactive master


101. 指定のコミットをカレントブランチにコピーする

git cherry-pick SHA1_ID


ワークフローとブランチの規約


102. ファイルの追加なしにコミットを作る

git commit --allow-empty -m "initial commit"


103. BRANCHをカレントブランチにマージし、たとえfast-forwardであっても、マージコミットを作成する

git merge --no-ff BRANCH


Gitを研ぎ澄ませる


104. ローカル(リポジトリ固有の)Git構成をリストで表示

git config --local --list


105. グローバル(ユーザー固有の)Git構成をリストで表示

git config --global --list


106. システム(サーバー全体の)Git構成をリストで表示

git config --system --list


107. 相対的な日付フォーマットで最後の2つのコミットを表示

git -c log.date=relative log -n 2


108. 相対的な日付フォーマットをローカルGit構成に保存

git config --local log.date relative


109. ローカル(リポジトリ固有の)Git構成を編集する

git config --local --edit


110. グローバル(ユーザー固有の)Git構成を編集する

git config --global --edit


111. システム(サーバー全体の)Git構成を編集する

git config --system --edit


112. ローカルGit構成ファイルの名前をプリントする

git -c core.editor=echo config --local --edit


113. ローカルGit構成vimで編集する

git -c core.editor=vim config --local --edit


114. Git構成core.excludesfileの設定値をプリントする

git config core.excludesfile


最後に

100本ノックといいながら114本用意してしまいました。