RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【Git】Gitのブランチの切り替えで失敗したこと

こんにちは。新卒1年目エンジニアのrs_shoです。投稿は2回目になります。
今回はGitのブランチの切り替えで失敗したことについて書いていきたいと思います。

はじめに

前回の記事でcommitのタイミングと注意点についての記事を書きましたが、それに少し近い内容です。
別のブランチでコード書いてたけど、元のコードのバグ修正依頼が来たり、レビュー後差戻しがあった場合は、
当然その修正した内容のブランチに切り替えますよね。
その時に元のブランチで書いていた内容が切り替え先のブランチに自動マージされ、余計なファイルとしてstatusに出てきた!なんて経験ありませんか?
僕はそれで色々と困ったので、その時に使った解決策を簡単に説明します。

なぜ自動マージが起こったのか

まず、僕が経験した自動マージされてしまった原因ですが、

  • 元のブランチでの作業内容をcommitしていなかった
  • その状態でブランチを切り替えた際に切り替え先でコンフリクトが発生しなかったため、自動マージされてしまった

なぜcommitしてなかったかというと、修正途中の段階でcommitしたくなかったからですよ?忘れてませんよ?
僕はその時、なぜマージしてないのに切り替え前のブランチから作業中のファイルがマージされていたのかわからず、困りました。
そして、切り替え先の修正後、元の作業中のブランチに戻ろうとしたらcommitしてくださいと出てしまう。戻れないじゃん・・・

解決方法

この問題の解決方法ですが、僕は根本的な解決はしてなくて、ちょっと無茶苦茶なことをしているかもしれませんがご了承ください。
僕はそのブランチから自動マージされた内容を消そうかと考えました。
でも切り替え前のブランチから修正内容が消えたらすごく嫌ですよね・・・

commitのタイミングと注意点についてで、機能に関わりのない個人設定のファイル間違って編集したファイル
commit対象にするべきではないということを説明しました。

かといってcommitしなきゃブランチ切り替えられないんじゃどうしようもないじゃん!
そこで、色々探していった結果、stashコマンドにたどり着きました。

$ git stash

これを打つだけ。何をしているのかちょっと説明しますね。

・コミットはせずに変更を退避したいとき、stashコマンドを使用すると、コミットしていない変更を退避することができる
・退避させていた変更を後で戻して作業を再開することもできる

stashはcommitの記録に残るものではなくcommitしていない変更内容を退避するコマンドなので、
「変更内容はひとまず置いといて・・・」ができちゃいます。Gitってなんて便利なんだろう。
stashコマンドのおかげで、commitしてくださいと怒られずにブランチ切り替えができました。

stashの戻し方と、それ以外の対処法

僕は心配性なので、変更先で消えるのを怖がっていました。(頑張ったのに消えちゃうとつらい)
stashを戻す方法と、それ以外の対処方法を記載します。
まずはstashを戻す方法から。stashって使ったタイミングでcommitみたいに履歴として残ります。
stashした履歴から指定の場所に戻りたい場合は、

$ git stash list

stash@{0}: WIP on [ブランチ名]: [HEADのcommitハッシュとcommitメッセージ]
stash@{1}: WIP on [ブランチ名]: [HEADのcommitハッシュとcommitメッセージ]

git logのcommit履歴みたいにstashの履歴と大まかな内容が見れます。
そこから番号を指定して

$ git stash apply stash@{0} ←0は{ }の番号

これで任意のstashの部分の変更が戻ります。
その他に最新のstashの履歴を戻したい場合には

# 最新の退避内容を復元して、退避したデータを消す際(戻した後stashの履歴から削除する)
$ git stash pop
# 最新の退避内容を復元して、退避したデータを残す際(戻した後stashの履歴から消さずに残す)
$ git stash apply

stashの番号などを指定しなければ最新が戻ります。
僕は履歴残しても戻したらもう使わないと思ったのでpopを使いました。

最後に、変更自体をなかったことにするコマンドです。僕が使うのを怖がったコマンドです。
別に特殊なことはしませんし、問題が起こることはないと思います。(何か起きても僕のせいにしないでください)
変更をなかったことにするには

# 指定したファイルの変更をなかったことにする
$ git checkout [ファイル名]

もしくは

# statusに出ているすべての変更をなかったことにする
$ git checkout .

というコマンドです。最近必要ないファイルをadd、commitしないようにするときにも使ってます。

おわりに

以上、ブランチ切り替えで困った際の対処法などをまとめてみました。
自動マージで困った方、編集したファイルの退避の仕方の参考になれば幸いです。

参考資料

Copyright © RAKUS Co., Ltd. All rights reserved.