このエントリーをはてなブックマークに追加

2016年12月6日火曜日

【Git】マージコミットを消したい

こんにちは、Taroです。
今回はGitのケーススタディ的なものを書きたいと思います。
反面教師として利用してください。

例えば、下図のようなことってないでしょうか?


同じ開発ブランチで、既にリモートブランチが進んでいると、「プルしなさい」と怒られてしまいます。
ここで「git pull --rebase」を使用すれば、マージコミットもできず、綺麗にリモートを取り込めます。
「git pull」と「git pull --rebase」の違いはこちらのサイトで紹介されております。

ただ、頭が弱い私はrebaseオプションを付け忘れ、ふつうにpullしてしまいました。
そうすると、下図のようなブランチになります。

このマージコミットが非常に邪魔です。
コミットを巻き戻すときには「reset」や「revert」が使用されるかと思います。
「revert」だと「消したというログができてしまうため、「reset」を使用します。
「reset」にも大きく2種類あり、コミットと一緒に変更したファイルまで消してしまうhardオプションと、変更したファイルは残しておくsoftオプションがあります。
ケースバイケースで使い分けるとして、今回はsoftオプションでコミットだけ消し、rebaseしたいと思います。

# マージコミットをなかったことに
$ git reset --soft
# 自分のコミットをなかったことに
$ git reset --soft
# 1回stashで逃がす
$ git stash save "テンポラリ"
# rebaseして綺麗な状態に
$ git rebase origin/ブランチ名
# stashした差分を取り込む
$ git stash pop stash@{0}
「reset」を2回やって巻き戻していますが、1回でも良いかと思います。
これで、Bさんはローカルブランチを修復できましたとさ。
めでたしめでたし。
(このようなケースでもっとスマートな方法があれば、ぜひ教えてください!!)





0 件のコメント:

コメントを投稿