Git
GitHub
GitBucket

リモートへのpushを修正する(僕が思う)一番簡単な方法

今回解決したい状況

すでにリモートのmasterへpush済みの最新のcommitに修正を加えたい(今回は分割したい).

手順

1.リモートの該当コミットを削除

今回は、最新のコミットを削除したいため

git push -f origin HEAD^:master

のようにし、リモートの街頭コミットを削除.
(最新から2個目のコミットの場合は、HEAD^^:masterのようにする。)

2.ローカルの作業内容を一時退避(該当コミットの後に、別の作業を進めていた場合)

git stash

として、現在の作業内容を一時退避する.

3.ローカルの該当commitの内容を修正

まず、

git rebase -i HEAD^

とする.
(※この際に、ローカルで新しい作業内容が存在するとエラーとなるため、上記にあるstash作業を行う)

次に、

pick 8e9fe0a index.htmlを修正

のような表記が上部にあらわれるため、これを

edit 8e9fe0a index.htmlを修正

とすることで、このcommitを修正できる.

よって、この後は、まず

git reset HEAD^

とし、commitの内容をadd前へ戻した後、今回の例では、分割を行いたいため、
はじめにcommitしたい内容をadd&commitした後、次にcommitしたい内容をadd&commitする.

その際に、同一ファイル内でも、編集箇所ごとにaddを分けたい場合はこの記事を参照.
Gitで部分的にコミットする方法

その後、

git rebase --continue

とすることで、ローカルのcommitが分割された.

4.リモートへ反映

git push origin master

とする.

5.一時退避していた作業内容を戻す

stashしていた作業内容を戻すには、

git stash pop

とする.

以上で、ローカル, リモート共に修正が完了した。

参考ページ

Git のさまざまなツール - 歴史の書き換え
【git】git pushを取り消す
[git]特定のコミットの内容を修正する
git-rebase - 過去のコミットを修正したい(コミット分割、内容訂正・追加)
gitでコミットしたものを後から複数のコミットに分割する方法