13
7

More than 1 year has passed since last update.

【Git】コミット前にブランチを移動してはならない理由

Last updated at Posted at 2022-07-26

はじめに

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 チェックサムだけを記録したシンプルなファイルです。

引用:Git のブランチ機能 - ブランチとは

したがって、ブランチはコミットの内容を参照しているにすぎません。
そのため、コミットしていない情報をブランチは保持してくれません。

このことを踏まえて、共有されるまでの流れを以下のモデルを使用し説明します。
image.png

コミット履歴 現在のブランチ

ワーキングツリーで編集を行う
ワーキングツリーでファイル等の編集を行うと、ワーキングツリーのみにファイルの変更が保存されます。
image.png

コミットを行わずブランチを移動する
移動前のブランチに変更が保持されず、ワーキングツリーにファイルの変更が残っています。そのため移動先のブランチでもその内容を参照することになります。
image.png

その結果、コミットしていない変更が移動後のブランチにも共有されます。
したがって、必ずコミットしてからブランチを移動する必要があります。

3. 番外編:コミットしたくない場合

作業途中にブランチを移動したいが、コミットはしたくないという時に便利なのがgit stashです。

git stash

作業中のファイルを一時的に退避してくれるコマンドです。

  • git stash : ワーキングツリー内の変更内容を一時的に退避する
  • git stash apply : 退避した内容を現在のブランチに適用する

このコマンドを使うことによっても、意図しない共有を避けることが出来ます。
コミットしたくない時に便利ですが、退避したことを忘れないようにしましょう!

所感

ブランチの仕組みを誤解していたことが今回のミスの原因でした。
何事も仕組みを正しく理解することが重要だと改めて感じました。

参照

13
7
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
13
7