<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git on tomo pi jan Ano</title><link>https://anno.one/tags/Git/</link><description>Recent content in Git on tomo pi jan Ano</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><lastBuildDate>Sat, 10 Oct 2026 14:06:12 +0900</lastBuildDate><atom:link href="https://anno.one/tags/Git/index.xml" rel="self" type="application/rss+xml"/><item><title>ブログの記事管理のためのJujutsu</title><link>https://anno.one/post/jj-por-blog-skribanto/</link><pubDate>Sat, 10 Oct 2026 14:06:12 +0900</pubDate><guid>https://anno.one/post/jj-por-blog-skribanto/</guid><description>&lt;p&gt;わたしは記事をmarkdownで記述しているので、普段はGitを使って履歴管理をしています。複数の記事アイデアをとりあえず書き出そうとするとブランチを色々工夫したりいろいろ考えることが多かったのですが、最近Jujutsuという別のバージョン管理ツールを知りました。これがブログの更新フローにとてもよく合っていてすごく嬉しくなったので、コマンドの備忘録とともに紹介しておきたいと思います。&lt;/p&gt;&#10;&lt;p&gt;まあコマンドはここや公式ドキュメントをだいぶ参考にしているので、わかる人はそれらを読めばいいと思います。&lt;/p&gt;&#10;&lt;a href="https://qiita.com/nico4316/items/6122321eacff245a9805" target="_blank" rel="noopener noreferrer" style="padding: 12px;border: solid 1px #eee;display: flex;text-decoration: none;color: inherit;" onMouseOver="this.style.opacity='0.9'"&gt;&lt;div style="margin-left: 10px;"&gt;&#10; &lt;h2 style="margin: 0;padding-bottom: 4px;border: none;font-size: 16px;"&gt;Jujutsu（jj）入門：概念・導入・最小運用とチートシート（Gitユーザー向け） - Qiita&lt;/h2&gt;&#10; &lt;p style="margin: 0;padding-bottom: 9px;font-size: 12px;color: #888;"&gt;https://qiita.com/nico4316/items/6122321eacff245a9805&lt;/p&gt;&#10; &lt;p style="margin: 0;font-size: 13px;word-break: break-word;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;"&gt;新時代のバージョン管理ツールとして最近jujutsuに関心を持ちました。 自分用にjjの概念、導入方法及びチートシートをまとめました。 jjとは Rust製のバージョン管理ツールで、Google所属のmartinvonz氏が開発しました。ざっくりいうとgitをラップできる...&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;h2 id="jujutsuのいいところ"&gt;Jujutsuのいいところ&#10;&lt;/h2&gt;&lt;p&gt;Jujutsu(以下jj)がGitと大きく違うところ、というと色々あるんだとは思いますが、個人的には「変更履歴の枝分かれとブランチが直接紐付かない」こと、「コミット(jjではChange)の分割・統合・Rebaseがかんたん」ということが挙げられます。&lt;/p&gt;&#10;&lt;p&gt;ブログの記事を書こうとすると、関連する話題の記事アイデアが出たり、別の記事の増補もしたくなったり、またバックエンド側や外観の変更もしたくなったり、色々とやりたいことが出てきます（よね？）&lt;/p&gt;&#10;&lt;p&gt;そういうときにGitだと、一旦変更をStashして脇において作業したり（そしてそのStashを忘れたり）、記事アイデアのぶんだけブランチを切ったり、最新の変更に追いつくためにRebaseをかけたり、「ただ記事を書きたい」ということに対してやるべきことがちょっと多いと感じていました。あと、コマンドがちょっとわかりにくい……。&lt;/p&gt;&#10;&lt;p&gt;Jujutsuだと、あるChangeから一つ進んだChangeを何本でも生やすことができるし、それらにブランチと紐付かせる必要がありません。ブランチが必要な場面が個人的には1つ減りました。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="ブランチを切ることなく、いろんな枝を生やすことができます" class="gallery-image" data-flex-basis="761px" data-flex-grow="317" data-title-escaped="ターミナルのスクリーンショット。jj logで現在の変更履歴ツリーを表示している。masterのbookmarkがついたあるChangeからChangeが3本枝分かれしている" height="204" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://anno.one/post/jj-por-blog-skribanto/jj1.webp" title="ターミナルのスクリーンショット。jj logで現在の変更履歴ツリーを表示している。masterのbookmarkがついたあるChangeからChangeが3本枝分かれしている" width="647"&gt;&lt;/p&gt;&#10;&lt;p&gt;上の画像だと、あるChangeから書きかけ記事のChangeが3つ伸びています。この中で一つ記事を書いたら、それにbookmarkとしてmaster（Gitのブランチに相当）をつけてあげれば、リモートの方にも同期されてNetlify経由でデプロイされます。jjではコミットという概念もないので、Changeという変更を入れる箱をつくってあげれば、あとは記事を書いて保存するだけで変更が追従します。&lt;/p&gt;&#10;&lt;p&gt;なんか筆が乗っちゃって複数の記事が1つのChangeにできちゃった！というときも大丈夫。&lt;code&gt;jj split&lt;/code&gt;コマンドでChangeを任意の数に分割できます。何を分割Changeで取り込むのかの選択画面もとてもわかりやすいです。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="jj splitをしたところ。Spaceで選択してcキーを押したらその変更だけを取り込んだChangeを作れます。もちろん行単位で変更を分割することもできます" class="gallery-image" data-flex-basis="3399px" data-flex-grow="1416" height="67" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://anno.one/post/jj-por-blog-skribanto/jj2.webp" srcset="https://anno.one/post/jj-por-blog-skribanto/jj2_hu_530f87c6c65c38e.webp 800w, https://anno.one/post/jj-por-blog-skribanto/jj2.webp 949w" width="949"&gt;&lt;/p&gt;&#10;&lt;p&gt;この辺のコマンドは下の記事がわかりやすいです。&lt;/p&gt;&#10;&lt;a href="https://zenn.dev/zetamatta/books/c1e309aea68960/viewer/06_split" target="_blank" rel="noopener noreferrer" style="padding: 12px;border: solid 1px #eee;display: flex;text-decoration: none;color: inherit;" onMouseOver="this.style.opacity='0.9'"&gt;&lt;div style="flex-shrink: 0;"&gt;&#10; &lt;img src="https://res.cloudinary.com/zenn/image/upload/s--hfG3NAbf--/g_center%2Ch_280%2Cl_fetch:aHR0cHM6Ly9zdGF0aWMuemVubi5zdHVkaW8vdXNlci11cGxvYWQvYm9va19jb3Zlci82M2JlODUzZWEwLnBuZw==%2Cw_200/v1627283836/default/og-base-book_yz4z02.jpg?_a=BACMTiAE" alt="" width="100" height="100"&gt;&#10; &lt;/div&gt;&lt;div style="margin-left: 10px;"&gt;&#10; &lt;h2 style="margin: 0;padding-bottom: 4px;border: none;font-size: 16px;"&gt;チェンジの分割｜君のレポジトリを領域展開 - 次世代バージョン管理システム Jujutsu (jj-vcs/jj)の世界&lt;/h2&gt;&#10; &lt;p style="margin: 0;padding-bottom: 9px;font-size: 12px;color: #888;"&gt;https://zenn.dev/zetamatta/books/c1e309aea68960/viewer/06_split&lt;/p&gt;&#10; &lt;p style="margin: 0;font-size: 13px;word-break: break-word;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 3;overflow: hidden;"&gt;&lt;/p&gt;&#10; &lt;/div&gt;&#10; &lt;/a&gt;&#10;&lt;p&gt;そんな感じで、自分が記事を管理するのにとてもストレスがなく使うことができて嬉しい限りです。しばらく使ってみようと思います。&lt;/p&gt;&#10;&lt;h2 id="jjコマンド個人的チートシート"&gt;jjコマンド個人的チートシート&#10;&lt;/h2&gt;&lt;p&gt;自分が記事を書いてpushするまでによく使っているもの、使いそうなものを流れのままにメモしていきます。&lt;/p&gt;&#10;&lt;h3 id="jj-git-init---colocate"&gt;&lt;code&gt;jj git init --colocate&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;jjを使い始めるときのコマンドです。特に、すでにあるGitリポジトリで使いたいときや、jjとGitリポジトリを同時に作成したいときに使用します。&#10;jjだけ使いたいときは&lt;code&gt;jj git init .&lt;/code&gt;でいいはず。でもGithub連携とかを考えるとまだこれを使うときではないかもしれない。&lt;/p&gt;&#10;&lt;h3 id="jj-git-clone-url"&gt;&lt;code&gt;jj git clone &amp;lt;URL&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;Gitリポジトリをcloneしつつjjも使いたいときに使います。まだ使ったことはない（他人のリポジトリをいじる機会がないですからね）&lt;/p&gt;&#10;&lt;h3 id="jj-log"&gt;&lt;code&gt;jj log&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;jjのchangeツリーを表示します。jj initしたらとりあえずこれをして現状を確認してみるのがいいかも。jjで新たについたchange番号は色々と使います。基本的には最新数件の他に枝分かれがあるところのみが表示されるので、長い履歴を表示するのに&lt;code&gt;jj log -n &amp;lt;NUMBER&amp;gt;&lt;/code&gt;で件数指定できることも覚えておくといいかもしれません。&lt;/p&gt;&#10;&lt;h3 id="jj-edit-change"&gt;&lt;code&gt;jj edit &amp;lt;CHANGE&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;CHANGE&lt;/code&gt;のchange番号に移動して編集を始めます。すでにリモートリポジトリにpushされているchangeについてはロックされている(immutable)ので、どうしても変更したいときは&lt;code&gt;--ignore-immutable&lt;/code&gt;オプションが必要です。jjはchange番号を省略できて、&lt;code&gt;jj log&lt;/code&gt;で表示されたchange番号のうち、色がついているところさえ書いておけばchangeを指定できます。長いchangeログがあってもせいぜい3文字しか入力することはないはず。&lt;/p&gt;&#10;&lt;h3 id="jj-new-change"&gt;&lt;code&gt;jj new &amp;lt;CHANGE&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;CHANGE&lt;/code&gt;のchange番号から始まるchangeを新しく作成します。&lt;/p&gt;&#10;&lt;h3 id="jj-new-bookmark"&gt;&lt;code&gt;jj new &amp;lt;BOOKMARK&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;BOOKMARK&lt;/code&gt; (Gitでいうブランチ)から新たにchangeを作成します。&lt;code&gt;jj new main&lt;/code&gt;とかしておけばメインブランチにすぐ生やせるので楽。ちなみに&lt;code&gt;jj new&lt;/code&gt;だけだと今編集しているchangeから新たにchangeを作成します。&lt;/p&gt;&#10;&lt;h3 id="jj-status"&gt;&lt;code&gt;jj status&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;git status&lt;/code&gt;に相当します。どこが編集されているのか確認できます。&lt;/p&gt;&#10;&lt;h3 id="jj-diff"&gt;&lt;code&gt;jj diff&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;こちらも変更確認用。現在のchangeと直前のchangeでの変更の差分を取ります。指定したchangeとの差分を取りたいときは&lt;code&gt;jj diff -f &amp;lt;CHANGE1&amp;gt; -t &amp;lt;CHANGE2&amp;gt;&lt;/code&gt;とすれば2つのchangeの差分を比較できます。こういうときに横並びで表示してほしいですけどそういうプラグインとかあるのかな。&lt;/p&gt;&#10;&lt;h3 id="jj-desc--m-desc"&gt;&lt;code&gt;jj desc -m &amp;quot;&amp;lt;DESC&amp;gt;&amp;quot;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;changeに説明文をつけます。Gitでいうコミットメッセージに相当します。何回でも書き直せるので便利。&lt;/p&gt;&#10;&lt;h3 id="jj-bookmark-create-bookmark"&gt;&lt;code&gt;jj bookmark create &amp;lt;BOOKMARK&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;新たに&lt;code&gt;BOOKMARK&lt;/code&gt;のbookmarkを現在のchangeにつくります。このとき、リモートリポジトリには何も影響しません。リモートリポジトリに紐付けたいときは&lt;code&gt;jj bookmark track &amp;lt;BOOKMARK&amp;gt;&lt;/code&gt;を使用します。&lt;/p&gt;&#10;&lt;h3 id="jj-bookmark-set-bookmark--r-change"&gt;&lt;code&gt;jj bookmark set &amp;lt;BOOKMARK&amp;gt; -r &amp;lt;CHANGE&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;CHANGE&lt;/code&gt;で指定したchangeに&lt;code&gt;BOOKMARK&lt;/code&gt;を付与します。jjではchangeを作成してもbookmarkの位置は変わらないので、これで明示的にどこが指定されているかを示してあげます。&lt;/p&gt;&#10;&lt;h3 id="jj-git-push---bookmark-bookmark"&gt;&lt;code&gt;jj git push --bookmark &amp;lt;BOOKMARK&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;指定のbookmarkをリモートリポジトリにpushします。&lt;code&gt;--bookmark &amp;lt;BOOKMARK&amp;gt;&lt;/code&gt;を省略したときは、現在のchangeがpushされる……はず（やったことない）。これをすると、bookmarkがついているchangeの直後に新しいchangeが作成されます。次の変更はここをいじればOK。&lt;/p&gt;&#10;&lt;h3 id="jj-abandon-change"&gt;&lt;code&gt;jj abandon &amp;lt;CHANGE&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;指定のchangeを削除します。Gitから移行したときはなんか謎のchangeとかがあったりする（するよね？）ので、rebaseなどを使って整理しますが、これは最終手段。&lt;/p&gt;&#10;&lt;h3 id="jj-op-undo"&gt;&lt;code&gt;jj op undo&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;直前の操作を取り消します。操作履歴がしっかり残っているほか、Gitよりも柔軟に手戻りができます。&lt;/p&gt;&#10;&lt;h3 id="jj-split"&gt;&lt;code&gt;jj split&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;上にも書きましたが、1つのchangeを分割して複数のchangeを作れます。わたしみたいにあっちこっち色々編集しちゃう人には必須のコマンド。&lt;/p&gt;&#10;&lt;h3 id="jj-rebase--r-change1--d-change2"&gt;&lt;code&gt;jj rebase -r &amp;lt;CHANGE1&amp;gt; -d &amp;lt;CHANGE2&amp;gt;&lt;/code&gt;&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;CHANGE1&lt;/code&gt;のchangeの親を&lt;code&gt;CHANGE2&lt;/code&gt;に変更します。&lt;code&gt;jj split&lt;/code&gt;したときは、分割したchangeが数珠つなぎになっているので、もし親子関係を変更したいときはこれを使っています（なんか他にもいいコマンドがありそうだけど）。&lt;/p&gt;&#10;&lt;p&gt;とりあえずこんなものでしょうか。changeをまとめる&lt;code&gt;jj squash&lt;/code&gt;とか、同じファイルに施した複数のchangeをいい感じにまとめてくれる&lt;code&gt;jj absorb&lt;/code&gt;とかも便利そうなのですが、現在のところ使う出番がありませんでしたので、ここには入れていません。もうちょっとプログラムファイル向きの機能かなと思います。&lt;/p&gt;&#10;</description></item></channel></rss>