Sochi419のブログ

プログラミング初学者です。Ruby, JavaScriptを学習中です。猫が好きです。フィヨルドブートキャンプというスクールの受講生です。

「不要なコミット削除方法」+「githubのリモートの内容をローカルに持ってくる方法」

記事内容

  1. 不要なコミット削除方法
  2. git resetをして、ローカル内容が消し飛んだ時に、リモートの内容を引っ張ってくる方法

上記2点でハマったので、忘備録を兼ねて記事にしました。

1. 不要なコミットの削除のやり方

pull requestに、関係のないファイル(他のPRでコミットされたファイル)がコミットされてしまった。 原因はブランチを切るところを間違えたことと推測される。 その時の対処法をまとめた。

1. brew install tigでtigをインストール

用途としてはgit logと同じだが、tigの方が見やすいので、インストールした。 (こっちの方が、git logより見やすい。)

該当のブランチに移動して、 tig を打ち込んで、コミット履歴を確認する。

image.png

全てのコミットが表示されるので、消したいコミットがあることを確認。

2. git rebase -i HEAD~4で、いらないコミットを消す

最新から4番目以内の編集ができる。 (例えば4ではなく、6にすると、6番目までを編集可能) tigでいらないコミットが上から何番目にあるかを確認して、何番目まで編集可能か決めるといい。

image.png pickをdropに書き換えると、消すことができる。 (行自体を消す、でも可能だが、dropに書き換える手法の方が、後々わかりやすい。)

3. git push origin calendar --force-with-leaseで、ローカルの内容をリモートに反映

git push origin calendar でpushしようとしたが、conflictエラーが発生(リモートとローカルに差分があるので、できない状態)。 →オプションに、--forceを付けることで、差分があっても、無理やりローカルの内容をリモートに反映させられる。(リモートの内容は全て無視して壊す)

with-leaseオプションは、他人がリモート上で編集を行なっていた場合に、自分がpushをする時に警告が出てくれるオプション。(警告が出たら、他人がリモートで作業しているということなので、他人に確認を取ってから、pushしてね、ということ)基本はwith-leaseをつけた方が無難。

2. git resetコマンドを実行してしまい、ブランチが消えてしまった時の対処法。

1. git fetch origin.を使って、リモート上のブランチ全てのファイルを取ってくる。(※2番のやり方の方が無難)

→持ってこれるのは、あくまで自分が最後に編集した状態の、リモートの状態(他人がリモートで編集していた場合は、その差分は含まれない) →含みたい場合はpull ローカルとの差分があっても、その差分は持ってこない。 差分ある場合は、ターミナルの設定によっては、最新かどうかの警告が出る。 全部の内容を持ってくるので、情報が多くなってしまう。

2.git branch ブランチ名 origin/ブランチ名でファイルを指定して、リモートから内容を持ってくる

git branch ブランチ名 origin/ブランチ名

上記コマンドで、リモート上のファイルを指定して、リモートの内容を引っ張ってくる。

[追記] 他の関係のないコミットが混ざってしまう原因。

原因

ローカルのmainがリモートの状態より進んでいたから、pushした時に不要なコミットが混入していた。 →自分としてはgit pullをしたので、ローカルとリモートのmainの状態が同じだと勝手に思い込んでいた。 →ローカルの方が進んでいると、git pullをしてもリモートとローカルの状態は同じにならない。

git pullについて

git pullはローカルの方がリモートよりも進んでいない場合に、リモートと同じ状態にすること。 今回の場合はローカルの方がリモートより進んでいたので、pullしたとしても、もともとローカルで進んでいたコミットが消えたわけではない。そのため、pushした時にプルリクに含まれた。

やったこと

ローカルのmainを消去して、remoteのmainをpullする。(ローカルとリモートを同じ状態にする。→不要なコミットが混ざらない。)

git branch -D mainで、ローカル上のmainを消す。 (-Dは強制消去。-dは安全に消去) →git branch上で、mainが消えていることを確認。 ② git pullする。git branch上で、mainがpullされたことを確認。 これで、リモートのmainの状態がローカルに反映された。

ちなみに、 git diff main origin/main で、main(ローカル)とorigin/main(リモート)の違いを確認できる。 (もし違いがなければ、コマンドを打っても何も表示されない。)

ペアプロで学んだコマンド集

① ctrl + r

過去に入力したコマンドを参照できる。 ctrl + r と打つと、下記画像のような状態になる。 image.png

例えば、git diff main origin/wc-new を参照したいなら、画像の状態でgit diと途中まで打てば、過去に打ち込んだコマンドに当てはまるものが候補として表示される。

image.png

② git cherry-pick コミット番号

git cherry-pick c4cb46c5a4e6b97126bb3a723cbf6b38582d0796

現在いるブランチに、他のブランチのコミットを持ってくる。 コミット番号は5桁表示すればOK.(全部打ち込む必要ない)

③ git log --pretty=format:"%C(green)%h %C(blue)%ad %C(red)|%C(reset) %s%d [%an]" --graph --date=short -4

git log --pretty=format:"%C(green)%h %C(blue)%ad %C(red)|%C(reset) %s%d [%an]" --graph --date=short -4

git logをより詳細に見ることができる。 これは、u1tnkさんのエイリアス

image.png

④ git push -f origin wc-new

git push -f origin wc-new

強制push

⑤ git branch -a

git branch -a

image.png ローカルの中にもremoteの状態内容があって、それを表示する。 git pullをすると、この中にある、remotes/origin/mainが参照される。