Gitワークフローを強化する:必須のコマンドラインツールとGUI

日常的なGit CLIコマンドと、lazygit、delta、tigなどの便利なツール、そしてレビューや履歴作業のためのGUIクライアントを比較します。

Gitワークフローを強化する:必須のコマンドラインツールとGUI

Gitは、高速でスケーラブルな分散型リビジョン管理システムとして、現代のソフトウェア開発ワークフローの基盤を形成しています。そのコアとなるコマンドラインインターフェースはバージョン管理の強力な制御を提供しますが、広範なコマンドセットを理解し活用すること、そして専用のコマンドラインツールやグラフィカルユーザーインターフェース(GUI)を活用することで、生産性を大幅に向上させ、複雑なタスクを簡素化できます。このガイドでは、実際のワークフローの問題を解決するツール、すなわちクリーンなコミットのステージング、履歴の読み取り、差分のレビュー、変更を見失わずにブランチを扱うことに焦点を当てます。

ここにあるすべてのツールが必要なわけではありません。日々の作業をより明確にする最小限のセットを選んでください。

コアGitワークフロー:必須のコマンドライン操作

Gitは、エンドユーザー向けの高レベルな「porcelain」コマンドと、スクリプトや内部オブジェクト管理用の低レベルな「plumbing」コマンドに分類される豊富なコマンドセットを提供します。ここでは、日常的なタスクに必須のporcelainコマンドに焦点を当てます。

リポジトリの開始

新しいプロジェクトを始める、または既存のプロジェクトに参加するには、以下のコマンドが出発点です。

  • 新しいGitリポジトリを初期化:
    git init
    
  • URLから既存のリポジトリをクローン:
    git clone <url>
    

変更の管理(ステージングとコミット)

コミットする前に、Gitは「ステージングエリア」(インデックスとも呼ばれる)を使用して変更を準備します。これにより、各コミットに含める内容を細かく制御できます。

  • 特定のファイルをステージングエリアに追加:
    git add <file>
    
  • 追跡されていないファイルと変更されたファイルをすべてステージングエリアに追加:
    git add .
    
  • ファイルの一部(ハンク)を対話的にステージング:
    git add -p
    
  • ファイルの移動または名前変更:
    git mv <old> <new>
    
  • ワーキングディレクトリとステージングエリアからファイルを削除:
    git rm <file>
    
  • ファイルシステムから削除せずにGitの追跡からファイルを削除:
    git rm --cached <file>
    
  • 特定のファイルをステージング解除:
    git reset <file>
    
  • すべての変更をステージング解除:
    git reset
    
  • ワーキングディレクトリとステージングエリアの状態を確認:
    git status
    

変更がステージングされたら、コミットできます。

  • ステージングされた変更をコミット(エディタが開いてメッセージ入力):
    git commit
    
  • ステージングされた変更をメッセージ付きでコミット:
    git commit -m 'コミットメッセージ'
    
  • 追跡されている未ステージングの変更を直接コミット(変更に対してgit addをスキップ):
    git commit -am 'コミットメッセージ'
    

ブランチとマージ

ブランチはGitの分散型の性質の基本であり、並行開発を可能にします。マージとリベースは変更を統合する方法です。

  • 既存のブランチに切り替え:
    git switch <name>
    # または(古い構文)
    git checkout <name>
    
  • 新しいブランチを作成して切り替え:
    git switch -c <name>
    # または(古い構文)
    git checkout -b <name>
    
  • すべてのローカルブランチを一覧表示:
    git branch
    
  • 最後にコミットされた日時順にブランチを一覧表示:
    git branch --sort=-committerdate
    
  • ローカルブランチを削除(マージ済みの場合のみ):
    git branch -d <name>
    
  • ローカルブランチを強制削除(未マージでも可能):
    git branch -D <name>
    
  • 現在のブランチに別のブランチをマージ:
    git merge <merge-branch>
    
  • 現在のブランチに別のブランチを単一のコミットとしてマージ(スカッシュマージ):
    git merge --squash <merge-branch>
    git commit -m 'スカッシュされたコミットメッセージ'
    
  • 現在のブランチを別のブランチにリベース(履歴を書き換え):
    git rebase <base-branch>
    

リモートとの連携

Gitは共同作業環境に優れており、リモートリポジトリとの間で変更をプッシュおよびプルします。

  • 新しいリモートリポジトリを追加:
    git remote add <name> <url>
    
  • 現在のブランチをリモート追跡ブランチにプッシュ:
    git push
    
  • 新しいブランチを初めてプッシュし、上流を設定:
    git push -u origin <name>
    
  • 強制プッシュ(非常に注意して使用、リモートの履歴を上書き):
    git push --force-with-lease
    
  • リモートから変更をフェッチ(ローカルブランチに統合しない):
    git fetch origin main
    
  • 変更をフェッチして現在のブランチにマージ:
    git pull origin main
    # または(追跡ブランチが設定されている場合)
    git pull
    
  • 変更をフェッチして現在のブランチをリベース:
    git pull --rebase
    

履歴と差分の確認

何が変更され、誰がその変更を行ったかを理解することは、デバッグとレビューに不可欠です。

  • ステージングされた変更とされていない変更のすべての差分を表示:
    git diff HEAD
    
  • ステージングされた変更のみの差分を表示:
    git diff --staged
    
  • ステージングされていない変更のみの差分を表示:
    git diff
    
  • コミットログを表示(さまざまなオプション):
    git log # 完全なログ
    git log --graph # 履歴のASCIIアートツリー
    git log --oneline # コミットごとに簡潔な1行
    git log <file> # 特定のファイルの履歴
    git log --follow <file> # 名前変更を含む履歴
    git log -G <pattern>
    
    git log -G <pattern>は、一致する行数が変更されたコミットを見つけます。たとえば、git log -G "timeout" -- app/は、サービスディレクトリでタイムアウト処理がいつ変更されたかを知る必要がある場合に便利です。

Gitをより使いやすくするコマンドラインツール

プレーンなGit CLIはベースラインとして維持すべきです。追加のツールは、Gitが何をしているかを隠すのではなく、状態をより見やすくする場合に最適です。

lazygitは、ハンクのステージング、コミットのブラウズ、簡単な競合の解決、ブランチのプッシュのためのインタラクティブなターミナルUIを提供します。視覚的な概要が必要だが、ターミナルで作業を続けたい場合に便利です。

tigは、履歴をブラウズするための高速なテキストUIです。フルデスクトップGUIが利用できないサーバーやリモート開発環境で特に優れています。

deltaは、シンタックスハイライトとより明確な移動行表示でGitの差分を改善します。インストール後、一般的な設定は次のとおりです。

git config --global core.pager delta
git config --global interactive.diffFilter "delta --color-only"

ターミナルの色に合ったオプションについては、deltaのドキュメントを確認してください。最初は設定を小さく保ち、プレーンなGit出力を簡単に復元できるようにします。

リポジトリのクリーンアップや機密履歴の削除には、古いgit filter-branchよりもgit-filter-repoが一般的に推奨されます。履歴の書き換えはチーム作業として扱ってください。コミットIDが変更され、リポジトリを使用する全員が注意深く再同期する必要があります。

GUIがより適している場合

GUIは、広範な変更のレビュー、ブランチの比較、または視覚的に考える人にGitの概念を教える場合に適した選択肢です。GitHub Desktop、GitKraken、Sourcetree、Fork、IDE統合などのツールは、ステージングと履歴の検査を容易にします。

具体的な質問に答えるのに役立つ場合にGUIを使用してください。

  • このブランチでどのファイルが変更されたか?
  • このブランチに固有のコミットはどれか?
  • この名前変更またはリファクタリングは実際に何に影響を与えたか?
  • 競合のどちらの側を保持すべきか?

基本的なコマンドを理解する代わりとしてGUIを使用しないでください。プッシュが失敗した場合、リベースが競合した場合、またはCIがデタッチドコミットをチェックアウトした場合、エラーメッセージと回復手順は依然としてGitの概念です。

日常業務のための実用的な設定

バランスの取れたワークフローは次のようになります。

git status
git add -p
git diff --staged
git commit -m "ヘルスチェックエンドポイントを追加"
git pull --rebase
git push -u origin feature/health-check

次に、git log --oneline --graph --decorate --allまたはGUIを使用して、ブランチがより広い履歴にどのように適合するかを確認します。

エイリアスを追加する場合は、わかりやすいものにしてください。

git config --global alias.st status
git config --global alias.lg "log --oneline --graph --decorate --all"
git config --global alias.unstage "restore --staged"

エイリアスは、すでに理解しているコマンドを短縮する必要があります。名前が間違いなく明確でない限り、破壊的なアクションを実行するエイリアスは避けてください。

最終的なポイント

プレッシャーのかかる状況で理解する必要がある操作(status、diff、add、commit、branch、fetch、pull、push、merge、rebase)にはGit CLIを使用してください。可視性が向上する場合は、ターミナルツールやGUIを追加してください。最良のワークフローは、最も多くのツールがあるものではなく、変更を共有する前に明確に確認できるものです。