🔀

技術学習ログ: Gitコマンド、実は160種類以上あった

に公開

きっかけ

ふと「Gitコマンドって何種類あるんだろう」と気になって調べてみた。

普段使うのは add、commit、push くらい。せいぜい20種類程度だと思っていたが、公式ドキュメントを見たら 160種類以上 あって驚いた。

せっかくなので整理してみることに。

Gitコマンドの分類

Gitのコマンドは2層構造になっている。

Porcelain(磁器)
ユーザーが直接使う「表側」のコマンド。約90種類。

Plumbing(配管)
Gitの内部で動く「裏側」のコマンド。約80種類。

洗面台に例えると、Porcelainは触る部分、Plumbingは見えない配管部分。なるほど。

Porcelain コマンド

Main Porcelain(主要コマンド)

日常的に使うやつ。約45種類。

基本操作

git init                        # リポジトリ初期化
git clone <url>                 # クローン
git clone --depth 1 <url>       # 浅いクローン(履歴1件のみ)
git add .                       # 全ファイルをステージング
git add -p                      # 変更を対話的にステージング
git commit -m "message"         # コミット
git commit --amend              # 直前のコミットを修正
git status                      # 状態確認
git status -s                   # 短縮表示

ブランチ操作

git branch                      # ブランチ一覧
git branch -a                   # リモート含む全ブランチ一覧
git branch -d <branch>          # ブランチ削除
git checkout <branch>           # ブランチ切替
git checkout -b <branch>        # ブランチ作成して切替
git switch <branch>             # ブランチ切替(新しい方)
git switch -c <branch>          # ブランチ作成して切替
git merge <branch>              # マージ
git merge --no-ff <branch>      # fast-forward禁止でマージ
git rebase <branch>             # リベース
git rebase -i HEAD~3            # 直近3コミットを対話的にリベース

リモート操作

git fetch                       # 全リモートから取得
git fetch origin                # originから取得
git pull                        # 取得してマージ
git pull --rebase               # 取得してリベース
git push                        # 送信
git push -u origin <branch>     # 上流ブランチを設定してプッシュ
git push --force-with-lease     # 安全な強制プッシュ
git remote -v                   # リモート一覧(URL付き)
git remote add origin <url>     # リモート追加

履歴・差分

git log                         # 履歴表示
git log --oneline               # 1行表示
git log --graph                 # グラフ表示
git log -p                      # 差分付きで表示
git diff                        # ワーキングツリーの差分
git diff --staged               # ステージングの差分
git diff HEAD~3                 # 3コミット前との差分
git show <commit>               # 特定コミットの内容
git blame <file>                # 行ごとの変更者表示
git blame -L 10,20 <file>       # 10〜20行目のみ表示

取り消し系

git reset HEAD <file>           # ステージング取り消し
git reset --soft HEAD~1         # コミット取り消し(変更は残す)
git reset --hard HEAD~1         # コミット取り消し(変更も消す)
git restore <file>              # ファイル復元
git restore --staged <file>     # ステージング取り消し
git revert <commit>             # 打ち消しコミット作成
git revert --no-commit <commit> # コミットせずに打ち消し
git cherry-pick <commit>        # 特定コミット適用
git cherry-pick -n <commit>     # コミットせずに適用

reset / restore / revert の違いがずっと曖昧だったのでメモ。

  • reset: HEADを移動して履歴を書き換える
  • restore: ファイルを復元するだけ(履歴に影響なし)
  • revert: 打ち消すコミットを新しく作る(履歴は残る)

Ancillary Commands(補助コマンド)

約30種類。

git config      # 設定
git remote      # リモート管理
git reflog      # 参照ログ
git gc          # ガベージコレクション
git help        # ヘルプ
git fsck        # DB検証

他システム連携

約11種類。SVNやPerforceとの連携用。

git svn    # Subversion連携
git p4     # Perforce連携

今の時代あまり使わなそう。

Plumbing コマンド

普段は使わない内部コマンド。約80種類。

Manipulation(操作系)

git hash-object   # ハッシュ計算
git update-index  # インデックス更新
git write-tree    # ツリー作成
git commit-tree   # コミット作成
git read-tree     # ツリー読込

Interrogation(調査系)

git cat-file   # オブジェクトの中身表示
git ls-files   # インデックスのファイル一覧
git ls-tree    # ツリーの中身
git rev-parse  # リビジョン情報パース
git rev-list   # コミット一覧

Syncing(同期系)

git fetch-pack    # パック受信
git send-pack     # パック送信
git receive-pack  # プッシュ受取
git upload-pack   # フェッチ応答

git commit は内部でこれらのPlumbingコマンドを組み合わせて動いているらしい。

コマンド数まとめ

カテゴリ 数
Porcelain - Main 約45
Porcelain - Ancillary 約30
Porcelain - 連携系 約11
Plumbing - Manipulation 約22
Plumbing - Interrogation 約25
Plumbing - Syncing 約12
Plumbing - Internal 約19
合計 約160〜170

知らなかったコマンド

調べてて「これ便利そう」と思ったものをメモ。

git bisect
バグが混入したコミットを二分探索で特定。

git bisect start
git bisect bad
git bisect good v1.0.0

git worktree
別ディレクトリで別ブランチを同時に作業可能。

git worktree add ../hotfix hotfix-branch

git reflog
HEADの移動履歴。やらかした時の救世主。

git reflog
git reset --hard HEAD@{2}

git shortlog
コントリビューター別のコミット数。

git shortlog -sn

感想

160種類以上あるとはいえ、日常で使うのは20〜30種類程度。

ただ全体像を知っておくと「こういう時はこのコマンドがあるはず」と探せるようになる気がする。

Plumbingの存在を知ったことで、Gitの内部構造にも興味が出てきた。今度 git cat-file とか使って遊んでみたい。

参考

GitHubで編集を提案

Discussion