[{"data":1,"prerenderedAt":697},["ShallowReactive",2],{"/ja-jp/blog/what-s-new-in-git-2-50-0/":3,"navigation-ja-jp":33,"banner-ja-jp":447,"footer-ja-jp":459,"Justin Tobler":669,"next-steps-ja-jp":682},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"seo":8,"content":11,"config":22,"_id":26,"_type":27,"title":28,"_source":29,"_file":30,"_stem":31,"_extension":32},"/ja-jp/blog/what-s-new-in-git-2-50-0","blog",false,"",{"noIndex":6,"title":9,"description":10},"Git 2.50.0の新機能","git-diff-pairs(1)コマンドや、参照の一括更新を行うためのgit-rev-list(1)オプションなど、GitLabのGitチームとGitコミュニティによるコントリビュートをご紹介します。",{"title":9,"description":10,"authors":12,"heroImage":14,"body":15,"date":16,"category":17,"tags":18},[13],"Justin Tobler","https://res.cloudinary.com/about-gitlab-com/image/upload/v1749663087/Blog/Hero%20Images/git3-cover.png","Gitプロジェクトは最近、[Gitバージョン2.50.0](https://lore.kernel.org/git/xmqq1prj1umb.fsf@gitster.g/T/#u)をリリースしました。今回のリリースの注目すべきポイントをいくつかご紹介します。これには、GitLabのGitチームやより広範なGitコミュニティからのコントリビュートも含まれています。\n## 新しいgit-diff-pairs(1)コマンド\n\n差分は、すべてのコードレビューの中心となるもので、2つのリビジョン間で行われた\nすべての変更を表示します。GitLabでは、さまざまな場所で差分が表示されますが、最も\n一般的なのはマージリクエストの[「変更」タブ](https://docs.gitlab.com/user/project/merge_requests/changes/)です。\nその裏側では、差分の生成に[`git-diff(1)`](https://git-scm.com/docs/git-diff)が\n使われています。たとえば、以下のように使います。\n\n```shell\n$ git diff HEAD~1 HEAD\n```\n\nこのコマンドは、変更されたすべてのファイルの完全な差分を返します。ただし、リビジョン間で変更されたファイル数が非常に多い場合、スケーラビリティの課題が生じる可能性があります。GitLabのバックエンドでは、コマンドが自己設定されたタイムアウトに達してしまうこともあります。変更数が多い場合、\n差分の計算をより小さく扱いやすい単位に分割できる方法があれば、より効果的です。\n\nこの課題を解決する1つの方法は、\n[`git-diff-tree(1)`](https://git-scm.com/docs/git-diff-tree)を使って、\n変更されたすべてのファイルに関する情報を取得することです。\n\n```shell\n$ git diff-tree -r -M --abbrev HEAD~ HEAD\n:100644 100644 c9adfed339 99acf81487 M      Documentation/RelNotes/2.50.0.adoc\n:100755 100755 1047b8d11d 208e91a17f M      GIT-VERSION-GEN\n```\n\nGitはこの出力を[「raw」フォーマット](https://git-scm.com/docs/git-diff-tree#_raw_output_format)と呼んでいます。\n簡単に言えば、出力の各行にはファイルのペアと、\nそれらの間で何が変更されたかを示すメタデータが表示されます。大規模な変更に対して\n「パッチ」形式の出力を生成する方法と比べて、\nこの処理は比較的高速な上、すべての変更の概要を把握できます。また、このコマンドでは、`-M`フラグを付けることでリネーム検出を有効にし、変更がファイルのリネームによるものかどうかを判別することもできます。\n\nこの情報を使えば、`git-diff(1)`を使って各ファイルペアの差分を\n個別にコンピューティングすることができます。たとえば、以下のようにblob IDを\n直接指定することも可能です。\n\n```shell\n$ git diff 1047b8d11de767d290170979a9a20de1f5692e26 208e91a17f04558ca66bc19d73457ca64d5385f\n```\n\nこの処理は、各ファイルペアごとに繰り返すことができますが、\n個別のファイル差分ごとにGitプロセスを立ち上げるのは、あまり効率的ではありません。\nさらに、blob IDを使った場合、変更ステータスやファイルモードといった、\n親ツリーオブジェクトに格納されているコンテキスト情報が差分から失われてしまいます。\n本当に必要なのは、「raw」なファイルペア情報を元に、\n対応するパッチ出力を生成する仕組みです。\n\nバージョン2.50から、Gitに新しい組み込みコマンド\n[`git-diff-pairs(1)`](https://git-scm.com/docs/git-diff-pairs)が追加されました。このコマンドは、\n標準入力（stdin）から「raw」形式のファイルペア情報を受け取り、どのパッチを出力すべきかを正確に判断します。以下の例は、\nこのコマンドの使用方法を示しています。\n\n```shell\n$ git diff-tree -r -z -M HEAD~ HEAD | git diff-pairs -z\n```\n\nこのように使用した場合、出力結果は`git-diff(1)`を使った場合と同じになります。\nパッチ出力を生成する専用コマンドを分けることで、\n`git-diff-tree(1)`から得られた「raw」出力を、より小さなファイルペアのバッチに分割し、それぞれを別々の\n`git-diff-pairs(1)`プロセスにフィードすることができます。これにより、差分を一度にすべてコンピューティングする必要がなくなるため、\n先に挙げたスケーラビリティの課題が解決されます。今後のGitLabリリースでは、\nこの仕組みの応用により、\n特に変更量が多い場合における差分生成のパフォーマンス向上が\n期待されます。この変更についての詳細は、該当する\n[メーリングリストのスレッド](https://lore.kernel.org/git/20250228213346.1335224-1-jltobler@gmail.com/)をご覧ください。\n\n_このプロジェクトは[Justin Tobler](https://gitlab.com/justintobler)が主導しました。_\n\n## 参照更新の一括処理\n\nGitには、参照を更新するための[`git-update-ref(1)`](https://git-scm.com/docs/git-update-ref)\nコマンドが用意されています。このコマンドを`--stdin`フラグとともに使用すると、\n複数の参照を1つのトランザクションとしてまとめて更新できます。\nこれを行うには、各参照更新の指示を標準入力（stdin）で指定します。\nこの方法で参照を一括更新すると、アトミックな動作も実現できます。つまり、1つでも参照の更新に失敗した場合、\nトランザクション全体が中断され、\nどの参照も更新されません。以下は、この動作を示す例です。\n\n```shell\n# 3つの空のコミットと「foo」という名前のブランチを持つリポジトリを作成する\n$ git init\n$ git commit --allow-empty -m 1\n$ git commit --allow-empty -m 2\n$ git commit --allow-empty -m 3\n$ git branch foo\n\n# コミットIDを出力する\n$ git rev-list HEAD\ncf469bdf5436ea1ded57670b5f5a0797f72f1afc\n5a74cd330f04b96ce0666af89682d4d7580c354c\n5a6b339a8ebffde8c0590553045403dbda831518\n\n# トランザクションで新しい参照を作成し、既存の参照を更新しようとします。\n# 指定された古いオブジェクトIDが一致しないため、更新は失敗することが予想されます。\n$ git update-ref --stdin \u003C\u003CEOF\n> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n> EOF\nfatal: cannot lock ref 'refs/heads/foo': is at cf469bdf5436ea1ded57670b5f5a0797f72f1afc but expected 5a74cd330f04b96ce0666af89682d4d7580c354c\n\n# 「bar」リファレンスは作成されませんでした。\n$ git switch bar\nfatal: invalid reference: bar\n```\n\n多くの参照を個別に更新する場合と比べて、一括で更新するほうがはるかに効率的です。\nこの方法は基本的にうまく機能しますが、\n一括更新による効率面のメリットを優先するために、\nリクエストされた参照更新の一部が失敗することを許容したい場合も\nあります。\n\n今回のリリースで、`git-update-ref(1)`に新しく`--batch-updates`オプションが追加されました。\nこのオプションを使用すると、1つ以上の参照更新が失敗しても、処理を続行できるようになります。\nこのモードでは、個々の失敗が次の形式で出力されます。\n\n```text\nrejected SP (\u003Cold-oid> | \u003Cold-target>) SP (\u003Cnew-oid> | \u003Cnew-target>) SP \u003Crejection-reason> LF\n```\n\nこれにより、成功した参照の更新はそのまま進行しつつ、どの更新が拒否されたのか、\nまたその理由についての情報も得ることができます。前の例と同じリポジトリを\n使った例は以下のとおりです。\n\n```shell\n# トランザクションで新しい参照を作成し、既存の参照を更新しようとします。\n$ git update-ref --stdin --batch-updates \u003C\u003CEOF\n> create refs/heads/bar cf469bdf5436ea1ded57670b5f5a0797f72f1afc\n> update refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c\n> EOF\nrejected refs/heads/foo 5a6b339a8ebffde8c0590553045403dbda831518 5a74cd330f04b96ce0666af89682d4d7580c354c incorrect old value provided\n\n# 「foo」への更新が拒否されたにもかかわらず、「bar」参照が作成されました。\n$ git switch bar\nSwitched to branch 'bar'\n```\n\n今回は`--batch-updates`オプションを使用したことで、\n更新処理が失敗しても参照の作成は成功しました。この一連のパッチは、\n`git-fetch(1)`や`git-receive-pack(1)`における今後の一括参照更新時の\nパフォーマンス改善の基盤となります。詳細については、該当する\n[メーリングリストのスレッド](https://lore.kernel.org/git/20250408085120.614893-1-karthik.188@gmail.com/)をご覧ください。\n\n_このプロジェクトは、[Karthik Nayak](https://gitlab.com/knayakgl)が主導しました。_\n\n## git-cat-file(1)の新しいフィルタオプション\n\n[`git-cat-file(1)`](https://git-scm.com/docs/git-cat-file)を使うと、\nリポジトリ内に含まれるすべてのオブジェクトの情報を\n`--batch–all-objects`オプションで出力できます。たとえば、以下のように実行します。\n\n```shell\n# シンプルなリポジトリを設定します。\n$ git init\n$ echo foo >foo\n$ git add foo\n$ git commit -m init\n\n# 到達不能なオブジェクトを作成します。\n$ git commit --amend --no-edit\n\n# git-cat-file(1)を使用して、到達不能なオブジェクトを含むすべてのオブジェクトに関する情報を出力します。\n$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)'\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\ntree 205f6b799e7d5c2524468ca006a0131aa57ecce7\nblob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n```\n\n状況によっては、リポジトリ内のすべてのオブジェクトを検索し、\n特定の属性に基づいて一部のオブジェクトだけを出力したい場合があります。\nたとえば、コミットオブジェクトだけを表示したいときは、\n`grep(1)`を使って以下のように実行できます。\n\n```shell\n$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)' | grep ^commit\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n```\n\nこの方法でも目的は達成できますが、出力のフィルタリングには欠点があります。\nそれは、`git-cat-file(1)`が\nユーザーが関心を持っていないオブジェクトも含め、リポジトリ内のすべてのオブジェクトをたどらなければならない点です。これはかなり非効率です。\n\n今回のリリースでは、`git-cat-file(1)`に`--filter`オプションが追加され、\n指定した条件に一致するオブジェクトだけを表示できるようになりました。これは`git-rev-list(1)`にある同名のオプションと似ていますが、\n対応しているフィルターの種類はその一部に限られています。\n対応しているフィルターは`blob:none`、`blob:limit=`および\n`object:type=`です。先ほどの例と同様に、オブジェクトはGitを使用して直接\n種類でフィルタリングできます。\n\n```shell\n$ git cat-file --batch-all-objects --batch-check='%(objecttype) %(objectname)' --filter='object:type=commit'\ncommit 0b07e71d14897f218f23d9a6e39605b466454ece\ncommit c999f781fd7214b3caab82f560ffd079ddad0115\n```\n\nGitに処理を任せられるのは便利なだけでなく、オブジェクト数の多い大規模なリポジトリにおいては\n効率面のメリットも期待できます。\nリポジトリにビットマップインデックスがある場合、\nGitが特定の種類のオブジェクトを効率的に検索できるようになり、パックファイル全体をスキャンする必要がなくなるため、\n処理速度が大幅に向上します。\n[Chromiumリポジトリ](https://github.com/chromium/chromium.git)で行われた\nベンチマークでは、こうした最適化による大きな改善が確認されています。\n\n```text\nBenchmark 1: git cat-file --batch-check --batch-all-objects --unordered --buffer --no-filter Time (mean ± σ):     82.806 s ±  6.363 s    [User: 30.956 s, System: 8.264 s] Range (min … max):   73.936 s … 89.690 s    10 runs\nBenchmark 2: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tag Time (mean ± σ):      20.8 ms ±   1.3 ms    [User: 6.1 ms, System: 14.5 ms] Range (min … max):    18.2 ms …  23.6 ms    127 runs\nBenchmark 3: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=commit Time (mean ± σ):      1.551 s ±  0.008 s    [User: 1.401 s, System: 0.147 s] Range (min … max):    1.541 s …  1.566 s    10 runs\nBenchmark 4: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tree Time (mean ± σ):     11.169 s ±  0.046 s    [User: 10.076 s, System: 1.063 s] Range (min … max):   11.114 s … 11.245 s    10 runs\nBenchmark 5: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=blob Time (mean ± σ):     67.342 s ±  3.368 s    [User: 20.318 s, System: 7.787 s] Range (min … max):   62.836 s … 73.618 s    10 runs\nBenchmark 6: git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=blob:none Time (mean ± σ):     13.032 s ±  0.072 s    [User: 11.638 s, System: 1.368 s] Range (min … max):   12.960 s … 13.199 s    10 runs\nSummary git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tag 74.75 ± 4.61 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=commit 538.17 ± 33.17 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=tree 627.98 ± 38.77 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=blob:none 3244.93 ± 257.23 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --filter=object:type=blob 3990.07 ± 392.72 times faster than git cat-file --batch-check --batch-all-objects --unordered --buffer --no-filter ```\n\n興味深いことに、これらの結果からは、処理時間がパックファイル内の総オブジェクト数ではなく、\n指定された種類のオブジェクト数に比例して増減することが示されています。\n元のメーリングリストのスレッドは、\n[こちら](https://lore.kernel.org/git/20250221-pks-cat-file-object-type-filter-v1-0-0852530888e2@pks.im/)でご覧いただけます。\n\n_このプロジェクトは[Patrick Steinhardt](https://gitlab.com/pks-gitlab)が主導しました。_\n\n## バンドル生成時のパフォーマンスが向上\n\nGitには、指定した参照とそれに関連する到達可能なオブジェクトを含むリポジトリのアーカイブを生成する機能があります。\n具体的には、\n[`git-bundle(1)`](https://git-scm.com/docs/git-bundle)コマンドを使用します。この操作は、\nGitLabがリポジトリのバックアップを作成する際や、\n[バンドルURI](https://git-scm.com/docs/bundle-uri)メカニズムの一部としても使用されます。\n\n何百万もの参照を含む大規模なリポジトリでは、\nこの操作に数時間から数日かかることもあります。たとえば、GitLabのメインリポジトリ\n（[gitlab-org/gitlab](https://gitlab.com/gitlab-org/gitlab)）では、\nバックアップに約48時間を要していました。調査の結果、バンドルに重複した参照が含まれないようにチェックする処理において、\nパフォーマンスのボトルネックが存在することが判明しました。\nこの実装では、すべての参照をイテレーションして比較するために入れ子の`for`loopが使われており、\n時間計算量はO(N^2)となっていました。これは、\nリポジトリ内の参照数が増えるほど、処理性能が大きく低下する構造です。\n\n今回のリリースでは、この問題に対応し、\nネストされたloopをマップ型のデータ構造に置き換えることで、処理速度が大幅に向上しました。以下は、\n10万件の参照を含むリポジトリでバンドルを作成した際のパフォーマンス改善を\n示すベンチマーク結果です。\n\n```text\nBenchmark 1: bundle (refcount = 100000, revision = master) Time (mean ± σ):     14.653 s ±  0.203 s    [User: 13.940 s, System: 0.762 s] Range (min … max):   14.237 s … 14.920 s    10 runs\nBenchmark 2: bundle (refcount = 100000, revision = HEAD) Time (mean ± σ):      2.394 s ±  0.023 s    [User: 1.684 s, System: 0.798 s] Range (min … max):    2.364 s …  2.425 s    10 runs\nSummary bundle (refcount = 100000, revision = HEAD) ran 6.12 ± 0.10 times faster than bundle (refcount = 100000, revision = master) ```\n\n詳しくは、\n[GitLabがリポジトリのバックアップ時間を48時間から41分に短縮した方法](https://about.gitlab.com/blog/how-we-decreased-gitlab-repo-backup-times-from-48-hours-to-41-minutes/)を紹介するブログ記事をご覧ください。\n元のメーリングリストのスレッドは\n[こちら](https://lore.kernel.org/git/20250401-488-generating-bundles-with-many-references-has-non-linear-performance-v1-0-6d23b2d96557@gmail.com/)でご覧いただけます。\n\n_このプロジェクトは[Karthik Nayak](https://gitlab.com/knayakgl)が主導しました。_\n\n## バンドルURIのアンバンドルの改善\n\nGitの[バンドルURI](https://git-scm.com/docs/bundle-uri)メカニズムは、\nフェッチするバンドルの場所をクライアントに提供することで、クローンやフェッチの速度を\n向上させることを目的としています。クライアントがバンドルをダウンロードすると、\n`refs/heads/*`以下の参照が、その関連オブジェクトとともにバンドルから\nリポジトリにコピーされます。バンドルには`refs/tags/*`のように\n`refs/heads/*`以外の参照も含まれていることがありますが、\nこれらはクローン時にバンドルURIを使用する場合、単に無視されていました。\n\nGit 2.50ではこの制限が解除され、\nダウンロードされたバンドルに含まれる`refs/*`に一致するすべての参照がコピーされるようになりました。\nこの機能を実装した[Scott Chacon](https://github.com/schacon)さんは、\n[gitlab-org/gitlab-foss](https://gitlab.com/gitlab-org/gitlab-foss)をクローンした際の\n挙動の違いを紹介しています。\n\n```shell\n$ git-v2.49 clone --bundle-uri=gitlab-base.bundle https://gitlab.com/gitlab-org/gitlab-foss.git gl-2.49\nCloning into 'gl2.49'...\nremote: Enumerating objects: 1092703, done.\nremote: Counting objects: 100% (973405/973405), done.\nremote: Compressing objects: 100% (385827/385827), done.\nremote: Total 959773 (delta 710976), reused 766809 (delta 554276), pack-reused 0 (from 0)\nReceiving objects: 100% (959773/959773), 366.94 MiB | 20.87 MiB/s, done.\nResolving deltas: 100% (710976/710976), completed with 9081 local objects.\nChecking objects: 100% (4194304/4194304), done.\nChecking connectivity: 959668, done.\nUpdating files: 100% (59972/59972), done.\n\n$ git-v2.50 clone --bundle-uri=gitlab-base.bundle https://gitlab.com/gitlab-org/gitlab-foss.git gl-2.50\nCloning into 'gl-2.50'...\nremote: Enumerating objects: 65538, done.\nremote: Counting objects: 100% (56054/56054), done.\nremote: Compressing objects: 100% (28950/28950), done.\nremote: Total 43877 (delta 27401), reused 25170 (delta 13546), pack-reused 0 (from 0)\nReceiving objects: 100% (43877/43877), 40.42 MiB | 22.27 MiB/s, done.\nResolving deltas: 100% (27401/27401), completed with 8564 local objects.\nUpdating files: 100% (59972/59972), done.\n```\n\nこれらの結果を比較すると、Git 2.50はバンドル展開後に43,887個（40.42 MiB）のオブジェクトをフェッチしているのに対し、\nGit 2.49は合計で959,773個（366.94 MiB）のオブジェクトをフェッチしています。\nGit 2.50では、取得されるオブジェクト数が約95%、\nデータ量が約90%削減されており、クライアントとサーバーの双方にとってメリットがあります。\nサーバー側ではクライアントに送信するデータ量が大幅に減り、\nクライアント側でもダウンロードおよび展開するデータが少なくて済みます。Chaconさんの提供した例では、\nこれによって処理速度が25%向上しました。\n\n詳細については、\n該当する[メーリングリストのスレッド](https://lore.kernel.org/git/pull.1897.git.git.1740489585344.gitgitgadget@gmail.com/)をご覧ください。\n\n_この一連のパッチは、[Scott Chacon](https://github.com/schacon)さんによって提供されました。_\n\n## 詳細はこちら\n\n本記事でご紹介したのは、最新リリースにおいてGitLabと広範なGitコミュニティによって行われた\nコントリビュートのごく一部にすぎません。Gitプロジェクトの[公式リリースのお知らせ](https://lore.kernel.org/git/xmqq1prj1umb.fsf@gitster.g/)では、\nさらに詳しい情報をご覧になれます。また、\n[以前のGitリリースのブログ記事](https://about.gitlab.com/blog/tags/git/)もぜひご覧ください。GitLabチームメンバーによる過去の主なコントリビュートをご確認いただけます。\n","2025-06-16","open-source",[19,20,21],"git","open source","community",{"featured":23,"template":24,"slug":25},true,"BlogPost","what-s-new-in-git-2-50-0","content:ja-jp:blog:what-s-new-in-git-2-50-0.yml","yaml","What S New In Git 2 50 0","content","ja-jp/blog/what-s-new-in-git-2-50-0.yml","ja-jp/blog/what-s-new-in-git-2-50-0","yml",{"_path":34,"_dir":35,"_draft":6,"_partial":6,"_locale":7,"data":36,"_id":443,"_type":27,"title":444,"_source":29,"_file":445,"_stem":446,"_extension":32},"/shared/ja-jp/main-navigation","ja-jp",{"logo":37,"freeTrial":42,"sales":47,"login":52,"items":57,"search":387,"minimal":421,"duo":434},{"config":38},{"href":39,"dataGaName":40,"dataGaLocation":41},"/ja-jp/","gitlab logo","header",{"text":43,"config":44},"無料トライアルを開始",{"href":45,"dataGaName":46,"dataGaLocation":41},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com&glm_content=default-saas-trial/","free trial",{"text":48,"config":49},"お問い合わせ",{"href":50,"dataGaName":51,"dataGaLocation":41},"/ja-jp/sales/","sales",{"text":53,"config":54},"サインイン",{"href":55,"dataGaName":56,"dataGaLocation":41},"https://gitlab.com/users/sign_in/","sign in",[58,102,200,205,309,369],{"text":59,"config":60,"cards":62,"footer":85},"プラットフォーム",{"dataNavLevelOne":61},"platform",[63,69,77],{"title":59,"description":64,"link":65},"最も包括的かつAIで強化されたDevSecOpsプラットフォーム",{"text":66,"config":67},"プラットフォームを詳しく見る",{"href":68,"dataGaName":61,"dataGaLocation":41},"/ja-jp/platform/",{"title":70,"description":71,"link":72},"GitLab Duo（AI）","開発のすべてのステージでAIを活用し、ソフトウェアをより迅速にビルド",{"text":73,"config":74},"GitLab Duoのご紹介",{"href":75,"dataGaName":76,"dataGaLocation":41},"/ja-jp/gitlab-duo/","gitlab duo ai",{"title":78,"description":79,"link":80},"GitLabが選ばれる理由","GitLabが大企業に選ばれる理由10選",{"text":81,"config":82},"詳細はこちら",{"href":83,"dataGaName":84,"dataGaLocation":41},"/ja-jp/why-gitlab/","why gitlab",{"title":86,"items":87},"利用を開始：",[88,93,98],{"text":89,"config":90},"プラットフォームエンジニアリング",{"href":91,"dataGaName":92,"dataGaLocation":41},"/ja-jp/solutions/platform-engineering/","platform engineering",{"text":94,"config":95},"開発者の経験",{"href":96,"dataGaName":97,"dataGaLocation":41},"/ja-jp/developer-experience/","Developer experience",{"text":99,"config":100},"MLOps",{"href":101,"dataGaName":99,"dataGaLocation":41},"/ja-jp/topics/devops/the-role-of-ai-in-devops/",{"text":103,"left":23,"config":104,"link":106,"lists":110,"footer":182},"製品",{"dataNavLevelOne":105},"solutions",{"text":107,"config":108},"すべてのソリューションを表示",{"href":109,"dataGaName":105,"dataGaLocation":41},"/ja-jp/solutions/",[111,137,160],{"title":112,"description":113,"link":114,"items":119},"自動化","CI/CDと自動化でデプロイを加速",{"config":115},{"icon":116,"href":117,"dataGaName":118,"dataGaLocation":41},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[120,124,128,133],{"text":121,"config":122},"CI/CD",{"href":123,"dataGaLocation":41,"dataGaName":121},"/ja-jp/solutions/continuous-integration/",{"text":125,"config":126},"AIアシストによる開発",{"href":75,"dataGaLocation":41,"dataGaName":127},"AI assisted development",{"text":129,"config":130},"ソースコード管理",{"href":131,"dataGaLocation":41,"dataGaName":132},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":134,"config":135},"自動化されたソフトウェアデリバリー",{"href":117,"dataGaLocation":41,"dataGaName":136},"Automated software delivery",{"title":138,"description":139,"link":140,"items":145},"セキュリティ","セキュリティを損なうことなくコードをより迅速に完成",{"config":141},{"href":142,"dataGaName":143,"dataGaLocation":41,"icon":144},"/ja-jp/solutions/security-compliance/","security and compliance","ShieldCheckLight",[146,150,155],{"text":147,"config":148},"セキュリティとコンプライアンス",{"href":142,"dataGaLocation":41,"dataGaName":149},"Security & Compliance",{"text":151,"config":152},"ソフトウェアサプライチェーンの安全性",{"href":153,"dataGaLocation":41,"dataGaName":154},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":156,"config":157},"コンプライアンスとガバナンス",{"href":158,"dataGaLocation":41,"dataGaName":159},"/ja-jp/solutions/continuous-software-compliance/","Compliance and governance",{"title":161,"link":162,"items":167},"測定",{"config":163},{"icon":164,"href":165,"dataGaName":166,"dataGaLocation":41},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[168,172,177],{"text":169,"config":170},"可視性と測定",{"href":165,"dataGaLocation":41,"dataGaName":171},"Visibility and Measurement",{"text":173,"config":174},"バリューストリーム管理",{"href":175,"dataGaLocation":41,"dataGaName":176},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":178,"config":179},"分析とインサイト",{"href":180,"dataGaLocation":41,"dataGaName":181},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":183,"items":184},"GitLabが活躍する場所",[185,190,195],{"text":186,"config":187},"Enterprise",{"href":188,"dataGaLocation":41,"dataGaName":189},"/ja-jp/enterprise/","enterprise",{"text":191,"config":192},"スモールビジネス",{"href":193,"dataGaLocation":41,"dataGaName":194},"/ja-jp/small-business/","small business",{"text":196,"config":197},"公共機関",{"href":198,"dataGaLocation":41,"dataGaName":199},"/ja-jp/solutions/public-sector/","public sector",{"text":201,"config":202},"価格",{"href":203,"dataGaName":204,"dataGaLocation":41,"dataNavLevelOne":204},"/ja-jp/pricing/","pricing",{"text":206,"config":207,"link":209,"lists":213,"feature":296},"関連リソース",{"dataNavLevelOne":208},"resources",{"text":210,"config":211},"すべてのリソースを表示",{"href":212,"dataGaName":208,"dataGaLocation":41},"/ja-jp/resources/",[214,247,269],{"title":215,"items":216},"はじめに",[217,222,227,232,237,242],{"text":218,"config":219},"インストール",{"href":220,"dataGaName":221,"dataGaLocation":41},"/ja-jp/install/","install",{"text":223,"config":224},"クイックスタートガイド",{"href":225,"dataGaName":226,"dataGaLocation":41},"/ja-jp/get-started/","quick setup checklists",{"text":228,"config":229},"学ぶ",{"href":230,"dataGaLocation":41,"dataGaName":231},"https://university.gitlab.com/","learn",{"text":233,"config":234},"製品ドキュメント",{"href":235,"dataGaName":236,"dataGaLocation":41},"https://docs.gitlab.com/","product documentation",{"text":238,"config":239},"ベストプラクティスビデオ",{"href":240,"dataGaName":241,"dataGaLocation":41},"/ja-jp/getting-started-videos/","best practice videos",{"text":243,"config":244},"インテグレーション",{"href":245,"dataGaName":246,"dataGaLocation":41},"/ja-jp/integrations/","integrations",{"title":248,"items":249},"検索する",[250,255,259,264],{"text":251,"config":252},"お客様成功事例",{"href":253,"dataGaName":254,"dataGaLocation":41},"/ja-jp/customers/","customer success stories",{"text":256,"config":257},"ブログ",{"href":258,"dataGaName":5,"dataGaLocation":41},"/ja-jp/blog/",{"text":260,"config":261},"リモート",{"href":262,"dataGaName":263,"dataGaLocation":41},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"text":265,"config":266},"TeamOps",{"href":267,"dataGaName":268,"dataGaLocation":41},"/ja-jp/teamops/","teamops",{"title":270,"items":271},"つなげる",[272,277,281,286,291],{"text":273,"config":274},"GitLabサービス",{"href":275,"dataGaName":276,"dataGaLocation":41},"/ja-jp/services/","services",{"text":278,"config":279},"コミュニティ",{"href":280,"dataGaName":21,"dataGaLocation":41},"/community/",{"text":282,"config":283},"フォーラム",{"href":284,"dataGaName":285,"dataGaLocation":41},"https://forum.gitlab.com/","forum",{"text":287,"config":288},"イベント",{"href":289,"dataGaName":290,"dataGaLocation":41},"/events/","events",{"text":292,"config":293},"パートナー",{"href":294,"dataGaName":295,"dataGaLocation":41},"/ja-jp/partners/","partners",{"backgroundColor":297,"textColor":298,"text":299,"image":300,"link":304},"#2f2a6b","#fff","ソフトウェア開発の未来への洞察",{"altText":301,"config":302},"ソースプロモカード",{"src":303},"/images/navigation/the-source-promo-card.svg",{"text":305,"config":306},"最新情報を読む",{"href":307,"dataGaName":308,"dataGaLocation":41},"/ja-jp/the-source/","the source",{"text":310,"config":311,"lists":313},"Company",{"dataNavLevelOne":312},"company",[314],{"items":315},[316,321,327,329,334,339,344,349,354,359,364],{"text":317,"config":318},"GitLabについて",{"href":319,"dataGaName":320,"dataGaLocation":41},"/ja-jp/company/","about",{"text":322,"config":323,"footerGa":326},"採用情報",{"href":324,"dataGaName":325,"dataGaLocation":41},"/jobs/","jobs",{"dataGaName":325},{"text":287,"config":328},{"href":289,"dataGaName":290,"dataGaLocation":41},{"text":330,"config":331},"経営陣",{"href":332,"dataGaName":333,"dataGaLocation":41},"/company/team/e-group/","leadership",{"text":335,"config":336},"チーム",{"href":337,"dataGaName":338,"dataGaLocation":41},"/company/team/","team",{"text":340,"config":341},"ハンドブック",{"href":342,"dataGaName":343,"dataGaLocation":41},"https://handbook.gitlab.com/","handbook",{"text":345,"config":346},"投資家向け情報",{"href":347,"dataGaName":348,"dataGaLocation":41},"https://ir.gitlab.com/","investor relations",{"text":350,"config":351},"トラストセンター",{"href":352,"dataGaName":353,"dataGaLocation":41},"/ja-jp/security/","trust center",{"text":355,"config":356},"AI Transparency Center",{"href":357,"dataGaName":358,"dataGaLocation":41},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":360,"config":361},"ニュースレター",{"href":362,"dataGaName":363,"dataGaLocation":41},"/company/contact/","newsletter",{"text":365,"config":366},"プレス",{"href":367,"dataGaName":368,"dataGaLocation":41},"/press/","press",{"text":48,"config":370,"lists":371},{"dataNavLevelOne":312},[372],{"items":373},[374,377,382],{"text":48,"config":375},{"href":50,"dataGaName":376,"dataGaLocation":41},"talk to sales",{"text":378,"config":379},"サポートを受ける",{"href":380,"dataGaName":381,"dataGaLocation":41},"/support/","get help",{"text":383,"config":384},"カスタマーポータル",{"href":385,"dataGaName":386,"dataGaLocation":41},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":388,"login":389,"suggestions":396},"閉じる",{"text":390,"link":391},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":392,"config":393},"GitLab.com",{"href":55,"dataGaName":394,"dataGaLocation":395},"search login","search",{"text":397,"default":398},"提案",[399,402,407,409,413,417],{"text":70,"config":400},{"href":75,"dataGaName":401,"dataGaLocation":395},"GitLab Duo (AI)",{"text":403,"config":404},"コード提案（AI）",{"href":405,"dataGaName":406,"dataGaLocation":395},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":121,"config":408},{"href":123,"dataGaName":121,"dataGaLocation":395},{"text":410,"config":411},"GitLab on AWS",{"href":412,"dataGaName":410,"dataGaLocation":395},"/ja-jp/partners/technology-partners/aws/",{"text":414,"config":415},"GitLab on Google Cloud",{"href":416,"dataGaName":414,"dataGaLocation":395},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":418,"config":419},"GitLabを選ぶ理由",{"href":83,"dataGaName":420,"dataGaLocation":395},"Why GitLab?",{"freeTrial":422,"mobileIcon":426,"desktopIcon":431},{"text":43,"config":423},{"href":424,"dataGaName":46,"dataGaLocation":425},"https://gitlab.com/-/trials/new/","nav",{"altText":427,"config":428},"GitLabアイコン",{"src":429,"dataGaName":430,"dataGaLocation":425},"/images/brand/gitlab-logo-tanuki.svg","gitlab icon",{"altText":427,"config":432},{"src":433,"dataGaName":430,"dataGaLocation":425},"/images/brand/gitlab-logo-type.svg",{"freeTrial":435,"mobileIcon":439,"desktopIcon":441},{"text":436,"config":437},"GitLab Duoの詳細について",{"href":75,"dataGaName":438,"dataGaLocation":425},"gitlab duo",{"altText":427,"config":440},{"src":429,"dataGaName":430,"dataGaLocation":425},{"altText":427,"config":442},{"src":433,"dataGaName":430,"dataGaLocation":425},"content:shared:ja-jp:main-navigation.yml","Main Navigation","shared/ja-jp/main-navigation.yml","shared/ja-jp/main-navigation",{"_path":448,"_dir":35,"_draft":6,"_partial":6,"_locale":7,"title":449,"button":450,"config":454,"_id":456,"_type":27,"_source":29,"_file":457,"_stem":458,"_extension":32},"/shared/ja-jp/banner","GitLab Duo Agent Platformがパブリックベータ版で利用可能になりました！",{"text":81,"config":451},{"href":452,"dataGaName":453,"dataGaLocation":41},"/ja-jp/gitlab-duo/agent-platform/","duo banner",{"layout":455},"release","content:shared:ja-jp:banner.yml","shared/ja-jp/banner.yml","shared/ja-jp/banner",{"_path":460,"_dir":35,"_draft":6,"_partial":6,"_locale":7,"data":461,"_id":665,"_type":27,"title":666,"_source":29,"_file":667,"_stem":668,"_extension":32},"/shared/ja-jp/main-footer",{"text":462,"source":463,"edit":469,"contribute":474,"config":479,"items":484,"minimal":657},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":464,"config":465},"ページのソースを表示",{"href":466,"dataGaName":467,"dataGaLocation":468},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":470,"config":471},"このページを編集",{"href":472,"dataGaName":473,"dataGaLocation":468},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":475,"config":476},"ご協力をお願いします",{"href":477,"dataGaName":478,"dataGaLocation":468},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":480,"facebook":481,"youtube":482,"linkedin":483},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[485,508,562,595,629],{"title":59,"links":486,"subMenu":491},[487],{"text":488,"config":489},"DevSecOpsプラットフォーム",{"href":68,"dataGaName":490,"dataGaLocation":468},"devsecops platform",[492],{"title":201,"links":493},[494,498,503],{"text":495,"config":496},"プランの表示",{"href":203,"dataGaName":497,"dataGaLocation":468},"view plans",{"text":499,"config":500},"Premiumを選ぶ理由",{"href":501,"dataGaName":502,"dataGaLocation":468},"/ja-jp/pricing/premium/","why premium",{"text":504,"config":505},"Ultimateを選ぶ理由",{"href":506,"dataGaName":507,"dataGaLocation":468},"/ja-jp/pricing/ultimate/","why ultimate",{"title":509,"links":510},"ソリューション",[511,516,519,521,526,531,535,538,541,546,548,550,552,557],{"text":512,"config":513},"デジタルトランスフォーメーション",{"href":514,"dataGaName":515,"dataGaLocation":468},"/ja-jp/topics/digital-transformation/","digital transformation",{"text":147,"config":517},{"href":142,"dataGaName":518,"dataGaLocation":468},"security & compliance",{"text":134,"config":520},{"href":117,"dataGaName":118,"dataGaLocation":468},{"text":522,"config":523},"アジャイル開発",{"href":524,"dataGaName":525,"dataGaLocation":468},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":527,"config":528},"クラウドトランスフォーメーション",{"href":529,"dataGaName":530,"dataGaLocation":468},"/ja-jp/topics/cloud-native/","cloud transformation",{"text":532,"config":533},"SCM",{"href":131,"dataGaName":534,"dataGaLocation":468},"source code management",{"text":121,"config":536},{"href":123,"dataGaName":537,"dataGaLocation":468},"continuous integration & delivery",{"text":173,"config":539},{"href":175,"dataGaName":540,"dataGaLocation":468},"value stream management",{"text":542,"config":543},"GitOps",{"href":544,"dataGaName":545,"dataGaLocation":468},"/ja-jp/solutions/gitops/","gitops",{"text":186,"config":547},{"href":188,"dataGaName":189,"dataGaLocation":468},{"text":191,"config":549},{"href":193,"dataGaName":194,"dataGaLocation":468},{"text":196,"config":551},{"href":198,"dataGaName":199,"dataGaLocation":468},{"text":553,"config":554},"教育",{"href":555,"dataGaName":556,"dataGaLocation":468},"/ja-jp/solutions/education/","education",{"text":558,"config":559},"金融サービス",{"href":560,"dataGaName":561,"dataGaLocation":468},"/ja-jp/solutions/finance/","financial services",{"title":206,"links":563},[564,566,568,570,573,575,579,581,583,585,587,589,591,593],{"text":218,"config":565},{"href":220,"dataGaName":221,"dataGaLocation":468},{"text":223,"config":567},{"href":225,"dataGaName":226,"dataGaLocation":468},{"text":228,"config":569},{"href":230,"dataGaName":231,"dataGaLocation":468},{"text":233,"config":571},{"href":235,"dataGaName":572,"dataGaLocation":468},"docs",{"text":256,"config":574},{"href":258,"dataGaName":5},{"text":576,"config":577},"お客様の成功事例",{"href":578,"dataGaLocation":468},"/customers/",{"text":251,"config":580},{"href":253,"dataGaName":254,"dataGaLocation":468},{"text":260,"config":582},{"href":262,"dataGaName":263,"dataGaLocation":468},{"text":273,"config":584},{"href":275,"dataGaName":276,"dataGaLocation":468},{"text":265,"config":586},{"href":267,"dataGaName":268,"dataGaLocation":468},{"text":278,"config":588},{"href":280,"dataGaName":21,"dataGaLocation":468},{"text":282,"config":590},{"href":284,"dataGaName":285,"dataGaLocation":468},{"text":287,"config":592},{"href":289,"dataGaName":290,"dataGaLocation":468},{"text":292,"config":594},{"href":294,"dataGaName":295,"dataGaLocation":468},{"title":310,"links":596},[597,599,601,603,605,607,609,613,618,620,622,624],{"text":317,"config":598},{"href":319,"dataGaName":312,"dataGaLocation":468},{"text":322,"config":600},{"href":324,"dataGaName":325,"dataGaLocation":468},{"text":330,"config":602},{"href":332,"dataGaName":333,"dataGaLocation":468},{"text":335,"config":604},{"href":337,"dataGaName":338,"dataGaLocation":468},{"text":340,"config":606},{"href":342,"dataGaName":343,"dataGaLocation":468},{"text":345,"config":608},{"href":347,"dataGaName":348,"dataGaLocation":468},{"text":610,"config":611},"Sustainability",{"href":612,"dataGaName":610,"dataGaLocation":468},"/sustainability/",{"text":614,"config":615},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":616,"dataGaName":617,"dataGaLocation":468},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":350,"config":619},{"href":352,"dataGaName":353,"dataGaLocation":468},{"text":360,"config":621},{"href":362,"dataGaName":363,"dataGaLocation":468},{"text":365,"config":623},{"href":367,"dataGaName":368,"dataGaLocation":468},{"text":625,"config":626},"現代奴隷制の透明性に関する声明",{"href":627,"dataGaName":628,"dataGaLocation":468},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"title":48,"links":630},[631,633,635,637,642,647,652],{"text":48,"config":632},{"href":50,"dataGaName":51,"dataGaLocation":468},{"text":378,"config":634},{"href":380,"dataGaName":381,"dataGaLocation":468},{"text":383,"config":636},{"href":385,"dataGaName":386,"dataGaLocation":468},{"text":638,"config":639},"ステータス",{"href":640,"dataGaName":641,"dataGaLocation":468},"https://status.gitlab.com/","status",{"text":643,"config":644},"利用規約",{"href":645,"dataGaName":646,"dataGaLocation":468},"/terms/","terms of use",{"text":648,"config":649},"プライバシーに関する声明",{"href":650,"dataGaName":651,"dataGaLocation":468},"/ja-jp/privacy/","privacy statement",{"text":653,"config":654},"Cookieの設定",{"dataGaName":655,"dataGaLocation":468,"id":656,"isOneTrustButton":23},"cookie preferences","ot-sdk-btn",{"items":658},[659,661,663],{"text":643,"config":660},{"href":645,"dataGaName":646,"dataGaLocation":468},{"text":648,"config":662},{"href":650,"dataGaName":651,"dataGaLocation":468},{"text":653,"config":664},{"dataGaName":655,"dataGaLocation":468,"id":656,"isOneTrustButton":23},"content:shared:ja-jp:main-footer.yml","Main Footer","shared/ja-jp/main-footer.yml","shared/ja-jp/main-footer",[670],{"_path":671,"_dir":672,"_draft":6,"_partial":6,"_locale":7,"content":673,"config":677,"_id":679,"_type":27,"title":13,"_source":29,"_file":680,"_stem":681,"_extension":32},"/en-us/blog/authors/justin-tobler","authors",{"name":13,"config":674},{"headshot":675,"ctfId":676},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664737/Blog/Author%20Headshots/james_tobler_headshot.png","5pnOIbNI1Sc5IFnReNHNtv",{"template":678},"BlogAuthor","content:en-us:blog:authors:justin-tobler.yml","en-us/blog/authors/justin-tobler.yml","en-us/blog/authors/justin-tobler",{"_path":683,"_dir":35,"_draft":6,"_partial":6,"_locale":7,"header":684,"eyebrow":685,"blurb":686,"button":687,"secondaryButton":691,"_id":693,"_type":27,"title":694,"_source":29,"_file":695,"_stem":696,"_extension":32},"/shared/ja-jp/next-steps","より優れたソフトウェアをより速く提供","フォーチュン100企業の50%以上がGitLabを信頼","インテリジェントなDevSecOpsプラットフォームで\n\n\nチームの可能性を広げましょう。\n",{"text":43,"config":688},{"href":689,"dataGaName":46,"dataGaLocation":690},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/","feature",{"text":48,"config":692},{"href":50,"dataGaName":51,"dataGaLocation":690},"content:shared:ja-jp:next-steps.yml","Next Steps","shared/ja-jp/next-steps.yml","shared/ja-jp/next-steps",1753475412122]