Git
GitHub
初心者
新人プログラマ応援

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

概要

みなさん、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本用意してしまいました。