【revert】【rebase】git revert か rebaseで特定のコミットでの作業をなかったことに


はじめに

開発を進める中で、あのコミットの作業だけ取り消したいなーという時に使える。
自分の場合は、デバッグする中で行ったprecompileが余計だったのだが、以下の手順でその実行結果が入ったコミットだけなかったことにすることができた。

方法としては2つあり、コミットIDを特定する等の途中までの手順は同じ。

コミットIDの確認など

まずは、git logでなかった事にしたいコミットIDを確認

git log --name-status --oneline

念の為、コミットしたファイルのリストを確認

git log --name-status コミットID

(更に念押し)そのコミットを行う直前との差分を確認

git diff コミットID^..コミットID

ここで、

 ^ は、コミットIDの一つ前を指す記号。

 .. は、例えばa..b とした場合にはaからbまでの差分を表す。

ここまでの確認で、自分の取り消したいコミットの内容が明確に把握でき、問題なければそれぞれ、revertrebaseに進む。

git revert

そのIDを指定してrevert

git revert コミットID

git rebase

git rebase -i [コミットID]^


** **: 

** **:

** **:

** **:

** **:

** **:

参考にさせて頂いた記事

終わりに。

最後まで読んで頂きありがとうございます
転職の為、未経験の状態からRailsを学習しております。正しい知識を着実に身に着け、実力のあるエンジニアになりたいと考えています。継続して投稿していく中で、その為のインプットも必然的に増え、成長に繋がるかと考えています。
今現在、初心者だからといって言い訳はできないですが、投稿の内容に間違っているところや、付け加えるべきところが多々あるかと思いますので、ご指摘頂けると幸いです。この記事を読んで下さりありがとうございました。

コマンドでprecompileをしてしまい、
19:30
そのコミットの内容だけ削除したいのですが、
19:31
そういった場合はどういった方法が安全なのでしょうか?

precompileの実行結果だけが一つのコミットに入っている状況であれば、そのコミットを無かったことにすれば大丈夫です。

こちらの方法、
git logでコミット番号を確認し、
git revert コミット番号
19:33
で良いのでしょうか?

GENDOSU(新しいタブが開きます) 19:33
そのやり方でも良いですし
19:33
自分は
たとえば消したいコミットが特定できている場合は
git log --name-status [コミットID]
で一応ファイルのリストを出して
19:34
確認して
git diff [コミットID]^..[コミットID]
差分出して
19:34
問題なければ
19:35
git rebase -i [コミットID]^
して、[コミットID]の行を削除してます

青山(新しいタブが開きます) 19:35
ありがとうございます!
git diff [コミットID]^..[コミットID]
こちらの ^.. はなにを表しているのでしょうか?

GENDOSU(新しいタブが開きます) 19:37
^は、コミットIDの一つ前を指す記号ですね。
19:38
で、..は、a..b とやった場合にはaからbまでの差分を表示します。

青山(新しいタブが開きます) 19:40
git diff [コミットID]^..[コミットID]
で、消したいコミット単体でなにを変更したかわかる、ということですね!

1

19:41
それで、
git rebase -i [コミットID]^
で特定のコミットの一つ前まで表示して、
消したいコミットの行を削除する。
19:41
ということですね!

1

GENDOSU(新しいタブが開きます) 19:44
rebaseなので、履歴は書き換わってしまう方法ではあります。
19:45
個人的には revertで履歴が残るのはコミットツリーが長くなるからやだなぁと言う感じでrebaseにしてます。

izszzz(新しいタブが開きます) 19:54
precompile実行の際のコミットを取り消す際にprecompile以外のファイルの変更がある場合conflictなどが起こる可能性があるので、その作業量を加味した上でrevertするか判断してください。

青山(新しいタブが開きます) 19:46
rebaseだと履歴の書き換え、
revertだと特定のコミットを打ち消すコミットを作成するため、その履歴が増える。ということですね。
19:47
ありがとうございます!
すぐにrebaseで確認します。

GENDOSU(新しいタブが開きます) 19:54
デメリットがあるとしたら、書き換わるので、戻したい!って思った時に手順がめんどくさくなるのと
失敗すれば戻せなくなる。というのはあります。

青山(新しいタブが開きます) 20:06
コミットツリーの長さについて気にしないのであれば、慣れないうちは、rebaseのほうが安全ではあるのですね。

20:06
今回は一度rebaseの方で確認します!

git revert すると
vimに入るので
:q
で抜ける

git log --graph --date=short --decorate=short --pretty=format:'%Cgreen%h %Creset[%cd] %Cred%d %Creset%s'


Revert "precompile実行"
が行われている事を確認

念には念で
git diff [コミットID]^..[コミットID]
でrevertした結果、その前後でファイルが戻っているか確認する。