Git を少しでも高速、安全に使う方法を紹介

はてブを眺めてたら、なんか Git の記事がバズってたので、便乗して Git の話を書いてみた。

基礎知識

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つ問題がある。

  1. reset --hard で未コミットの内容が吹き飛ぶ危険性
  2. 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 をしていない作業は諦めて。

sinsoku.hatenablog.com

まとめ

git branch -f は速いし、ミスっても git reflog show <branch_name> で簡単に復旧できるので、みんな使いましょう!