20240325 gitあれこれ、プロンプト、ブランチへのpush禁止、aliasに引数

### git、github

#### プロンプト変更
いままで公式（なのかな？）のプロンプトと補完を使ってた
→ [git/contrib/completion at master · git/git](https://github.com/git/git/tree/master/contrib/completion)

けど、偶然もっといい見た目のをみつけたのでそっちにする
→ [magicmonty/bash-git-prompt: An informative and fancy bash prompt for Git users](https://github.com/magicmonty/bash-git-prompt)

* 参考までに...
    * zsh用: [woefe/git-prompt.zsh: A fast, customizable, pure-shell, asynchronous Git prompt for Zsh](https://github.com/woefe/git-prompt.zsh)）
    * powershell用: [dahlbyk/posh-git: A PowerShell environment for Git](https://github.com/dahlbyk/posh-git)

##### 比較
* 今まで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/8728ed57-628c-4af0-0739-b233229c4c9f.png)

* 新しいの
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3740499/0b6d7120-82e7-1dc8-32b6-7b1494a7b026.png)
なんかかっこいい！できれば日時は上、ブランチ状態はしたに来てほしいのでもうちょっと改善したい

##### それぞれの参考的なサイト
git-prompt.shの参考 ： [git-completionとgit-prompt導入用スニペット（Bash向け） #Linux - Qiita](https://qiita.com/Ping/items/234b8974bdf2a5e618a5)
bash-git-promptの参考 ： [bash-git-prompt でレスポンスを改善するための設定メモ #Git - Qiita](https://qiita.com/syoyo/items/72d21ffa1ad8ccc68a9b)

#### mainブランチに直接pushを禁止する
ブランチのsetting->branchで設定できる。Lockにチェックを入れる
参考:[GitHubでブランチ保護を有効にする #Git - Qiita](https://qiita.com/KeisukeKudo/items/6404f51d1f4407661321)

実際にやってみるとエラーになってくれる
```bash
✔ ~/documents/RR-automate [main ↑·1|⚑ 3] 
17:19 $ git push origin main
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 12 threads
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 342 bytes | 24.00 KiB/s, done.
Total 3 (delta 2), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (2/2), completed with 2 local objects.
remote: Bypassed rule violations for refs/heads/main:
remote: 
remote: - Changes must be made through a pull request.
remote: 
remote: - Cannot change this locked branch
remote: 
To github.com:tontoroRR/RR-automate.git
   1c63c8b..f88bf9c  main -> main
```

#### git aliasに引数渡したい、
あるブランチが今のブランチにすでにマージ済みかどうかを確認する方法を調べたところ、下の方法でできることがわかった
```bash
$ git merge-base --is-ancestor (確認したいコミットID) HEAD
```
参考：[(git) 指定したコミットが含まれるか確認する #Git - Qiita](https://qiita.com/m-tmatma/items/15c5cdd9f014f6dec580)

長いのでaliasにしたいと思い何も考えず以下のようにした
```bash
alias config alias.in "merge-base --is-ancestor $(git log -1 --pretty=format:$h $1) HEAD"
```
けどこれはエラーになる、だめです

ちょっと調べたところ、こうするとうまくいった
```bash
alias config alias.in '!git merge-base --is-ancestor $(git log -1 --pretty=format:$h $1) HEAD #'
```
参考：[command - Git alias with positional parameters - Stack Overflow](https://stackoverflow.com/questions/3321492/git-alias-with-positional-parameters)

あたまの`!`はそれ以降をgitのコマンド（？）として読むのではなく、shellで実行できる何かとして処理するといった意味らしい
最後の`#`で引数以降が重複して渡されないようにコメントアウトしている

もし`#`がないと`git in some_branch`は次のように解釈される
```bash
$ git merge-base --is-ancestor $(git log -1 --pretty=format:%h some_branch) HEAD some_branch
```
引数が`$(git ~~） HEAD some_branch`と三つになる --is-ancestorは引数を二つとるのでエラーとなる
そこで`#`をつけるとこうなる
```bash
$ git merge-base --is-ancestor $(git log -1 --pretty=format:%h some_branch) HEAD # some_branch
```
そう、some_branchがコメントアウトになる

引数の渡し方がわかんなかったときはbashの関数定義してshellのaliasつかおうとしたが、git補完できなかったので早々に却下（やる方法はあると思うけど探すのめんどいし、今から.bashrcに入れるのもめんどいし、一番イヤなのはgit-completion.shと二重になること、とにかくイヤ）
git aliasだととくに何もしなくてもgit-complete.shを読み込んでおけば補完もしてくれてとても便利