revertせずにGitで中間コミットを消す方法

Gitでrevertせずに中間コミットを消したいときはありませんか?

Gitでrevertした後にマージもれが発生する場合があるという事例も報告されていますし、マージもれさせないためにもできるだけrevertしたくないということもあると思います。
プロジェクトによってはrevertをあまりしない方がいいという規約があるかもしれませんね。

今回はGitでrevertせずに中間コミットを消す方法についてご紹介いたします。
どういう方法かというと、revertではなくrebaseを使った方法になります。



Gitでrevertせずに中間コミットを消す方法

次のようなリポジトリがあるとします。
Gitでrevertせずに中間コミットを消す方法

ご覧の通り全部で7コミットあり、
coommit 1
commit 2
commit 3
commit 4
no need commit
commit 5
commit 6
という順でコミットされています。(1つ目のコミットがcoommit 1となっているのは誤字です。言わずもがな、正しくはcommitですね)
この中で「no need commit」を消したいとします。

やり方は簡単で、まずコマンドラインで「git rebase -HEAD~6」を叩きます。(HEADのあとは任意の数を指定。6を入力すると6個前のコミットまでさかのぼれます。)
するとこのような画面が出てきます。

実は、ここで「no need commit」を消してやって「:wq」をすれば「no need commit」のコミットを消すことができるのです。
「no need commit」を消し、この状態で「:wq」を押します。(何を言っているかよく分からない方はrebaseのやり方をググってください)

するとリベースが成功してこのようになりますね。

あとは「git push -f origin master」でforce pushします。
コミットログをご覧ください。
「no need commit」が消えているはずです。

なお、rebaseしてforce pushする作業はコミットIDが変わったりするのであまりおすすめできません。
revertが許されるなら素直にrevertをした方が良いと思います。

終わりに

今回はGitでrevertせずに中間コミットを消す方法についてご紹介いたしました。

使用した方法はrevertではなくrebaseです。
繰り返しになりますが、rebaseの取り扱いにはご注意ください。

最後までお読みいただきありがとうございます。
よろしければブログやTwitterでのシェアをお願いいたします。
コメントもお待ちしております。
誤植や勘違いなどございましたらコメント欄にて教えていただけると幸いです。






Git

Posted by ちこ