6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

GitAdvent Calendar 2019

Day 11

ブランチを切って最初の空commitまでするalias

Last updated at Posted at 2019-12-10

そもそもなぜ最初の空commitが必要なのか

最初のcommitは戻りづらいからである。

commitを戻したり、取り消したりする方法は git rebasegit 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です。

.zaliases
alias gcb="git checkout-b-empty-commit"
.gitconfig
[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にしておくとやはり便利ですね!!

6
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?