GitButler CLI:GitButler共同創設者 スコット・チャコン

GGitButler
컴퓨터/소프트웨어창업/스타트업AI/미래기술

Transcript

00:00:00ようこそ。Git Butlerをまだ知らない方のために、簡単にデモをします。これは新しいバージョン管理ツールです。
00:00:07数年かけて開発してきました。JJ(Jujutsu)からは、多くの要素を拝借しています。
00:00:10Jujutsuを使っている方がいれば、あなたたちのツールから多くのヒントを得ています。
00:00:16とにかく、Git Butlerを使ったことがない方へ。これはバージョン管理ツールです。
00:00:19基本的にはGUIですが、
00:00:21現在はCLIも開発中で、皆さんはGitに精通しているので、そのCLI機能をお見せしたいと思いました。
00:00:26GitのCLIは興味深いものですが、
00:00:29我々もJujutsuから取り入れたコンセプトをいくつか持っています。
00:00:33しかし、非常にクールな独自の新しい機能もいくつかあります。
00:00:36そこで、もっと面白くするためのアイデアをもらえたらと思い、紹介することにしました。
00:00:40では、順に説明していきます。
00:00:43さて、
00:00:46コマンドラインツールの名前は「but」と言います。
00:00:49ずっと親父ギャグを言ってきたので、この名前は適切かなと思っています。
00:00:52「but status」を実行できます。これは、短いログのようなものです。
00:00:57SaplingやJujutsuのログ機能を使ったことがあるなら、
00:01:00ディスク上で変更されたファイルが表示されるのがわかるでしょう。
00:01:05ワーキングディレクトリからターゲットブランチまでの差分です。
00:01:08しかし、作成したコミットも表示されます。
00:01:11「but status -f」と打てば、各コミットで変更されたファイルを表示できます。
00:01:18Git ButlerのGUIを使っているなら、レーンなどの情報が見えますが、
00:01:23Git ButlerにはGitにはできない素晴らしい機能がたくさんあります。例えば、この見やすいショートログ形式などです。
00:01:29そして、
00:01:30ええと、
00:01:32コミットがローカルかそうでないかを示すログも出せます。これは一般的な
00:01:39ショートログに似ています。
00:01:40また、新しいブランチを作成することもできます。
00:01:44「status」を見ると、今Twitterのクローンを作っています。
00:01:50ブランチがいくつかあり、一方が他方の上に積み重なっています(スタックされています)。
00:01:52これはGitでも「update-ref」を使えば可能ですが、
00:01:56リベース時に参照(refs)を書き換える設定が必要です。
00:02:00しかし、Git Butlerではもっと自然に行えます。
00:02:03自動的に参照を更新し、変更を加えてもリベースがそれを追跡します。
00:02:09さらに、
00:02:11「パラレル(並行)ブランチ」も可能です。複数のブランチを同時に適用できるのです。やってみましょう。
00:02:23新しいブランチを作成して、
00:02:26もう一度実行すると、他のブランチと並行した新しいブランチができました。
00:02:33そのブランチに入って、ファイルの割り当てやコミットを開始できます。
00:02:39次はそれを見てみましょう。
00:02:41もう一つのクールな点は、複数のステージングエリアを持てることです。
00:02:45各スタックに独自のステージングエリアがあります。コマンドは「rub」です。
00:02:51例えば「rub (ファイル名) --to (ブランチ名)」のようにして、このファイルを
00:02:58特定のステージングエリアに割り当てることができます。
00:03:04このように、短いコードが割り当てられます。
00:03:12「これはここに」「これはあそこに」と割り当てられているのがわかります。
00:03:15コミットを実行すれば、これらのブランチに同時にコミットできます。
00:03:21見てみましょう。ここに割り当てられているので、
00:03:27「but commit -o」と入力すると、
00:03:30ここにコミットされます。
00:03:40これでファイルはこのコミットに含まれました。さらに良いのは、これがすべてGitだということです。つまり、
00:03:48こうすれば、
00:03:50実際にGitコミットが作成され、そのブランチをプッシュすることもできます。
00:03:57でも、
00:03:59特定のブランチに割り当てることも、単に「but commit」として未割り当てのものをすべてターゲットに送ることもできます。
00:04:07新しい変更をどのブランチにコミットするか指定できるのです。
00:04:11私たちはこれを「rubbing(こすり合わせる)」と呼ぶことにしました。
00:04:14一晩中飲んでいてここにはいない、Calebという仲間に話したのですが、
00:04:18もし彼が入ってきたら、皆で立ち上がって拍手しましょう。
00:04:21彼が考案したこの「rubbing」という言葉は、基本的に2つのものを組み合わせて、そこから何かを導き出すという意味です。
00:04:28マインクラフトなどのクラフトテーブルを知っていれば、
00:04:32そのコンセプトがわかるはずです。
00:04:34これとこれを合わせることで、新しくて面白いものが生まれる、という具合に。
00:04:38「but rub」コマンドを使って、but CLIでいろいろなものを「こすり合わせる」ことができます。
00:04:45いくつか実演しましょう。未コミットや変更されたファイルをブランチに割り当てるのはお見せしましたね。
00:04:52でも、割り当てを解除することもできます。この「00」という特別なモードを使います。
00:05:01「but rub」と入力して、
00:05:05例えばこのコミット全体を
00:05:07「00」に持っていくと、
00:05:11コミットが取り消されます。実質的に、そのコミットからの「reset --soft」のような動作です。
00:05:17修正(amend)もできます。「rub ...」と入力して、
00:05:24y
00:05:27RV...おっと、老眼鏡が必要ですね。私も年を取りました。
00:05:32SW、あ、失礼、
00:05:3511Wにしましょう。
00:05:38IWですか?ありがとうございます。
00:05:41おっと。
00:05:44それは「I」かな?
00:05:48すみません。
00:06:02そして、
00:06:04そこにコミットされます。
00:06:10「rub I」で、
00:06:14コミット解除もできます。
00:06:16スクワッシュ(統合)も可能です。このコミットとあのコミットをまとめたいなら、「but rub J e GE」とすれば、
00:06:22J e GE
00:06:25それらのコミットが一つにまとまります。コミット解除も、移動も自由自在です。
00:06:32基本的に、2つのものを組み合わせたときに期待される動作が、
00:06:37そのまま実行されます。未割り当ての変更に何かを合わせれば、実質的に元に戻すことになります。
00:06:42実際にこれが動くかどうか、記憶が定かではないのですが……
00:06:48ファイルの移動もできます。やってみましょう。
00:06:53J 8 2
00:07:02すると、
00:07:03特定のコミットからファイルを取り出して、
00:07:07そのコミットからは削除し、その下のコミットに移動させることができます。
00:07:11これが面白いのは、Gitで不可能だからではなく、Gitでやるのが比較的難しいからです。例えば、
00:07:19特定のコミットだけを取り消したり、コミット間でファイルを移動したり、3つ前のコミットにファイルを修正して入れたりすることです。
00:07:27Gitでも一応できます。例えば、
00:07:31一時的なfixupコミットを作ってautosquashを使うといった方法です。
00:07:34しかし、直感的にコンテンツを好きな場所に「こすり合わせる」ように動かせるのは非常に快適です。
00:07:40しかも、複数のブランチを同時に保持したまま。次に、コミットの分割も簡単にできます。「but new」コマンドです。
00:07:43「but new」コマンドを使います。例えば、
00:07:51もしこう入力すれば、
00:07:54「but new」
00:07:56H e、とすると、
00:07:59中身が空の、新しい真っさらなコミットが作成されます。
00:08:03これはJujutsuスタイルですね。空のコミットをまず作ることができます。
00:08:08そして、そこにファイルを「rub」して入れることができます。例えば、
00:08:12このファイルを選んで、
00:08:150
00:08:23これを、
00:08:29新しいコミットに移動させます。それから「describe」で説明を付けます。
00:08:32X U C だったかな。
00:08:45どうすればいいか……
00:08:56「status -f」でファイルを表示します。各コミットに含まれるファイルが見えます。「but st」ではなくて、
00:09:02「but status」はコミットのみを表示し、
00:09:04「but status -f」は中のファイルまで表示するので、「rubbing」で移動させるのに便利です。
00:09:11次は「new」と「describe」、そして最後は「marking(マーキング)」です。これも非常にJJスタイルです。
00:09:16Jujutsuを使っている方ならわかると思いますが、コミットをターゲットとしてマークできます。
00:09:21マークすると、その後の作業はすべてそのコミットに集約されます。これは面白い機能です。
00:09:25やってみましょう。
00:09:29「but new -m」とするか、「but mark」と入力します。
00:09:33「Z a」をマークすると、
00:09:35ここがマークされました。未コミットだったものが、すでに自動的にそのレーンに入ったのがわかります。
00:09:42レーンに入りましたね。
00:09:44そこでコミットすることもできますし、
00:09:47特定のコミットをマークすることもできます。
00:09:56あ、それはブランチでした。失礼。
00:09:58特定のコミットをマークして、例えば「echo new」とすると、
00:10:07その変更が自動的に、そのマークされたコミットに追加されます。
00:10:15これはスタックされたブランチで、複数のコミットがある場合に非常に便利です。今行っていることが、
00:10:21自動的に、スタックされたブランチの3つ下のコミットに修正(amend)として入っていくのです。
00:10:26JJで「jj new」をして作業を開始するのと似ていますね。
00:10:31最後のコミットが自動的に更新され続けるような感覚です。
00:10:33ただ、Git Butlerでは基本的にどのコミットでもマークできます。
00:10:36作業を続けて、そのコミットを更新し続け、好きな時にマークを外せます。
00:10:41いいですよね。
00:10:44以上が、私たちが取り組んでいる面白い機能の一部です。
00:10:48この方法で作業するのは本当に快適だと感じています。
00:10:52もう一つ、JJから拝借したのが「oplog(操作ログ)」です。
00:10:56これはかなり前から実装しています。
00:10:59Git Butlerを使っている方なら、全操作を表示するタブがあるのを見たことがあるでしょう。
00:11:03コマンドを実行するたびに、操作履歴が記録されます。
00:11:06Git Butlerが行ったすべての履歴が見られ、そのどれにでも復元できます。あるいは、
00:11:12単に
00:11:13「undo」と言うこともできます。
00:11:14綴りを間違えなければ、「undo」と打つだけで操作が取り消され、ワーキングディレクトリとステータスが
00:11:20以前の状態に戻ります。もしくは、
00:11:22「restore」を使って
00:11:24任意のハッシュ値(SHA)の状態に戻すこともできます。
00:11:26おっと。
00:11:29そして、
00:11:33ワーキングディレクトリもブランチも、すべてを以前の状態にリセットします。
00:11:38このデモをこの方法でやるのは興味深いですね。なぜなら、うまくいくとわかっているシナリオを作成して、
00:11:44そこまで復元して、もう一度最初からやり直すことができるからです。
00:11:50もちろん、実務でも「やっぱり今のなし」とか「競合してしまった」という時に、
00:11:54元に戻して作業を続けられるのは非常に便利です。
00:11:58さて、以上です。あ、もう一つ。すべてのコマンドがJSON出力をサポートしています。「but -j」
00:12:06または「--json」をつけて実行すれば、同じデータがJSON形式で得られます。
00:12:11スクリプトを書きたい場合、Gitのporcelain出力(機械読み取り用出力)を扱うよりずっと快適です。
00:12:15そのまま読み込んだり、jqに通して特定の項目を探したりと、
00:12:21CLIのスクリプト化がよりスマートに行えます。
00:12:24以上です。ありがとうございました。

Key Takeaway

GitButler CLIは、Gitの堅牢さを維持しつつ、Jujutsu流の柔軟な操作性と直感的なUIを融合させた、次世代の強力なバージョン管理ツールです。

Highlights

GitButlerの共同創設者スコット・チャコン氏による、開発中のCLIツール「but」の紹介

Jujutsu(JJ)やSaplingから着想を得た、直感的で高度なバージョン管理機能の搭載

複数のブランチを同時に適用・操作できる「並行ブランチ」と独自のステージング概念

「but rub」コマンドによる、コミットの結合、分割、ファイルの移動などの柔軟な操作

操作ミスを簡単に取り消せる強力な「oplog(操作ログ)」と「undo」機能の統合

すべてのコマンドがJSON出力をサポートしており、スクリプト作成や自動化が容易

Timeline

GitButler CLIの導入とコンセプト

GitButlerの共同創設者であるスコット・チャコン氏が、新しいバージョン管理ツールのデモを開始します。このツールは数年かけて開発されており、特にJujutsu(JJ)というツールから多くのヒントを得ていることが明かされます。基本的にはGUIとして知られていますが、今回は開発中のコマンドラインインターフェース(CLI)に焦点を当てて紹介します。Gitに精通したユーザーに向けて、既存のワークフローをより面白く、効率的にするための新しいコンセプトを提示しています。独自のクールな機能を追加することで、Gitの限界を超える体験を目指していることが語られます。

基本コマンドとステータス表示

CLIツールの名前は親父ギャグにちなんで「but」と名付けられており、中心となるのは「but status」コマンドです。このコマンドはJujutsuやSaplingのログ機能に似ており、変更されたファイルと作成されたコミットを同時に視認できる短いログ形式を採用しています。「-f」フラグを使用することで、各コミットに含まれる詳細なファイル構成を即座に確認することが可能です。GitButler独自のレーン情報なども反映されており、Git標準のログよりも情報が整理されているのが特徴です。これにより、現在の作業状況をひと目で把握できる高い視認性が提供されています。

スタックされたブランチと並行開発

ここでは、複数のブランチを積み重ねる「スタック」と、それらを同時に適用する「並行ブランチ」の機能が実演されます。Gitでも複雑な設定を行えば同様のことは可能ですが、GitButlerではより自然かつ自動的に参照(refs)が更新される仕組みになっています。具体的には、Twitterのクローン開発を例に、複数のブランチを同時にアクティブにする様子が示されます。これにより、開発者は文脈を切り替えることなく、複数の機能開発を並行して進めることができます。作業中のブランチに自由に入り、ファイルの割り当てやコミットをシームレスに行える点が非常に革新的です。

「but rub」によるコンテンツの柔軟な操作

GitButler CLIの最もユニークな機能の一つである、複数のステージングエリアの管理について説明されます。各スタックが独自のステージング領域を持っており、「rub」コマンドを使用して特定のファイルを特定のブランチに割り当てることができます。この操作は「rubbing(こすり合わせる)」と呼ばれ、2つの要素を組み合わせて新しい状態を導き出すというコンセプトに基づいています。マインクラフトのクラフトテーブルのように、直感的にコンテンツを移動させることが可能です。「but commit」を実行すれば、割り当てられたブランチに対して個別に、あるいは一括でコミットを生成できます。

高度なコミット編集とリセット操作

「but rub」コマンドのさらなる応用として、コミットの取り消しやスクワッシュ(統合)の手順が示されます。「00」という特殊なモードへコミットを移動させることで、実質的に「reset --soft」のような動作を直感的に行えます。また、複数のコミットを指定して一つにまとめたり、特定のコミットからファイルを引き抜いて別のコミットへ移動させたりすることも容易です。これらの操作はGitでも可能ですが、GitButlerでは複雑なリベース手順を必要とせず、コンテンツを好きな場所に動かすだけで完了します。開発者は「fixup」や「autosquash」を意識することなく、快適に履歴を整形できるのが大きな利点です。

Jujutsuスタイルのワークフローとマーキング

「but new」コマンドを使用して、中身が空の新しいコミットを先に作成するJujutsuスタイルのワークフローが紹介されます。作成した空のコミットに対して、後からファイルを「rub」して追加したり、「describe」で説明を付与したりすることが可能です。さらに、「marking(マーキング)」機能を使えば、特定のコミットをターゲットとして固定し、その後の変更を自動的にそのコミットへ集約できます。これにより、スタックの深い位置にあるコミットを修正しながら作業を続けることが非常に簡単になります。どのコミットでも自由にマークし、必要な時にマークを外せる柔軟性が、開発のスピードを加速させます。

操作ログ(oplog)とJSON出力の活用

最後に、すべての操作履歴を記録する「oplog(操作ログ)」と、強力なリカバリ機能について説明されます。「undo」コマンドを打つだけで直前の操作を取り消すことができ、競合が発生した際や誤操作をした際でも即座に以前の状態に復元可能です。さらに、特定のハッシュ値を指定して、ワーキングディレクトリとブランチの両方を過去の任意の時点まで一括で戻すこともできます。また、すべてのコマンドがJSON出力をサポートしているため、jqなどのツールと組み合わせて高度な自動化スクリプトを作成するのにも適しています。Gitの機械読み取り用出力(porcelain)よりも扱いやすく、開発者にとって非常にフレンドリーな設計となっています。

Community Posts

View all posts