間違ってコミットしてしまった、コミットしたらデグレしてしまった。。
こういう時にコミットを取り消すコマンドがあります。
3つほど紹介したいと思います。
gitのリポジトリ
working treeが手元のコード。一番新しいです。
git add ファイル名
するとindexというコミット準備段階になります。
index上のファイルにgit commit -m "comment"
するとメッセージとともにlocal repositoryに保存されます。最新のlocal repositoryのことをHEADと呼びます。
最後にgit push
すると、GitHubなどチームで管理するrepositoryに移ります。
reset
remoteにpushする前ならこの方法で楽に任意のコミット履歴まで巻き戻せます。
pushしたあとresetするとリモートとの履歴に不整合が起き、git push -f
する必要が出てきますので注意。
もし自分のpushの前に誰かがpushした状態で、フォースプッシュするとその人のコミットを消し飛ばすので極力避けましょう。
// 1つ前のコミットに戻りworking treeもリセット
git reset --hard HEAD^
// 4つ前のコミットに戻りworking treeもリセット
git reset --hard HEAD~4
// add を取り消す
git reset --mixed
// 4つ前のコミットに戻りworking treeはそのまま
// つまりコミットのHEAD任意の履歴まで戻り、コード自体は残ったままになる。
git reset --soft HEAD~4
// 誤ってgit resetをした際に元に戻す
git reset --hard ORIG_HEAD
revert
git rest --hard
した際に他の人がpushした履歴(コミットログ)が消し飛ぶ危険性を避けるには、新たに打ち消し用コミットを作成する方法があります。
これなら履歴も消えないのでフォースコミットする必要はありません!
git revert <対象のコミットID>
rebase
無駄にコミットをしてしまい、醜くなってしまった時にまとめることができます。
あとで履歴を見たときに見やすく、レビューしてもらうときに余計な手間をかけさせないために使いましょう。
git rebase -i HEAD~3
// こんな画面がviで表示されます。
// pickで残す履歴、sでまとめてしまう履歴を選びます。
// この場合はe331898だけ残し、あとはまとめてしまいます。
pick e331898 wip
s c45e0bf test 6
s 042074b wip
# Rebase 8ac1025..042074b onto 8ac1025 (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
JetBrainのEditorを使っている方
ちなみにIdeaやPhpStormなどJetBrainのEditorを使っている方はここからもrevert, resetできて便利ですよ!
Gitのタブを開く>Log>特定のコミットをクリック> revert commit