## 経緯
[[Lazygit]]のv0.41.0がリリースされた。
<div class="link-card">
<div class="link-card-header">
<img src="https://github.githubassets.com/favicons/favicon.svg" class="link-card-site-icon"/>
<span class="link-card-site-name">GitHub</span>
</div>
<div class="link-card-body">
<div class="link-card-content">
<p class="link-card-title">Release v0.41.0 · jesseduffield/lazygit</p>
<p class="link-card-description">Hold on tight because this is a HUGE release! This release includes a whopping 595 commits from a period of over 7 months, from 40 different contributors. Thanks to every ... </p>
</div>
<img src="https://opengraph.githubassets.com/b5db9b1672cb714d37d0f99674b5fe881f12df082b4380c250c1771bc2fe8184/jesseduffield/lazygit/releases/tag/v0.41.0" class="link-card-image" />
</div>
<a href="https://github.com/jesseduffield/lazygit/releases/tag/v0.41.0"></a>
</div>
> Hold on tight because this is a HUGE release! This release includes a whopping 595 commits from a period of over 7 months, from 40 different contributors.
とあるように非常に大きなリリースなので、リリースノートを読みながら一通り試してみることにした。
なお、本レポートではすべての項目に対する記載はない。とりわけ以下の項目は除外している。
- 個人的にあまり恩恵を得られそうにないもの
- 試してみたが期待通り動かなかったもの
## 前提条件
バージョンアップ前のバージョンは0.40.2。
```console
$ lg --version
commit=5e388e21c8ca6aa883dbcbe45c47f6fdd5116815, build date=2023-08-07T14:05:48Z, build source=binaryRelease, version=0.40.2, os=linux, arch=amd64, git version=2.34.1
```
基本的には[[Ubuntu 22.04 LTS(Jammy Jellyfish)]] on [[WSL]]上で、[[Neovim]]から[[lazygit.nvim]]経由で利用している。
## バージョンアップ
まずはバージョンアップする。
```console
mise up
[email protected]
```
```console
$ lg --version
commit=3675570a391b1a49ddd198b4c7e71e17701d4404, build date=2024-03-23T09:09:11Z, build source=binaryRelease, version=0.41.0, os=linux, arch=amd64, git version=2.34.1
```
## Videoを見る
以下のVideoを見て気になる点をメモっておく。
![](https://www.youtube.com/watch?v=_REmkoIyPW0)
- スクロールバーがスマートに
- 画面最下部にガイドのキーバインドが追加された
- ちょっとしたエラーもポップアップではなくそこに
- staging view
- アイコンの追加
- unstagedが赤ではなく白に
- pullやpushなどのステータスがbranchの横に表示されるように
- commits
- デフォルトでグラフが表示されるようになった
- `V`でコミットを複数選択できる
- rebase周りの修正が理解できなかったのであとで理解する
- `Ctrl+S`でファイルのフィルタ機能
Videoを見終わったのでリリースノートを見ながら機能を確認していく。
## Range select
`v`を押すとステージングやコミットの画面で複数の項目を選択できるようになった。
[[👤jesseduffield]]氏はこの機能によって[[squash (Git)|squash]]が楽になったと具体例を述べている。
> f I need to squash a range of commits I can now easily do it directly rather than needing to squash them one-by-one, or needing to manually start an interactive rebase first. Likewise, it's much easier to select a range of files and stage them than stage them one-by-one.
自分はこの窮地にまだ達せられていないので、複数選択できることを頭の片隅に入れておくかくらいの温度感だ。
## Auto-wrap in commit editor
コミットメッセージが72文字で自動的にwrapされるようになった。wrapされるのは単語の切れ目。`Enter`を押す必要がなくなるとのこと。
`Commit description`の方だけで、`Commit summary`は折り返されないようなので注意。
### 例
以下のコミットメッセージを入力したとき。
```
hogehoge hogehoge hogehoge hogehoge hogehoge hogehoge hogehoge hogehoge hogehoge hogehoge
```
v0.40.2だとこう。
![[Pasted image 20240323205043.png]]
v0.41.0だとこう。
![[Pasted image 20240323205209.png]]
## Easier start interactive rebase
インタラクティブな[[rebase (Git)|rebase]]の開始が簡単になった。`i`を押すだけで、現在のブランチの全コミットが対象となるように[[rebase (Git)|rebase]]がスタートする。
### 例
以下の`branch1`ブランチでコミットした内容を[[squash (Git)|squash]]するケースを考える。
```
● a27026e (HEAD -> branch1) Update README2
● 5c9ce81 Update README2
● c78e050 Update README2
● │ 22d8540 (master) Update README3 2
● │ 838f654 Update README3
├─╯
● 6b18530 Update README2
● 2ebc154 Add README
```
v0.40.2だと、ベースコミットの指定は手動で分岐コミットまで移動して`e`を押す必要がある。
![[Pasted image 20240323211504.png|frame]]
*分岐コミットまで手動で移動する必要がある*
![[Pasted image 20240323211526.png|frame]]
*`e`を押すとこうなる*
v0.41.0では、適当な場所で`i`を押すと同じことができる。
![[Pasted image 20240323211648.png|frame]]
*カーソルのコミットはどこでもいい*
![[Pasted image 20240323211818.png|frame]]
*`i`を押すだけで同じ結果になる*
## Delete remote branches/tags
v0.40.2ではリモートのタグやブランチを削除できない。
![[Pasted image 20240323212517.png|frame]]
*ローカルタグを削除していいかの確認だけ*
v0.41.0ではリモートのタグやブランチも削除できる。
![[Pasted image 20240323212541.png|frame]]
*ローカルとリモート どちらのタグを削除するか選択できる*
## Find appropriate commit for fixup/amend
レビュー指摘などで以前のコミットに含まれる内容を修正したとき、対象コミットへ[[fixup (Git)|fixup]]や[[amend (Git)|amend]]したいケースがある。通常、この探す作業はやや面倒だが、この機能によって`Ctrl+F`を押すと、変更点から対象コミットを推測してくれるようになった。
### 例
以下の[[コミットグラフ]]を考える。
```
● 38edf32 (HEAD -> add-feature) Call sum2 in main
● f81349c Rename sum -> sum2
● 47eee7f Add sum3
╭─╯
● adc9026 (master) Add docs
● 189294a Update main
● 669bc81 Add lib.ts
● 8a3f926 Update index.ts
● e2a4ce6 Init bun
● 1968aa6 Add README
● fe6c089 Add .gitignore
```
`47eee7f Add sum3` は以下のように関数を追加するコミット。
```ts
/**
* Sum x and y and z
*/
export function sum3(x: number, y: number, z: number): number {
return x + y;
}
```
だが、上記には実装ミス (`z`が加算されていない) があり、後にPRで指摘され修正することにした。その間には2つのコミットがされていた。
```
● 38edf32 (HEAD -> add-feature) Call sum2 in main
● f81349c Rename sum -> sum2
```
この2つのコミットはいずれも`sum3`関数とは直接関係しない変更点である。
![[Pasted image 20240323215141.png]]
![[Pasted image 20240323215200.png]]
ここで、`sum3`の変更を追加するシーンを考える。つまり、以下のような状態。
![[Pasted image 20240323215325.png]]
この状態で`Ctrl+f`を押してみると、自動で関係ありそうなコミット `47eee7f8`がフォーカスされる。
![[Pasted image 20240323215427.png]]
あとは`Shift+a`で対象コミットに対して[[amend (Git)|amend]]してやればいい。`z`が加算されたコミットに書き換わったことがわかる。
![[Pasted image 20240323215622.png]]
> [!thinking]
> 個人的には『レビュー修正』みたいなコミットは単なるノイズでしかないと思っている。もしレビュー修正コミットをするなら、なぜ? なにをしたか? をコミットメッセージにして追加コミットするべきだと思っていた。
>
> ...が 今回の機能説明を見て **レビュー修正は既存のコミットに混ぜ込んでしまうのが一番良さそう** という考え方に変わった。もちろん、そのブランチ開発が他ブランチと繋がりをもっていなければ...という前提ではあるが。(もしそうだと、[[force push (Git)|force push]]できなくなってしまう...)
## Miscelleneous UI changes
UIについて個人的に気になったのはこの4点。他にもスクロールバーの違いなどあるが、その辺は省略している。
![[Pasted image 20240323223424.png]]
あとは、pullやpushがポップアップではなく、ブランチ名の横に表示されるようになったのは地味に良い。並列実行もできるようになったし。
## 総括
今回は非常に大きなリリースだったが、普通に使っているユーザーにはそこまで影響なさそうな気がした。個人的な収穫としては以下だろう。
- ブランチの[[コミットグラフ]]はもう少しキレイにする努力をしてみようと思った
- レビュー指摘修正を[[fixup (Git)|fixup]] or [[amend (Git)|amend]]するという発想がなかった
- [[コミットグラフ]]が色々な箇所で表示されるようになったのが嬉しい
- ~~治安の悪いレインボーブランチプロジェクトだとコミットメッセージが見えなくなりそうだけど~~
- リモートのタグやブランチが削除できるようになったのはかなり便利
- `Ctrl+s`のフィルタ機能を知らなかったので今後は使いこなしていきたい
- 今回のリリースとは直接関係ない (author filterは追加されたが紹介はしていない)