Gitを使っていると「このコマンド何だっけ?」ってよくなるので、自分用にまとめておく。Git 2.50 を前提に、用途ごとに・何をやってるかが分かるように整理した。
Gitの基本的な仕組み
コマンドを覚える前に、Gitの3つのエリアを理解しておくと話が早い。
- 作業ツリー:今いじってるファイル
- ステージ(index):コミット予定として選んだ変更
- リポジトリ:コミットとして記録された履歴
ファイルを編集したら、add でステージに載せて、commit でリポジトリに記録する。この流れが全ての基本。
作業ツリー ──add──▶ ステージ ──commit──▶ リポジトリ
リポジトリを用意する
git init:新規にリポジトリを作る
今いるフォルダをGit管理下に置く。.git フォルダが作られる。
git init
git init -b main # 初期ブランチ名をmainに指定
git clone:既存のリポジトリを手元に持ってくる
git clone https://github.com/user/repo.git
git clone URL フォルダ名 # フォルダ名を指定してクローン
初期設定(最初の1回)
コミットの作者情報を設定する。未設定だとコミットできない。
git config --global user.name "名前"
git config --global user.email "メール"
git config --list # 確認
状態を確認する
git status:今どうなってる?
どのファイルが変更されたか、ステージに載っているか、コミット待ちか、を全部教えてくれる。迷ったら最初に叩くコマンド。
git status
git status -s # 短い表示(一覧が多いとき用)
git diff:具体的に何が変わった?
変更内容を行単位で見れる。
git diff # まだステージしてない変更
git diff --staged # ステージ済みの変更
git diff main..feature # ブランチ同士の差分
変更を記録する
git add:コミット対象を選ぶ
変更したファイルをステージに載せる。全部まとめて載せることも、ファイル単位や行単位で選ぶこともできる。
git add ファイル名 # 特定のファイルだけ
git add . # 今いるフォルダ以下すべて
git add -p # 変更の一部(hunk)だけ対話的に選ぶ
-p は「1ファイル内の一部の変更だけコミットしたい」ときに便利。
git commit:変更を確定する
git commit -m "メッセージ"
git commit -am "メッセージ" # addとcommitを同時に(追跡済みファイルのみ)
git commit --amend -m "新しい" # 直前のコミットを上書き
--amend は「さっきのコミットにファイル入れ忘れた」「メッセージtypoった」ときに使う。ただし push 済みのコミットに使うと履歴が書き換わるので注意。
git log:履歴を見る
git log # 詳細な履歴
git log --oneline # 1行表示(見やすい)
git log --oneline --graph --all # 全ブランチを図で表示
git log -- ファイル名 # 特定ファイルの履歴
ブランチを切り替える
ブランチは「並行して作業できる別の履歴ライン」。本番用の main を触らずに、新機能用のブランチで作業して、完成したら統合する、という使い方が基本。
git branch:ブランチを一覧・作成・削除
git branch # ローカルの一覧
git branch -a # リモート含む一覧
git branch 名前 # 作成だけ(切り替わらない)
git branch -d 名前 # 削除(マージ済みのみ)
git branch -D 名前 # 強制削除
git switch:ブランチを切り替える
昔は git checkout だったけど、今は役割が分かりやすい switch が推奨。
git switch main # mainに切り替え
git switch -c 新ブランチ # 作成して切り替え
git switch - # 直前のブランチに戻る
git merge:ブランチを統合する
「取り込みたい側に移動してから、merge する」のが基本。
git switch main # 取り込み先に移動
git merge feature/login # feature/login の内容をmainに統合
git rebase:履歴をきれいに統合する
merge と似てるけど、履歴を一直線に整えるのが違い。チーム開発では好みが分かれる。
git switch feature
git rebase main # mainの最新を土台に載せ替え
git rebase -i HEAD~3 # 対話的にコミットをまとめる・編集する
コンフリクトが起きた時
merge や rebase で衝突したら、該当ファイルを手で直してから続行する。
git status # どのファイルが衝突してるか確認
# 該当ファイルを編集して修正
git add 修正したファイル
# mergeの場合
git merge --continue
git merge --abort # やめる
# rebaseの場合
git rebase --continue
git rebase --abort # やめる
リモートとのやり取り
GitHubなどと同期するコマンド。
git remote:リモート先の管理
git init で作った場合はリモート先を自分で登録する必要がある。
git remote -v # 登録済みのリモートを確認
git remote add origin URL # リモートを追加
git remote set-url origin 新URL # URLを変更
git pull:リモートの変更を取り込む
git pull # 今のブランチに取り込む
git pull origin main # 明示的に指定
中身は「fetch(取得)+ merge(統合)」を一気にやってるだけ。
git push:ローカルの変更を送る
git push
git push -u origin ブランチ名 # 初回は -u で追跡設定(以降は git push だけでOK)
git push --force-with-lease # 安全めの強制push
--force は他人の変更を消す危険があるので、--force-with-lease の方が安全。
git fetch:取得だけする(マージしない)
リモートの変更を一旦確認してから取り込みたいとき用。
git fetch
git log origin/main..main # まだpushしてないコミットを確認
git log main..origin/main # まだ取り込んでないコミットを確認
やり直したい時
Gitで一番ググるのがこのへん。状況別に整理しておく。
ファイルの変更を捨てたい
git restore ファイル名 # 編集前に戻す
git restore . # 全部戻す
git restore --source=HEAD~1 . # 復元元を「1つ前のコミット」に指定
ステージから降ろしたい(addを取り消す)
git restore --staged ファイル名
直前のコミットを取り消したい
git reset --soft HEAD~1 # コミットだけ取り消し(ステージも作業ツリーもそのまま)
git reset --mixed HEAD~1 # コミットとステージを取り消し(変更は作業ツリーに残る)※デフォルト
git reset --hard HEAD~1 # 全部消す(変更も消える・危険)
--mixed が省略時のデフォルト(git reset HEAD~1 と同じ)。
pushしちゃったコミットを打ち消したい
共有ブランチでは reset じゃなく revert を使う。打ち消し用のコミットを新しく作るので、履歴は改変されない。
git revert コミットハッシュ
stash:作業を一時退避
「作業途中だけど急いで別ブランチに移りたい」ときに使う。コミットせずに変更を退避できる。
git stash # 退避
git stash -u # 未追跡ファイルも含めて退避
git stash list # 一覧
git stash pop # 戻す(退避リストから消す)
git stash apply # 戻す(退避リストに残す)
git stash drop # 捨てる
その他よく使うやつ
git cherry-pick:特定のコミットだけ取り込む
git cherry-pick コミットハッシュ
git tag:バージョンタグを打つ
git tag v1.0.0 # 軽量タグ
git tag -a v1.0.0 -m "リリース" # 注釈付きタグ
git push origin v1.0.0 # タグをリモートに送る
git push origin --tags # 全タグをまとめて送る
git rm –cached:Gitの管理から外す
間違ってコミットしたファイルを管理対象から外したいとき(ローカルには残す)。
git rm --cached ファイル名
.gitignore を後から効かせる
gitignoreに追記したけど、既にコミット済みのファイルには効かない。その場合の対処。
git rm -r --cached .
git add .
git commit -m "apply gitignore"
状況別・コマンドの選び方
| やりたいこと | 使うコマンド |
|---|---|
| リポジトリを作る | git init / git clone |
| 今の状態を見たい | git status / git diff |
| 変更を記録したい | git add → git commit |
| 履歴を見たい | git log --oneline --graph |
| ブランチを切りたい | git switch -c |
| ブランチを統合したい | git merge / git rebase |
| コンフリクト解消 | 修正 → git add → --continue |
| リモートと同期 | git pull / git push |
| 作業を捨てたい | git restore |
| コミットを取り消したい(未push) | git reset |
| コミットを打ち消したい(push済み) | git revert |
| 一時退避したい | git stash |
とりあえずこの表だけブックマークしておけば、大抵の場面で「あ、これ使えばいいのか」と思い出せるはず。
