経緯
タスクスクリプトを作成しリモートに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名}
参考
を参考にさせていただきました。