はじめに
恥ずかしながら下記の挙動について、全く理解が届いていませんでした。
発端
メインブランチ
から派生して作ったトピックブランチ
の追加差分が、マージ
していないのにメインブランチ
に反映されていた。
master
ブランチ => 新規プロジェクトをadd,commit
topic
ブランチを作成 => Gemfileに1行追加
#topicブランチの追加差分
gem "rspec", ">= 3.0.0"
master
ブランチに切り替え。
gemfile
を覗いてみるとtopic
ブランチで記述したコードがmaster
にある。
ここでマージしていないのに「なぜ?」と思った。
結論
新規作成したトピックブランチでadd, commit
していないのが原因。
実際にはマージされていたのではなく、トピックブランチが派生元とコミット履歴が同一であったため、Gitの仕様上何も問題が起きていないので差分を残したままメインブランチに切り替えられた、というのが今回の現象。
通常、Gitの仕様では「差分を残して派生元に移動はできない」ようになっている。この場合、差分の情報をGitが正しい情報か判断できないため、エラーを報告するようになっている。つまり、ブランチを切り替えることができない可能性がある。
正しい情報かの判断は、コミットを元に判断を下すためブランチを新規生成してから一度もadd, commit
していない状態では、派生元の同一のコミット履歴を参照しているためブランチを切り替えることができてしまう。
ここでブランチを切り替えられた時に、コミットしていない差分の情報は問題が報告されないために、ブランチを切り替えても同一の差分情報を残したまま表示されしまっていた、ということみたいだった。
一度もadd, commit
していない状態からgit diff
で確認してみれば、差分が表示されるようにマージされているわけではない、ということ。