経緯
タスクスクリプトを作成しリモートにpushしてレビューに出そうとしたところ、
Gemfile.lockとschema.rbの差分もpushしてしまっていることに気付きました。
bundle installしたときに更新された分です。
自分が入れたgemじゃないし、今回はタスク追加の変更のみpushしたかったので、Gemfile.lockとschema.rbの差分pushをなかったことにします。
ログの確認 → コミット巻き戻し → 手直し → force push という手順で行います。
まずはログの確認
$ git log
commit commitID # 今回pushしたもの
Author: author name
Date: Fri Dec 4 18:48:13 2020 +0900
タスクの追加
commit commitID # ここの状態に戻す
Author: author name
Date: Fri Dec 4 15:06:53 2020 +0900
ロジック削除
commit commitID
Author: author name
Date: Fri Dec 4 14:57:10 2020 +0900
中央揃えにする
コミット巻き戻し
「# 今回pushしたもの」の一つ前、「# ここの状態に戻す」ところにgit resetで状態を戻します。
git reset commitID
git resetにはオプションがあって、
-
git reset --soft commitID→ ワーキングツリー* の変更とステージング* の状態はそのまま残る。 -
--hard→ どちらの内容も消える。 -
--mixed→ デフォルトはこれ。ワーキングツリーの変更は残るがステージングの状態は戻る。
*ワーキングツリー:ユーザーが作業しているディレクトリ領域。
*ステージング:コミット対象のファイルを登録する領域。git addで登録する。
今回は作ったタスクは残しておきたかったので、デフォルトでgit reset。
ワーキングツリーの状態は残し、pushしないファイル(Gemfile.lockとschema.rb)はcommit対象から外すため、ステージングを元の状態にしておきます。
コミットを巻き戻したら一応git logで状態をみてみます。
$ git log
commit commitID
Author: author name
Date: Fri Dec 4 15:06:53 2020 +0900
ロジック削除
commit commitID
Author: author name
Date: Fri Dec 4 14:57:10 2020 +0900
中央揃えにする
コミットが一つ消えました。
手直し
Gemfile.lockとschema.rbの変更を取り消します。
vsコードで取り消しました。
vsコードの左上、

のタブにとび、変更を取り消したいファイルにカーソルを当てて、

をクリックします。
force pushする
$ git add .
$ git commit -m"タスクの追加"
$ git -f push origin <作業ブランチ名>
-fがforce pushするときのオプションです。
なぜforce pushするかというと、リモートには先ほどローカルでresetしたcommitが残っているからです。リモートとローカルに差異があるので、そこをforce pushで強制的に上書きしてしまいます。
こうすることで、不要なファイルを含んだコミットが消えて、不要なファイルを除いたコミットが記録されます。
PR出したローカルブランチがすでにないとき
pushした後、早々にローカルブランチ消してしまったといった場合は、
PRをローカルに落として、作業ブランチに移動してからログの確認・・・という手順を踏めばOkです。
git fetch origin pull/{PR番号}/head:{branch名}
git checkout {branch名}
参考
を参考にさせていただきました。