git でやっぱ無かったことにしたいコミットがあるとき

例えば、やってみたものの、やっぱりアレはいらなかったな…。というコミットができちゃうことは多々あると思います。

例えば

さて、ホームページを作ろう。

mkdir git-training && cd git-training
git init && git commit -m"initialize" --allow-empty

まずは外枠だけ作ろう。

<!DOCTYPE html>
 <html>
 <head>No Title</head>
 <body>
 <p>Welcome my homepage!</p>
 </body>
 </html>

ではコミット。

git add index.html && git commit -m"add index.html"

次にページのリンク項目を作ろう。

   <body>
     <p>Welcome my homepage!</p>
     <ul>
       <li>About Me</li>
       <li>My Life</li>
       <li>BBS</li>
       <li>Email</li>
     </ul>
   </body>

リンクは張ってませんがメニューらしきものを足しました。

git add -u && git commit -m"add menu"

おっと、肝心な “ポエム” のページへリンクする項目を忘れてた。

   <body>
     <p>Welcome my homepage!</p>
     <ul>
       <li>About Me</li>
       <li>My Life</li>
       <li>My Poem</li>
       <li>BBS</li>
       <li>Email</li>
     </ul>
   </body>

ポエムの項目を足してコミット、と。

git add -u && git commit -m"add poem to menu"

そうだ!メインの画像に猫画像を貼ろう!

  <body>
    <p>Welcome my homepage!</p>
    <img src="cat.jpg" alt="cat" />                                                                                     
    <ul>
      <li>About Me</li>
      <li>My Life</li>
      <li>My Poem</li>
      <li>BBS</li>
      <li>Email</li>
    </ul>
  </body>

猫画像を張ってコミット、と。

git add -u && git commit -m"add cat image over the menu"

うーん、やっぱりポエムを全世界に発信するのは少し恥ずかしいな。
ポエムの項目はやめておくか。

ポエムの項目を消したい!
├ 1.ポエムの項目を取り除きコミット
│ [まちがい]     
│   わかりやすい方法ではありますが、無駄なコミットが増えるのが難点です。
│   それよりも別の手段を探してみませんか?
│   git でなんとかなるかも?
│      ↑
│   ココがポイント!
└ 2.git rebase -i をつかう
  [せいかい]

そこでこんなコマンドを打つ。

git rebase -i HEAD~2
pick cc41e6d add poem to menu
pick 4eab1dc add cat image over the menu

# Rebase f8599b3..4eab1dc onto f8599b3
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x <cmd>, exec <cmd> = Run a shell command <cmd>, and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.

二つ前のコミットを無かったことにしたいので、HEAD(最新のコミット)から2つ前を表示しました。

pick cc41e6d add poem to menu

というコミットが不要なので、メッセージ(If you remove a line here THAT COMMIT WILL BE LOST)にあるように、消して保存すると削除したコミットが無かったことになります。

これで黒歴史を作らずに済みました。

とっくにやり尽くされたネタでしょうけど、初めてやったのでメモしました。

rebase -i ではもっといろいろできるっぽいですが、よくあることとして、やっぱ無かったことにしたい、やり方にしぼって書いてみました。

それと当たり前ですが、これは今までのコミットの歴史を改ざんすることになるので、複数人で共有しているリポジトリのブランチではやらないほうがよいです。各人のリポジトリに異なる歴史のブランチがパラレルワールドのごとく乱立してしまい、それを共有リポジトリに -f プッシュした日にはタイムパラドックスで大変なことになります。

(というか、一人でやってる時にカオスなことに…)

rebase -i で歴史を書き換えるのは、自分のローカルで切ったブランチのみでやりましょう。

シェアする

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

フォローする