読者です 読者をやめる 読者になる 読者になる

かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

git ちょっと前のコミットで間違ってファイルをコミットしてたので取り消したい

プロジェクトの初期の段階で構造をガラッと代えたりして、ちょっと経ってから間違ってコミットしたくないファイルをコミットしちゃってた事に気づいたりして、このファイルコミットしてないことにしたい...とか結構やらかしてしまうタイプです。
不要なファイルの削除コミットをしても良いのですが、他に影響が出なそうならgit rebaseで履歴を改変してしまう方が、ミスってたのがバレにくいのでステキですw (チームプロジェクトの時はやりすぎると怒られるかも)
個人的にgit rebaseちょっと苦手意識があったので、今回やらかしたのを機にメモ。

コミットの履歴をみる

$ git log --oneline

このコマンドで直近のコミットの履歴が表示されます。
例えば下のような感じのコミット履歴があるとします。

$ git log --oneline
17ff46a エラー時に猫を出力
da4da17 明石さんにお願い
a3ca288 秘書官をつつく
dbb8d7f 部屋全体の構造を変更
b4cf264 提督が鎮守府に着任しました

dbb8d7f 部屋全体の構造を変更 ここで、間違えて「neko.log」が追加されてしまってたので取り消したいと思います。

編集する過去のコミットに移動する

今回はdbb8d7fのコミットを編集したいので、git rebase -iでは1つ前のコミットb4cf264を指定します。

$ git rebase -i b4cf264

コミットログが上から4番目なので、git rebase -i HEAD~4 のようにしてもOKです。

コマンドを入力するとエディタが起動します。

pick dbb8d7f 部屋全体の構造を変更
pick a3ca288 秘書官をつつく
pick da4da17 明石さんにお願い
pick 17ff46a エラー時に猫を出力

# Rebase b4cf264..17ff46a onto b4cf264 (4 command(s))
#
# 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, exec = run command (the rest of the line) using shell
#

修正したいコミットがある pick dbb8d7f 部屋全体の構造を変更pickedit に書き換えて保存します。

コミット内容を変更する

間違えて「neko.log」が追加されてしまってたのを取り消したいので、neko.logをステージングにaddしているのを取り消して、.gitginoreneko.logを追加して保存しました。
.gitginoreに変更があるので、これを追加します。

$ git rm neko.log
$ git add .gitginore

他にも変更がある場合は、ここでファイルを変更するなどしてgit addします。

変更がたくさんある場合
変更するファイルが多い時はgit reset HEAD^で一度も戻して、ファイルを変更してまとめてgit add .するのが楽です。

$ git reset HEAD^
# ファイルを変更する
$ git add .

変更が完了したらコミットします。

$ git commit --amend

エディタが開くのでコミットメッセージを入力して保存。

修正が完了したので変更を反映して最新の位置まで戻る

$ git rebase --continue

rebase での修正をやめたい

git rebase -iで修正中にワケガワカラナイヨになってしまって、やっぱ無し!となることもあります。
そんな場合は次のコマンドでrebaseでの修正をやめて最新のコミット位置に戻すことができます。

$ git rebase --abort
感想

コミットを変更するgit rebaseはなんとなく感覚を掴むことができましたが、今回はgit rebase --continue途中で止まることが無かったのですが、止まったりした場合の対処や他にもgit rebaseで出来ることは、まだ色々とあるのでちょっとずつ覚えていきたいデス。(必要に迫られないと覚えられない)


[参考]

入門git

入門git