はてブを眺めてたら、なんか Git の記事がバズってたので、便乗して Git の話を書いてみた。
- Oh, shit, git! http://ohshitgit.com/
- 「Oh shit, git!」を簡単に和訳してみた。(追記あり) - Qiita https://qiita.com/KaminoHiroki/items/391fb421e94e82c00128
基礎知識
git-reset は危ない
git reset --hard は作業ディレクトリにコミットしていない変更があった場合、全てを吹き飛ばしてしまう可能性があります。
使う前に必ず git status を実行して、作業ディレクトリの状態を確認をした方が良いです。
git-checkout は遅い
checkout コマンドは作業ディレクトリの状態を変更します。このとき ファイルアクセスが発生するため遅い です。
git-branch -f は速くて便利
git branch -f は同じ名前のブランチがあっても無理やりブランチを作成できるコマンドです。
git-reset と異なり、任意のブランチを弄れるため非常に強力です。
少しでも高速、安全に使う事例の紹介
基礎知識を紹介したところで、いくつか事例を紹介します。
間違ってmaster ブランチで作業してしまったとき
よく紹介される方法は下記のコマンド。ちなみに @ は HEAD と同じです。
$ git branch new-branch $ git reset --hard @~ $ git checkout new-branch
このコマンドだと2つ問題がある。
reset --hardで未コミットの内容が吹き飛ぶ危険性- checkout を使っていて遅い
少しだけ改善したコマンドは下記の通り。
$ git checkout -b new-branch $ git branch -f master @~
これなら checkout のファイルアクセスも最小で、未コミットの内容があっても消えません。
master ブランチをリモートに追従したい
よくある方法はこちら。
$ git checkout master $ git pull origin
checkout してブランチ移動すると作業が止まるし、ファイルアクセスもあって微妙ですよね。
そこで branch -f ですよ。
$ git fetch origin $ git branch -f master origin/master
どんなに master と origin/master が離れていても一瞬で実行が終わります。
より安全に master ブランチをリモートに追従したい
branch -f や reset --hard は怖いって人にオススメのコマンドがあります。 rebase です。
$ git fetch origin $ git rebase origin/master master
これならコミットしていない変更があれば rebase が実行できませんし、コンフリクトが起きたら git rebase --abort で元の状態に戻すことができます。
ブランチから辿れないコミットを探す方法
git reflog を使えば、だいたいなんとかなります。(使い方は適当にググって)
あと、 git reflog show <branch_name> でブランチの履歴が表示できるので、もし git branch -f でミスっても簡単に戻せます。
ブランチや reflog で辿れないオブジェクトを探す
git fsck --lost-found の使い方は昔ブログに書いてあるので、それを参考に頑張って探しましょう。
git add さえしていれば、ギリギリなんとかなる。 git add をしていない作業は諦めて。
まとめ
git branch -f は速いし、ミスっても git reflog show <branch_name> で簡単に復旧できるので、みんな使いましょう!