0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

git switchについて知ろう

Last updated at Posted at 2023-09-10

今回は、git switchgit checkout コマンドの違いと、git switch を使ってコミットの移動をしてみたサンプルをお見せします。

1. git switch と git checkout の違い

git switchgit checkout はいずれも、ブランチやコミットの切り替えに使用されるコマンドです。しかし、Git 2.23.0以降で導入されたgit switchコマンドは、ブランチの切り替えとコミットのチェックアウトを専門としたコマンドです。
ブランチを切り替えることはどちらのコマンドでも同じです。

  1. git checkout

    • ブランチやコミットの切り替えと作業ディレクトリのファイルの復元を行うことができる。
    • 新しいブランチの作成と切り替えを一度に行うことができる(-b オプションを使用)。
  2. git switch

    • 主にブランチ、コミットの切り替えに特化している。
    • 新しいブランチの作成と切り替えを行うことができる(-c オプションを使用)。

2. git switch でコミットを切り替えてみる

※checkoutでも同様のことができますが、今回はswitchで試しています。

git switch コマンドを使用して特定のコミットに移動すると、「detached HEAD」状態に入ります。

2.1 Detached HEAD 状態とは?

Detached HEAD状態は、ブランチポインタを使用せずに特定のコミットを直接指し示す状態を指します。この状態で新しいコミットを作成すると、そのコミットは任意のブランチに関連付けられず、後から見つけるのが困難になります。

2.2 サンプル

git log --onelineを使用してコミット履歴を確認して詳しく見ていきます。

  1. コミット履歴の確認: 初めに git log --oneline を使ってコミット履歴を確認します。
    コミットIDは適当です。

    h23iu2hi4 <- HEAD
    5hiu3h5i3
    2j3oi2j3o2
    
  2. 過去のコミットへの切り替え: 次に、git switch 2j3oi2j3o2 コマンドを使って最も古いコミットに切り替えます。

  3. 新しいコミットの作成: この状態で新しい作業を行い、新しいコミットを作成します。

  4. 元のブランチへの戻り: 最後に、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のコミットメッセージ)

h23iu2hi45hiu3h5i3コミットは、このnew_branchブランチの履歴には含まれません。これらのコミットは、元のブランチ(例:main)の履歴に残っています。このnew_branch2j3oi2j3o2コミットから分岐した新しい歴史を作成しているので、それ以降のコミットは含まれません。

new_branchを元のブランチにマージすることも可能ですが、その場合はマージコンフリクトが発生する可能性があります。

まとめ

今回はswitchを使った作業のサンプルをお見せしました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?