はじめに
恥ずかしながら下記の挙動について、全く理解が届いていませんでした。
発端
メインブランチから派生して作ったトピックブランチの追加差分が、マージしていないのにメインブランチに反映されていた。
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で確認してみれば、差分が表示されるようにマージされているわけではない、ということ。