#背景
iOSのアプリ開発をしていて
修正した部分をGitHubのリポジトリにpushしようとした時に
間違ったコミットをpushしてしまった。
普段は、修正点の差分をgit add -p
で一つずつ確認しながら
y(Yes) or n(NO)で変更を採用するかしないか(ステージングにあげるかあげないか)を決めているのだが、
今回はミスってgit add .
でしてしまった。
(このコマンドだと、ls -a
で出てくるような .~~ のファイルの差分とかも含め全て一気に採用してステージングに取り込んでしまう)
これをしてしまったため、
Carthageの不要な差分まで採用してpushしてしまい、
GitHubに上がった差分を見た時にそれに気づいた。
(ああ…これを取り消したいっ)
#対応方法
このようにGitHubにpushしたくなかったコミットの差分を
元に戻すには、
git revert (コミットID)
をする。
これをすると、該当のコミットの変更を取り消ししたコミット
が出来上がる。
これをpushすると、GitHub上でも前の状態に戻る!
ちなみに、間違った時のコミットとそれをrevertしたよというコミットのログは残る。
(まぁ、これは仕方がないことである)
逆に、ローカルで間違った(直前の)コミットをなかったことにしようとして
git reset —hard HEAD^
とかをしてしまうと逆に大変。
(HEADの後の^を二つにしてHEAD^^とすると二つ前のコミットまで戻る)
ローカルでは確かになかったことになりgit log
すると
一つ前のコミットまでは戻っているが、
これでGitHubにpushしようとしてもできない上、
GitHubの履歴に合わせてpushできるように戻そうと
慌てて git reset —hard HEAD@{1}
と、(stashした時にpopで戻すような感じで)戻しても、
この戻ってきた間違いコミットのコミットIDは、
GitHubにあげてしまった間違いコミットのコミットIDとは
また別物に変わってしまっているためpushができなくなっている。
なので、GitHubに間違ってpushした時は
間違ったコミットをなかったことにはせず、
素直にgit revert (コミットID)
をして、自分のミスを受け入れて
間違ったので取り消しましたとわかるコミットも履歴に残しておこう。