Git Advent Calendar / Jun. 最終日(30日目)の記事です.29日目は「いざという時のためのgit reflog」でした.
Git Advent Calendar最後なので,git操作でやりがちなミスからどう回復するかをまとめます.他にもあればコメントもらえるとマージしていきます.
ブランチを切り忘れてmasterでコミットしてしまった
その時点でブランチを切る&reset --hardで間違ったコミットたちをmasterから消す
$ git checkout -b new-branch
# masterの最新コミットを消す
$ git checkout master && git reset --hard HEAD~
ブランチを移動し忘れてコミットしてしまった
cherry-pickでコミットを引っ張ってくる.
# 現在間違ったブランチ(bad-branch)にいる
$ git checkout good-branch
$ git cherry-pick bad-branch # 間違ったブランチに行なったコミットを持ってくる
# 間違ったブランチに行なったコミットを消す
$ git checkout bad-branch && git reset --hard HEAD~
間違ったコミットをpushしてしまった
個人プロジェクトならコミットを消して反則技のgit push -fする.そうでないなら,可能な限り速やかにgit revertを使って「間違ったコミットを打ち消すコミット」を行ない,pushする
マージ済みのブランチが大量にある
git branch --merged
で一覧が見られるので,masterとカレントブランチ以外を以下のようにして消す.
$ git branch -d $(git branch --merged | grep -v master | grep -v '*') # masterと現在いるブランチは消さない
間違ってreset --hardで戻しすぎた
git reflogを使う.詳しくは昨日のエントリ(いざという時のためのgit reflog)を参照.
重要なstashを消しちゃった
git stash drop
したり,git stash pop
-> git reset --hard
したとき.
git fsck
するとdangling commitが見られるので,git cherry-pick <SHA1>
かgit stash apply <SHA1>
してあげるとよい.
git gcが走ってたら消えてるかも.
コミットメッセージでtypoした
直前のコミットの場合はgit commit --amend
を使う.amendと打つのが面倒なので,git commit --amend
はgit fix
にエイリアスしてる
$ git commit # コミットメッセージでtypoした
$ git commit --amend # 入力しなおす
ブランチを移動しようとしたら怒られた
以下のようなメッセージが出たとき
$ git checkout fix/piyo
error: Your local changes to the following files would be overwritten by checkout:
config/deploy.rb
Please, commit your changes or stash them before you can switch branches.
Aborting
消してもいい変更ならgit reset --hard HEAD
とかgit co .
する.後者をよく使う.
消さずに保存したい場合はきちんとコミットするか,stash saveする.
git stashについてはfukajuneさんの「変更を一時的に退避!キメろgit stash」が詳しいです.
昔のコミット内容にちょっとしたバグを見つけた
そのコミットをまだpushしていない場合限定
新しく行なった変更を以前のコミットに含めたい.
直前のコミットに含めたい
上記のcommit --amend
を使うとよい.
それ以上古いコミットに含めたい
変更をcommitしたあと,git rebase
を使う.
$ git commit -m '適当なメッセージ'
$ git rebase -i HEAD~3 # 修正したいコミットを指定
# エディタが立ち上がるので,'適当なメッセージ'のコミットを修正したいコミットの下に移し,先頭をsquashに変更する
その他困った
QiitaのGitタグ投稿を見るか,git-tasuketeに助けを求めてみる