git の設定を管理しよう

この記事は [一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita](https://qiita.com/advent-calendar/2023/raki) の８日目

# git の設定

- git にはたくさんの設定がある
- たいていはデフォルトの設定でうまく動く
- 自分の好みや使い方に合わせて設定を変更することができる
- 自分用の設定を git で管理して、github にあげておけば便利
- config_git リポジトリを作りましょう

本文はここまで。以下は時間外ｗ

# おすすめ

- リポジトリの名前を git にすると紛らわしい（リポジトリのURLが github.com/xxx/git.git になる）
- `$XDG_CONFIG_HOME` に配置すると、`$HOME/.config/git` になるので、リポジトリ名を `config_git` にすることを薦めている
- 全部コピペで突っ込むのではなく、覚えたいものとか、役に立ちそうだと思ったら使ってみる、一度に全部じゃなく少しずつやっていく、のを忘れないこと

# alias

- vs shell alias
    - 好みがわかれるところだけど
    - git コマンド自体を alias `g`
    - `commit` を git alias `c` または `co` 
    - するとコマンドは `g co`
    - とするくらいなら、shell alias で `gco="git commit"` のほうがスペース１文字分タイプ数が少ない
    - （ちなみに gc は count graph components というコマンドが既にあるので上書きしないことを薦める。`man gc` を参照。ガベージコレクションのことではない）
    - というわけでサブコマンドに関してショートカットするつもりで git alias するなら、シェルのコマンド alias にフルコマンドで設定しておいたほうが楽だと思っている。参考 [dotfiles/alias at master · officel/dotfiles](https://github.com/officel/dotfiles/blob/master/alias)

お薦めする git alias はこれだけ。特に plog は shell alias に持っていくと長いのでこっちに置いている。pr は引数をくっつける必要があって、bash alias では実現できない（？ function にする必要がある）のでこっちにいる。

```bash:config
[alias]
    cancel = reset --soft HEAD^
	save   = stash save
	load   = stash pop
	alias  = !git config --get-regexp 'alias\\.' | sed 's/alias\\.\\([^ ]*\\) \\(.*\\)/\\1\\\t => \\2/' | sort
	plog   = log --pretty=format:'%C(yellow)%h %C(green)%cd %C(reset)%s %C(red)%d %C(cyan)[%an]' --date=format-local:'%t%Y/%m/%d %H:%M'  --all --graph
	pr     = "!git push origin HEAD:refs/heads/$1 #"
```

ちなみに shell alias 側のお薦めはこう。

```bash:alias
# git
alias g='git'
alias ga='git add'
alias gau='git add -u'
alias gb='git branch'
alias gcan='git commit --amend --no-edit'
alias gcv='git commit -v'
alias gdc='git diff --cached'
alias gdi='git diff'
alias gg='git grep -i -P'
alias gp='git plog -10'
alias gpr='git pr'
alias gr='git fetch --prune --all && git checkout origin/HEAD && git plog -10 && git status'
alias gs='git switch -d origin/HEAD'
alias gst='git status --short --branch'
alias cr='cd "$(git rev-parse --show-toplevel)"'
```

上２つをセットしておくと、普段の作業はこんな感じ。毎日何度も打つのでこのくらい省力化できると楽

```bash
cd repo
gr      # fetch してデフォルトブランチに移動（デタッチ）して最新のログとディレクトリの状態を表示
vi xxx  # 何かする
cd yyy  # 移動して何かする。以下繰り返し
vi yyy
...
cr   # めんどくさいのでリポジトリのトップに移動（Change Repoと覚える）
gst  # 作業結果のチェック。あと作業に時間が空いたらいつでも gr してる
gau  # git add (-u)
gcv  # git commit (-v)
gpr fix/xxx # git push (origin HEAD:refs/heads/fix/xxx)
```

# ignore

- `.DS_Store` と `*.swp` をリポジトリに混ぜてしまうミスは何もかもが理解できていない証拠なのでまずこれを突っ込め
- それ以外はだいたいリポジトリ毎の運用の範疇なので要相談（リポジトリ側にあれば要不要はそれに従う）
- `*.nogit` , `*.nogit.md` みたいなのを入れておくとローカルに置いておいてもコミットされないメモに使える（ファイルの管理には注意）
- ちなみにこのメモは、history やコマンドの出力をメモしておく `command >> hist.nogit` によく使える
- 本来必要ないけど、古き良き一時的なファイルのバックアップとして ``cp -p org org.`date -I`.nogit`` としても便利（いやほんと git の話してるんだからこれは要らないよね）

# その他のファイル

- `git_commit_conventions.txt` を用意して、

```:git_commit_conventions.txt
[commit]
	template = /path/yours/git_commit_conventions.txt
```

のようにすると、コミット時テンプレートとして使える。[Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) に慣れるまで付けておくとそれなりに重宝する。

- サブモジュールとかアトリビュートってグローバルで管理しない、よね？


# 改善依頼

- ご自慢の dotfiles か config_git なリポジトリがあればぜひ参照させて欲しい
- ターミナルの背景黒、透過なしにしているので、個人的には困ってないんだけど、配色周りで何か工夫を知っている人がいればぜひ共有して欲しい
- プロンプトにブランチ名を出すの、個人的には邪魔だと思っているのでやってないんだけど、紹介したい人がいたら