そもそもなぜ最初の空commitが必要なのか
最初のcommitは戻りづらいからである。
commitを戻したり、取り消したりする方法は git rebase
や git reset
などがあるが、
最初のcommitはこれでは戻れない。
なぜなら、rebase・reset元の親commitが存在しないからですね。
最初のcommitを元に戻したい場合(これは余談なので飛ばしてもよいです)
git update-ref -d HEAD
というコマンドで元に戻せます。
gitは、最後のcommitをSHA-1ハッシュ値で覚えています。
これを参照する、参照(refs)と呼ばれるものがあり、
.gitの中を見てみると、以下のような構成になっています。
これらのファイルの中身がSHA-1ハッシュ値です。
$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/tags
そして、ブランチが切られたとき、gitは HEAD
というファイルで最後のcommitを参照します。
中身を見てみると、以下のように現在の作業ブランチの最後のcommitのSHA-1ハッシュ値を参照しています。
$ cat .git/HEAD
ref: refs/heads/master
なので、
最初のcommitを戻すということは、
現在の作業ブランチを切った最後の状態に戻すということになりますので、
update-ref
というコマンドを使って、現在の参照を削除して、1つ前に戻してあげるということです。
なので、最初に空commitをしたほうがよいですよということです。
そのために差分のない状態でもcommitできる --allow-empry
オプションがありますね。
がしかし、毎回するのは面倒だなぁ、というのがあるので、aliasを使ってみました ^o^/
本題のalias
gitのaliasの書き方については、【Git】エイリアス晒す&書き方まとめにまとまっていました^^
私は基本的にブランチを切って最初のcommitをするまでに
私は以下の手順を行います。
git checkout -b <ブランチ名>
git commit --allow-empty '<ブランチ名> init'
この手順を一つで行うaliasです。
alias gcb="git checkout-b-empty-commit"
[alias]
checkout-b-empty-commit="!sh -c 'git checkout -b $1 && git commit --allow-empty -m /"$1 init/"' -"
引数を使用したかったため .gitconfig
の方に中身のcommandを記述しました。
(zshのaliasには引数を使用できないので関数にしないといけない)
2箇所で設定したくない場合は、関数でするのもありかと思います。
私は .zaliases
や .gitconfig
などはdotfilesで管理していて、設定ファイルが散らばりにくくなっているので
.zaliases
.gitconfig
で作成しました^^
毎回行う手順などは、aliasにしておくとやはり便利ですね!!