やりたかったこと
mainブランチで直接コードを書いていたら、途中で「これは別ブランチで作業すべきだった」と気づいた。チームのリポジトリにpushしたら怒られて、ブランチの切り方をちゃんと覚えることにした。
環境
- OS: macOS 13.5 / Ubuntu 22.04
- Git: 2.42.0
試したこと・うまくいかなかったこと
最初は git checkout -b ブランチ名 でブランチを作っていた。これ自体は動くが、「checkout って何でも使えすぎて意味がわかりにくい」と感じていた。ブランチの切り替えもファイルの復元も同じコマンドで、間違えてファイルを消したことが1回あった。
次に、作業中のファイルを残したままブランチを切ろうとしたら、こんなエラーが出た。
error: Your local changes to the following files would be overwritten by checkout:
src/index.js
Please commit your changes or stash them before you switch branches.
コミットもスタッシュも知らなかったので、一時的に変更を git stash で退避する方法を調べることになった。
基本コマンド
Git 2.23以降では git switch が推奨。git checkout より用途が明確で覚えやすい。
git branch # ブランチ一覧(現在のブランチに * が付く)
git branch -a # リモートブランチも含めて表示
git switch -c ブランチ名 # 作成して切り替え(checkout -b と同じ)
git switch ブランチ名 # 切り替え
git branch -d ブランチ名 # マージ済みブランチを削除
git branch -D ブランチ名 # 強制削除(マージ未済みでも削除)
実際の開発でよく使う流れ
# mainを最新にしてからブランチを作る
git switch main
git pull origin main
git switch -c feature/add-login
# 作業してコミット
git add src/login.js
git commit -m "add login form"
# mainにマージ
git switch main
git merge feature/add-login
# 不要になったブランチを削除
git branch -d feature/add-login
変更が残っているときのブランチ切り替え
未コミットの変更があると git switch はエラーになる。2つの方法で対処できる。
# 変更を一時退避してからブランチを切り替え
git stash
git switch other-branch
# 元のブランチに戻ってスタッシュを復元
git switch feature/add-login
git stash pop
または変更をコミットしてしまう(WIPコミット):
git add -A
git commit -m "WIP: 作業途中"
git switch other-branch
ハマったポイント
git switchは Git 2.23以降。古いバージョンではgit checkoutを使う。バージョンはgit --versionで確認できるgit checkoutはブランチの切り替えとファイルの復元を両方やる。git checkout ファイル名でコミット前の変更を捨てられるが、間違えてやると変更が消える。git switchはブランチ操作に特化していてこの事故が起きないgit pull origin mainより前にgit switch mainをしないと、別ブランチにmainの変更が引き込まれる。順番を間違えて余計なマージコミットが入った- ブランチ名に空白は使えない。
feature/add loginはエラーになるのでハイフンかアンダースコアを使う -dで削除しようとしたらマージ未済みのブランチだと警告が出て削除できなかった。捨てて構わないなら-Dで強制削除できる
関連記事
- GitHubで初めてリポジトリを作ってpushする手順
- Gitで間違えてcommitした時の取り消し方
- git pullでコンフリクトが発生した時の解決方法
- git stashで作業を一時退避する方法