なにが起こったのか(端的に)
- .DS_Storeファイルを消して、再度作成されたものをGithub上にpushしたら、過去のcommitメッセージを変えることができなくなってしまった話。
なにが起こったのか(全貌)
- とあるフォルダをGithub上のリモートリポジトリに上げる際に間違えて .DS_Storeもいっしょに上げてしまった。
- あとで修正できると思い、しらばく放置していた。(ここまでは間違ってない)
- さぁひと段落ついたから、Github上の.DS_Storeも消そうと思い、ローカルリポジトリの.DS_Storeを消し、それをGithubにpushした(これがすべての元凶)
- 「あ、そういえば過去のcommitメッセージも誤字ってたからいま変えとこう」と思い、
git rebaseしようと思ったら、異変に気づく。 - 「あれ、、.DS_Storeファイルがある。。?」
- よくよく調べてみたら、.DS_Storeファイルは何度消してもよみがえるアンデットらしい。
- なので手段を変えて、.gitignoreファイルを作り、.DS_Storeファイルをgithub上に上げないようにした。
- しかし、すでにGithubに上がっている.DS_Storeファイルとローカルのファイルが異なると、conflictが永遠に出る始末。
- pull, merge, stash, rm cacheなどを組み合わせて、リモートの.DS_Storeファイルを消し、conflict突破
- 「さぁ、過去のcommitメッセージの誤字を変えよう」とrebaseを用いて修正開始。
- 過去のDS_Storeファイルと現在のDS_Storeファイルが違うと、conflictの嵐 (<- いま)
解決方法の提案 (変えたいコミットメッセージは3つ前のものとする)
①通常の変え方(.DS_Storeはadd)
$ git rebase -i HEAD~5
vimが起動し、以下のようなファイルが開くので変えたい箇所のpickをeditに変更
pick ea09821 コミットメッセージ1
pick ab9736c コミットメッセージ2
pick d74a8b1 コミットメッセージ3 // ここの先頭のpickをeditに変更
・
・
ファイルを保存したら、
$ git add .DS_Store
$ git commit --amend -m "新しいコミットメッセージ"
$ git rebase --continue
②通常の変え方(.DS_Storeは削除)
①のやり方の最後のrebase直前で
$ rm .DS_Store
にして、ファイルを削除
③rebaseでeditせずに、ほんとにコミットメッセージだけ変える方法
$ git rebase -i HEAD~5
vimが起動し、以下のようなファイルが開くので変えたい箇所のpickをrに変更
pick ea09821 コミットメッセージ1
pick ab9736c コミットメッセージ2
r d74a8b1 コミットメッセージ3 // ここの先頭のpickをeditに変更
・
・
ファイルを保存したら、コメントを変更するためのvimが開くので、修正
コミットメッセージ3 // これを新しいメッセージに変更
# Please enter the commit message for your changes. Lines starting
これを保存したら、コミットメッセージの変更が完了し、rebaseも統合される
④上の3つやったあとに以下の文章が出てくる場合
// $ git rebase --continue後
You must edit all merge conflicts and then
mark them as resolved using git add
。。。。いやいやいやいやconflict解消したわ!てきな。
そのときはこれをしましょう。
$ git rebase --skip
⑤上でも無駄な場合、、
じゃあもう前のcommitのときに.gitignoreファイル作って「その時から.DS_Storeは無視してましたよ感」を出そう。
$ git rebase -i HEAD~5
vimが起動し、以下のようなファイルが開くので変えたい箇所のpickをeditに変更
pick ea09821 コミットメッセージ1
pick ab9736c コミットメッセージ2
pick d74a8b1 コミットメッセージ3 // ここの先頭のpickをeditに変更
・
・
ファイルを保存したら、
$ vim .gitignore
以下の記述をして、保存して閉じる
.DS_Store
あとはコマンド操作
$ git rm -r --cached .
$ git commit --amend -m "新しいコミットメッセージ"
$ git rebase --continue
、、、これでもできなかったら、、、わからん。。