今回は、git switch
と git checkout
コマンドの違いと、git switch
を使ってコミットの移動をしてみたサンプルをお見せします。
1. git switch と git checkout の違い
git switch
と git checkout
はいずれも、ブランチやコミットの切り替えに使用されるコマンドです。しかし、Git 2.23.0以降で導入されたgit switch
コマンドは、ブランチの切り替えとコミットのチェックアウトを専門としたコマンドです。
ブランチを切り替えることはどちらのコマンドでも同じです。
-
git checkout
- ブランチやコミットの切り替えと作業ディレクトリのファイルの復元を行うことができる。
- 新しいブランチの作成と切り替えを一度に行うことができる(
-b
オプションを使用)。
-
git switch
- 主にブランチ、コミットの切り替えに特化している。
- 新しいブランチの作成と切り替えを行うことができる(
-c
オプションを使用)。
2. git switch でコミットを切り替えてみる
※checkoutでも同様のことができますが、今回はswitchで試しています。
git switch
コマンドを使用して特定のコミットに移動すると、「detached HEAD」状態に入ります。
2.1 Detached HEAD 状態とは?
Detached HEAD状態は、ブランチポインタを使用せずに特定のコミットを直接指し示す状態を指します。この状態で新しいコミットを作成すると、そのコミットは任意のブランチに関連付けられず、後から見つけるのが困難になります。
2.2 サンプル
git log --oneline
を使用してコミット履歴を確認して詳しく見ていきます。
-
コミット履歴の確認: 初めに
git log --oneline
を使ってコミット履歴を確認します。
コミットIDは適当です。h23iu2hi4 <- HEAD 5hiu3h5i3 2j3oi2j3o2
-
過去のコミットへの切り替え: 次に、
git switch 2j3oi2j3o2
コマンドを使って最も古いコミットに切り替えます。 -
新しいコミットの作成: この状態で新しい作業を行い、新しいコミットを作成します。
-
元のブランチへの戻り: 最後に、
git switch -
コマンドを使って元のブランチに戻ります。
この状態で git log --oneline
を実行すると、新しいコミットは表示されず、コミット履歴は元の状態に戻ります。
2.3 新しいコミットはどうするのか
新しいコミットを保持するためには、detached HEAD状態で新しいブランチを作成すると良いです。この方法では、新しいコミットは新しいブランチに関連付けられます。
# 過去のコミットに移動
git switch 2j3oi2j3o2
# 新しいブランチを作成
git switch -c new_branch
# 新しい作業を行ってコミット
# ...
# mainブランチ(または他のブランチ)に戻る
git switch main
# この状態で git log を行うと、新しいブランチとそのコミットはまだ表示されません。
# 新しいブランチに切り替えると、そこでの作業履歴を確認できます。
git switch new_branch
git log --oneline
new_branch
を作成した時点でのベースは2j3oi2j3o2
コミットだったので、そのブランチのコミット履歴にはそのコミットと、それから派生した新しいコミット(新しく作成したコミット)だけが表示されます。
つまり、git log --oneline
を実行すると、以下のような履歴が表示されます。
<新しいコミットID> (新しいコミットメッセージ)
2j3oi2j3o2 (2j3oi2j3o2のコミットメッセージ)
h23iu2hi4
と5hiu3h5i3
コミットは、このnew_branch
ブランチの履歴には含まれません。これらのコミットは、元のブランチ(例:main
)の履歴に残っています。このnew_branch
は2j3oi2j3o2
コミットから分岐した新しい歴史を作成しているので、それ以降のコミットは含まれません。
new_branch
を元のブランチにマージすることも可能ですが、その場合はマージコンフリクトが発生する可能性があります。
まとめ
今回はswitchを使った作業のサンプルをお見せしました。