Web Marina

日々の業務や勉強などで得た知識をアウトプットしていきます。

【Git】ブランチ間違えてコミットしてた!?

f:id:song-of-life1352607:20180113002051p:plain

皆さん明けましておめでとうございます。

なんとか1月終わる前に更新できました(^ ^;)

本年も地味に更新してまいりますので、

どうぞよろしくお願いいたします。

さて、今回は年明け早々やらかしたブランチ切り替え忘れ、

そしてそのまま作業した挙句コミットまでしちゃった!

その時の解決方法を載せておきます。





経緯

先日、仕事開始時にブランチを切り替え忘れ、

そのままずーっと作業し、コミットももちろん複数回行い、

作業終了時に初めて「ブランチ前回のままじゃん!!」と気づきました。

ひどい失敗で、誰かの役にたつのかわかりませんが・・・

その時行った、

間違えたブランチから本来のブランチへ変更部分を移してコミット。

という解決方法を記述します。


手順

  1. 間違えたブランチをコミットする前の状態に戻す。

  2. 変更部分を一度退避する。

  3. ブランチを切り替える。

  4. 切り替えたブランチで退避した変更部分を復活。

  5. コミットする。


詳細

間違えたブランチを、コミットする前の状態に戻す。

$git log

$git reset --soft コミットのハッシュ値

まずはgit logでどこまで戻せば良いか確認します。

次にgit reset --soft コミットのハッシュ値でブランチを

コミット前の状態に戻します。

この時絶対に--softを使ってください!

このオプションで作業ディレクトリの変更内容は残したまま、

コミットだけを取り消すことができます。


ちなみに指定するコミットのハッシュ値は、

このコミットまで戻したい!というコミットのハッシュ値を指定します。

指定したコミットの次にコミットしたものまでが取り消されます。

これに限らず、どれを指定するとどこまで影響するのか?にいつも迷います。。。


変更部分を一時退避する

$git stash

このままではcheckoutしても変更部分を反映させられないので、

この変更部分は一時的に退避させます。


ちなみに、退避させるものが複数ある場合、

$git stash save "hogehoge"

のように名前をつけておくこともできます。


ブランチを切り替える

わざわざ紹介することもないと思いますが、

$git checkout ブランチ名




切り替えたブランチで退避した変更部分を復活

$git stash pop

このコマンドは、退避した部分を復活と同時に

退避リストから削除するものです。

もちろん復活と削除を別々に行うことも可能ですが、

今回は全変更部分を一括でやってしまったので。。。

あとは切り替えたブランチでコミットすれば作業終了です。


なお、git stashの使い方については、こちらで詳しく説明してくださっています。

qiita.com

解決方法の参考にさせていただいたのはこちらです。

vatscy.github.io

www.kaasan.info




まとめ

今回は焦っていたので全変更部分を一括で移して1コミットで終わらせてしましました。

本来ならコミットごとに、

状態を一つ戻す→名前をつけて退避

を繰り返し、退避終了後

ブランチ切り替え→一つずつ復元→コミット

とすべきだったと思います。

初めてのことでパニクっていたのと、子供の迎え時間が迫っていたので

テンパって一気にどーん!とやってしまいました。

反省。。。。

しかしまずは作業前に確認しましょう。。。