【Git】開発効率が劇的に上がるGit必須コマンド30選
はじめに
業務で使えるGitコマンド30選をまとめたので、紹介していきます。
基本操作
1. リポジトリの初期化
git init
カレントディレクトリをGitリポジトリとして初期化します。.git
ディレクトリが作成され、Gitによるバージョン管理が可能になります。
2. ファイルの追加
特定のファイルをステージング:
git add <ファイル名>
すべての変更ファイルをステージング:
git add .
変更を対話的に選択してステージング:
git add -p
git add -pは変更箇所ごとに追加するかどうかを選択できるので、1つのファイルの中で複数の機能変更があった場合に分けてコミットしたいときに便利です。
git add -pの対話モードオプション詳細
Stage this hunk [y,n,q,a,d,K,j,J,g,/,e,?]?
このプロンプトが表示されたとき、以下のオプションが選択できます:
y - stage this hunk (このハンク(変更内容のグループ)をステージングする)
n - do not stage this hunk (このハンクをステージングしない)
q - quit; do not stage this hunk or any of the remaining ones (終了する; このハンクと残りのハンクをステージングしない)
a - stage this hunk and all later hunks in the file (このハンクとファイル内の後続のハンクすべてをステージングする)
d - do not stage this hunk or any of the later hunks in the file (このハンクとファイル内の後続のハンクをステージングしない)
j - leave this hunk undecided, see next undecided hunk (このハンクを未決定のままにして、次の未決定ハンクを表示する)
J - leave this hunk undecided, see next hunk (このハンクを未決定のままにして、次のハンクを表示する)
K - leave this hunk undecided, see previous hunk (このハンクを未決定のままにして、前のハンクを表示する)
g - select a hunk to go to (移動先のハンクを選択する)
/ - search for a hunk matching the given regex (指定した正規表現に一致するハンクを検索する)
e - manually edit the current hunk (現在のハンクを手動で編集する)
? - print help (ヘルプを表示する)
特にeオプションは強力で、ハンクの中の特定の行だけを選択してステージングできます。複雑な変更を整理してコミットする場合に非常に便利です。
3. 変更のコミット
メッセージ付きでコミット:
git commit -m "コミットメッセージ"
追跡中の変更ファイルをaddしてコミット:
git commit -am "メッセージ"
直前のコミットを修正(エディタが開いて編集):
git commit --amend
メッセージを指定して直前のコミットを修正:
git commit --amend -m "新しいメッセージ"
4. 状態確認
変更ファイルの状態確認:
git status
短縮形式で状態表示:
git status -s
git status -s
は出力が簡潔になるので、大規模なプロジェクトでも状況が把握しやすくなります。
5. 差分確認
ワーキングツリーとステージングの差分:
git diff
ステージングと最新コミットの差分:
git diff --staged
ワーキングツリーと最新コミットの差分:
git diff HEAD
単語単位で差分表示:
git diff --word-diff
ブランチ操作
6. ブランチの作成・切替
ブランチ一覧表示:
git branch
新しいブランチを作成:
git branch <ブランチ名>
ブランチを切り替え:
git checkout <ブランチ名>
ブランチを作成して切り替え:
git checkout -b <ブランチ名>
ブランチを切り替え:
git switch <ブランチ名>
ブランチを作成して切り替え:
git switch -c <ブランチ名>
最近はcheckout
よりもswitch
の使用が推奨されています。
7. ブランチのマージ
現在のブランチに指定ブランチをマージ:
git merge <ブランチ名>
Fast-forwardせずにマージコミットを作成:
git merge --no-ff <ブランチ名>
--no-ff
オプションを使うと、ブランチの履歴がはっきり残るので、機能開発の履歴を残したい場合に便利です。
変更をまとめて1つのコミットにマージ:
git merge --squash <ブランチ名>
8. リベース
rebaseコマンドを一言で言い表せば「ブランチの履歴を別の起点から作り直して、コミット履歴をきれいに整理するコマンド」です。
現在のブランチを指定ブランチの先端に移動:
git rebase <ブランチ名>
現在のブランチのコミットを指定ブランチの最新コミットの上に順番に適用し直します。
履歴を直線的にして読みやすくなりますが、コミットハッシュが変わるため共有ブランチでは注意が必要です。
過去3つのコミットを対話的にリベース:
git rebase -i HEAD~3
直近の3つのコミットを編集、統合、削除、並べ替えなどができるエディタが開きます。
コミット履歴を整理できますが、すでにプッシュしたコミットに対して行うと競合の原因になります。
9. ブランチの削除
マージ済みブランチを削除:
git branch -d <ブランチ名>
強制的にブランチを削除:
git branch -D <ブランチ名>
現在のブランチと指定ブランチ以外のマージ済みブランチをすべて削除:
git branch --merged | grep -v "\*" | grep -v "main" | grep -v "master" | xargs -n 1 git branch -d
このコマンドは、マージ済みのブランチを一覧表示し、現在のブランチ(*)とmain/masterブランチを除外した上で、残りのブランチをすべて削除します。プロジェクトで保護したいブランチがある場合は、grep -v "ブランチ名"を追加してください。
現在のブランチと指定ブランチ以外のすべてのブランチを強制削除:
git branch | grep -v "\*" | grep -v "main" | grep -v "master" | xargs -n 1 git branch -D
このコマンドは、マージ状態に関わらず指定されたブランチ以外のすべてのブランチを対象とするため、未マージの変更も失われます。使用する際は十分に注意してください。
履歴確認
10. コミット履歴の表示
コミット履歴を表示:
git log
1行でコミット履歴を表示:
git log --oneline
グラフ形式で履歴表示:
git log --graph --oneline
各コミットの差分を表示:
git log -p
変更されたファイルのファイル名と変更した行数を表示:
git log --stat
11. ファイルの履歴
指定ファイルの履歴(名前変更も追跡):
git log --follow <ファイル>
いつ誰がどのコミットで作成・編集したかを表示:
git blame <ファイル>
12. コミットの詳細表示
特定のコミットの詳細を表示:
git show <コミットID>
最新コミットの詳細を表示:
git show HEAD
3つ前のコミットの詳細を表示:
git show HEAD~3
作業内容の修正
13. コミットの取り消し
直前のコミットを取り消し(変更はステージングに残す):
git reset --soft HEAD^
直前のコミットを取り消し(変更はワーキングツリーに残す):
git reset --mixed HEAD^
--softではコミットがなかったことになりますが、--mixedではそれに付け加えてgit addをなかったことにできます。
直前のコミットを完全に取り消し(変更も削除):
git reset --hard HEAD^
--hard
オプションは変更も削除するので注意が必要です。
14. 作業の一時退避
変更を一時的に退避:
git stash
未追跡(untracked)なファイルもまとめて退避:
git stash -u
退避した作業の一覧表示:
git stash list
最新の退避作業を適用(スタックには残る):
git stash apply
最新の退避作業を適用して削除:
git stash pop
最新の退避作業を削除:
git stash drop
すべての退避作業を削除:
git stash clear
ブランチを切り替える前に、コミットしたくない作業内容を一時的に保存するのに便利です。
リモート操作
15. リモートリポジトリの操作
リモートリポジトリを追加:
git remote add origin <URL>
リモートリポジトリの一覧表示:
git remote -v
リモートURLの変更:
git remote set-url origin <URL>
16. リモートとの同期
リモートの変更を取得:
git fetch
リモートの変更を取得してマージ:
git pull
リモートの変更を取得してリベース:
git pull --rebase
git pull --rebase
を使うと、マージコミットを作らずに履歴をきれいに保つことができます。
ローカルの変更をリモートに送信:
git push
ブランチを初めてプッシュして追跡設定:
git push -u origin <ブランチ名>
17. リモートブランチの操作
リモートブランチの一覧表示:
git branch -r
リモートブランチの削除:
git push origin --delete <ブランチ名>
削除されたリモートブランチの情報を同期:
git fetch -p
便利なエイリアス設定
18. 基本的なエイリアス
Gitコマンドをより簡単に使うためのエイリアス設定です。.gitconfig
ファイルに以下のように設定できます。
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
これらのエイリアスを設定すると、git checkout
の代わりにgit co
、git branch
の代わりにgit br
というように、短いコマンドでGitを操作できるようになります。
高度なエイリアス
ログをグラフ形式で表示:
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative"
git lg
で実行すると、コミット履歴がカラフルなグラフ形式で表示されます:
- コミットハッシュは赤色
- ブランチ・タグ情報は黄色
- コミット日時は緑色
- 作者名は青色
- グラフ表示で枝分かれが視覚的に分かる
変更されたファイルの一覧を表示:
git config --global alias.changes "diff --name-status"
git changes
で実行すると、変更されたファイルのリストとその状態(M:修正、A:追加、D:削除)が表示されます。
.gitconfigファイルでの設定
以下のように直接.gitconfig
ファイルを編集して設定することもできます:
[alias]
co = checkout
br = branch
ci = commit
st = status
エイリアスの利点
- 時間節約: 長いコマンドを短く書ける
- 複雑なコマンドの簡略化: 複雑なコマンドを覚える必要がない。コマンドを調べる手間も省ける
- 一貫性: チーム内で同じエイリアスを使うことで作業の一貫性が高まる
Gitエイリアスは日常的な操作を効率化する強力なツールです。
自分がよく使うコマンドのエイリアスを設定することで、作業効率の向上につながります。
変更の取り消しと復元
19. 誤ったコミットの修正
直前のコミットメッセージや内容を修正:
git commit --amend
指定コミットを打ち消す新しいコミットを作成:
git revert <コミットID>
revert
は履歴を残したまま変更を元に戻すので、共有リポジトリでの作業に適しています。
20. 削除ファイルの復元
特定のコミットからファイルを復元:
git checkout <コミットID> -- <ファイル>
21. コンフリクトの解決
マージを中止してコンフリクト前の状態に戻る:
git merge --abort
リベースを中止:
git rebase --abort
コンフリクトが発生した場合は、ファイルを編集して解決した後、git add
でマークし、git merge --continue
またはgit rebase --continue
で続行します。
22. リセット後のコミット復活
参照ログを表示:
git reflog
reflogから特定の状態に戻る:
git checkout <reflog番号>
reflog
コマンドは、git reset --hard
で失ったコミットを見つけるのに役立ちます。
検索と比較
23. コミットの検索と取得
特定のコミットだけを現在のブランチに適用:
git cherry-pick <コミットID>
他のブランチから特定ファイルだけ取得:
git checkout <ブランチ名> -- <ファイル>
24. ブランチとコミットの比較
2つのブランチの差分を表示:
git diff branch1..branch2
変更されたファイル名のみ表示:
git diff --name-status branch1..branch2
25. 過去の状態を確認
特定のコミットの状態にチェックアウト:
git checkout <コミットID>
これを行うと「detached HEAD」状態(ブランチがない状態)になります。
確認後はgit checkout <ブランチ名>
で元に戻る必要があります。
26. コミット検索
指定範囲のコミットを表示:
git log <コミットID1>..<コミットID2>
コミットメッセージで検索:
git log --grep="バグ修正"
コード内の変更を検索:
git log -S"特定の文字列"
高度な操作テクニック
27. ブランチのベース変更
ブランチのベースを変更:
git rebase --onto <新ベース> <旧ベース> <ブランチ>
例えば feature ブランチが誤って古い develop から派生していた場合、git rebase --onto main develop feature
を実行すると、develop から feature までのコミットだけを切り取り、最新の main ブランチ上に移植できます。
これにより、不要なコミット履歴を引き継がずに、ブランチの開始点を変更できます。
28. クローン操作
最新コミットのみ取得(履歴なし):
git clone --depth=1 <リポジトリURL>
特定ブランチのみクローン:
git clone --single-branch --branch=<ブランチ名> <リポジトリURL>
29. サブモジュール管理
サブモジュールの追加:
git submodule add <リポジトリURL> <ディレクトリ>
このコマンドは、大規模なプロジェクトで外部ライブラリや共有コンポーネントを管理する際に使用します。例えば、複数のプロジェクトで共通して使用するUIコンポーネントライブラリがある場合、それをサブモジュールとして追加することで、メインリポジトリ内に別のGitリポジトリを埋め込み、バージョン管理できます。
サブモジュールの初期化と更新:
git submodule update --init --recursive
チームメンバーが新しくプロジェクトをクローンした時や、他の人がサブモジュールを追加・更新した後に、すべてのサブモジュールを適切なコミットに更新するために使います。--recursiveオプションを使うと、サブモジュール内のサブモジュールも含めて初期化・更新されます。
30. 圧縮
不要なファイルの削除とデータ圧縮:
git gc
より強力な圧縮(時間がかかる):
git gc --aggressive
まとめ
Gitの基本コマンドから応用テクニックまで、幅広くご紹介しました。
よく使うコマンドは固定化してしまっていたので、記事としてまとめることで、新しいコマンドを知り、深掘りするいい機会となりました。
日々の業務でも取り入れて開発効率上げていきたいですね。
Discussion