はじめに
Gitを使い始めて間もない新人エンジニアです。
以前コミット前にブランチを移動してしまい、コードが混ざり面倒なことになってしまいました。
その時になかなか仕組みが理解できなかったので、なぜそのような挙動になるのかをこの記事でまとめます。
内容
1. コミット前にブランチを移動するとどうなるのか
2. なぜ共有されるのか
3. 番外編:コミットしたくない場合
1.コミット前にブランチを移動するとどうなるのか
コミットを行わずにブランチを移動する際、移動先と競合する変更があった場合は、下記のようなエラーが発生します。
error: Your local changes to the following files would be overwritten by checkout:
XXXXX.XX
Please commit your changes or stash them before you switch branches.
Aborting
しかし競合する変更が無かった場合、そのままブランチを移動することが出来てしまいます。
そしてコミットしていない変更が移動後のブランチに勝手に共有されます。
2. なぜ共有されるのか
このことを理解するには、ブランチの仕組みを理解することが必要です。
ブランチとは
Git におけるブランチとは
特定のコミットを指す 40 文字の SHA-1 チェックサムだけを記録したシンプルなファイルです。
したがって、ブランチはコミットの内容を参照しているにすぎません。
そのため、コミットしていない情報をブランチは保持してくれません。
このことを踏まえて、共有されるまでの流れを以下のモデルを使用し説明します。
○ | ➡ |
---|---|
コミット履歴 | 現在のブランチ |
ワーキングツリーで編集を行う
ワーキングツリーでファイル等の編集を行うと、ワーキングツリーのみにファイルの変更が保存されます。
コミットを行わずブランチを移動する
移動前のブランチに変更が保持されず、ワーキングツリーにファイルの変更が残っています。そのため移動先のブランチでもその内容を参照することになります。
その結果、コミットしていない変更が移動後のブランチにも共有されます。
したがって、必ずコミットしてからブランチを移動する必要があります。
3. 番外編:コミットしたくない場合
作業途中にブランチを移動したいが、コミットはしたくないという時に便利なのがgit stashです。
git stash
作業中のファイルを一時的に退避してくれるコマンドです。
- git stash : ワーキングツリー内の変更内容を一時的に退避する
- git stash apply : 退避した内容を現在のブランチに適用する
このコマンドを使うことによっても、意図しない共有を避けることが出来ます。
コミットしたくない時に便利ですが、退避したことを忘れないようにしましょう!
所感
ブランチの仕組みを誤解していたことが今回のミスの原因でした。
何事も仕組みを正しく理解することが重要だと改めて感じました。