[{"data":1,"prerenderedAt":2048},["ShallowReactive",2],{"/ja-jp/blog/journey-through-gits-20-year-history":3,"navigation-ja-jp":1267,"banner-ja-jp":1696,"footer-ja-jp":1704,"blog-post-authors-ja-jp-Patrick Steinhardt":1946,"blog-related-posts-ja-jp-journey-through-gits-20-year-history":1961,"blog-promotions-ja-jp":1985,"next-steps-ja-jp":2039},{"id":4,"title":5,"authors":6,"body":8,"category":1248,"date":1249,"description":1250,"extension":1251,"externalUrl":1252,"faq":1252,"featured":618,"heroImage":1253,"meta":1254,"navigation":618,"path":1255,"seo":1256,"slug":1261,"stem":1262,"tags":1263,"template":1265,"updatedDate":1252,"__hash__":1266},"blogPosts/ja-jp/blog/journey-through-gits-20-year-history.md","20年にわたるGitの歴史をたどる",[7],"Patrick Steinhardt",{"type":9,"value":10,"toc":1228},"minimark",[11,15,18,22,29,32,205,208,248,255,258,328,339,342,347,351,358,380,383,505,508,628,634,637,644,765,771,774,794,798,801,804,823,829,837,849,853,856,865,868,872,875,882,885,888,904,911,997,1000,1010,1014,1021,1028,1037,1043,1052,1058,1061,1067,1071,1074,1081,1087,1090,1104,1107,1110,1116,1132,1136,1139,1142,1153,1168,1171,1174,1177,1180,1185,1188,1193,1197,1224],[12,13,14],"p",{},"Gitプロジェクトはちょうど20周年を迎えました。20年の間にさまざまなことがありました。Gitの概念的なデザインは、その登場以来大きく変わってはいないものの、ユーザーによるGitの操作方法は大きく変化しました。GitLabは、この重要な技術をベースにサービスを構築し、その歴史の一部であることを誇りに思っています。",[12,16,17],{},"それでは、Gitの歴史をたどり、長年にわたってどのように進化を遂げてきたかを一緒に見ていきましょう。",[19,20,21],"h2",{"id":21},"初めてのコミット",[12,23,24,25],{},"初めてのコミットは、2005年4月7日にLinuxカーネルの生みの親であるLinus Torvalds氏によって行われました。",[26,27,28],"code",{},"e83c5163316 (Initial revision of \"git\", the information manager from hell, 2005-04-07)",[12,30,31],{},"ご覧のとおり、このコミットには多くのファイルは含まれていませんでした。",[33,34,39],"pre",{"className":35,"code":36,"language":37,"meta":38,"style":38},"language-shell shiki shiki-themes github-light","$ git ls-tree e83c5163316\n100644 blob a6bba79ba1f46a1bbf7773449c3bd2bb9bf48e8b    Makefile\n100644 blob 27577f76849c09d3405397244eb3d8ae1d11b0f3    README\n100644 blob 98a32a9ad39883c6d05a000a68511d4b1ee2b3c7    cache.h\n100644 blob 74a0a234dd346fff51c773aa57d82fc4b83a8557    cat-file.c\n100644 blob 840307af0cfaab31555795ce7175d5e9c9f981a0    commit-tree.c\n100644 blob 25dc13fe101b219f74007f3194b787dd99e863da    init-db.c\n100644 blob c924a6e0fc4c36bad6f23cb87ee59518c771f936    read-cache.c\n100644 blob 1b47742d8cbc0d98903777758b7b519980e7499e    read-tree.c\n100644 blob b8522886a15db861508fb6d03d4d88d6de912a4b    show-diff.c\n100644 blob 5085a5cb53ee52e1886ff6d46c609bdb2fc6d6cd    update-cache.c\n100644 blob 921f981353229db0c56103a52609d35aff16f41b    write-tree.c\n","shell","",[26,40,41,60,75,88,101,114,127,140,153,166,179,192],{"__ignoreMap":38},[42,43,46,50,54,57],"span",{"class":44,"line":45},"line",1,[42,47,49],{"class":48},"s7eDp","$",[42,51,53],{"class":52},"sYBdl"," git",[42,55,56],{"class":52}," ls-tree",[42,58,59],{"class":52}," e83c5163316\n",[42,61,63,66,69,72],{"class":44,"line":62},2,[42,64,65],{"class":48},"100644",[42,67,68],{"class":52}," blob",[42,70,71],{"class":52}," a6bba79ba1f46a1bbf7773449c3bd2bb9bf48e8b",[42,73,74],{"class":52},"    Makefile\n",[42,76,78,80,82,85],{"class":44,"line":77},3,[42,79,65],{"class":48},[42,81,68],{"class":52},[42,83,84],{"class":52}," 27577f76849c09d3405397244eb3d8ae1d11b0f3",[42,86,87],{"class":52},"    README\n",[42,89,91,93,95,98],{"class":44,"line":90},4,[42,92,65],{"class":48},[42,94,68],{"class":52},[42,96,97],{"class":52}," 98a32a9ad39883c6d05a000a68511d4b1ee2b3c7",[42,99,100],{"class":52},"    cache.h\n",[42,102,104,106,108,111],{"class":44,"line":103},5,[42,105,65],{"class":48},[42,107,68],{"class":52},[42,109,110],{"class":52}," 74a0a234dd346fff51c773aa57d82fc4b83a8557",[42,112,113],{"class":52},"    cat-file.c\n",[42,115,117,119,121,124],{"class":44,"line":116},6,[42,118,65],{"class":48},[42,120,68],{"class":52},[42,122,123],{"class":52}," 840307af0cfaab31555795ce7175d5e9c9f981a0",[42,125,126],{"class":52},"    commit-tree.c\n",[42,128,130,132,134,137],{"class":44,"line":129},7,[42,131,65],{"class":48},[42,133,68],{"class":52},[42,135,136],{"class":52}," 25dc13fe101b219f74007f3194b787dd99e863da",[42,138,139],{"class":52},"    init-db.c\n",[42,141,143,145,147,150],{"class":44,"line":142},8,[42,144,65],{"class":48},[42,146,68],{"class":52},[42,148,149],{"class":52}," c924a6e0fc4c36bad6f23cb87ee59518c771f936",[42,151,152],{"class":52},"    read-cache.c\n",[42,154,156,158,160,163],{"class":44,"line":155},9,[42,157,65],{"class":48},[42,159,68],{"class":52},[42,161,162],{"class":52}," 1b47742d8cbc0d98903777758b7b519980e7499e",[42,164,165],{"class":52},"    read-tree.c\n",[42,167,169,171,173,176],{"class":44,"line":168},10,[42,170,65],{"class":48},[42,172,68],{"class":52},[42,174,175],{"class":52}," b8522886a15db861508fb6d03d4d88d6de912a4b",[42,177,178],{"class":52},"    show-diff.c\n",[42,180,182,184,186,189],{"class":44,"line":181},11,[42,183,65],{"class":48},[42,185,68],{"class":52},[42,187,188],{"class":52}," 5085a5cb53ee52e1886ff6d46c609bdb2fc6d6cd",[42,190,191],{"class":52},"    update-cache.c\n",[42,193,195,197,199,202],{"class":44,"line":194},12,[42,196,65],{"class":48},[42,198,68],{"class":52},[42,200,201],{"class":52}," 921f981353229db0c56103a52609d35aff16f41b",[42,203,204],{"class":52},"    write-tree.c\n",[12,206,207],{},"ビルドインフラストラクチャに加え、最初のコミットでは以下の7つのトップレベルコマンドが提供されていました。",[209,210,211,218,224,230,236,242],"ul",{},[212,213,214,217],"li",{},[26,215,216],{},"init-db","：新たなGitリポジトリを初期化",[212,219,220,223],{},[26,221,222],{},"update-cache","：インデックスにファイルを追加",[212,225,226,229],{},[26,227,228],{},"write-tree","：インデックスの内容を取得し、それをもとに新たなツリーを作成",[212,231,232,235],{},[26,233,234],{},"read-tree","：ツリーオブジェクトを読み込む",[212,237,238,241],{},[26,239,240],{},"commit-tree","：ツリーからコミットを作成",[212,243,244,247],{},[26,245,246],{},"cat-file","：特定のオブジェクトを一時ファイルに読み込む",[12,249,250,251,254],{},"なお、この時点では、",[26,252,253],{},"git","コマンド自体存在していませんでした。代わりに、上記のコマンドを直接実行する必要がありました。",[12,256,257],{},"では、試しにリポジトリを新規作成してみましょう。",[33,259,261],{"className":35,"code":260,"language":37,"meta":38,"style":38},"$ mkdir repo\n$ cd repo\n$ init-db\ndefaulting to private storage area\n$ ls -a\n.  ..  .dircache\n",[26,262,263,273,282,289,306,317],{"__ignoreMap":38},[42,264,265,267,270],{"class":44,"line":45},[42,266,49],{"class":48},[42,268,269],{"class":52}," mkdir",[42,271,272],{"class":52}," repo\n",[42,274,275,277,280],{"class":44,"line":62},[42,276,49],{"class":48},[42,278,279],{"class":52}," cd",[42,281,272],{"class":52},[42,283,284,286],{"class":44,"line":77},[42,285,49],{"class":48},[42,287,288],{"class":52}," init-db\n",[42,290,291,294,297,300,303],{"class":44,"line":90},[42,292,293],{"class":48},"defaulting",[42,295,296],{"class":52}," to",[42,298,299],{"class":52}," private",[42,301,302],{"class":52}," storage",[42,304,305],{"class":52}," area\n",[42,307,308,310,313],{"class":44,"line":103},[42,309,49],{"class":48},[42,311,312],{"class":52}," ls",[42,314,316],{"class":315},"sYu0t"," -a\n",[42,318,319,322,325],{"class":44,"line":116},[42,320,321],{"class":315},".",[42,323,324],{"class":52},"  ..",[42,326,327],{"class":52},"  .dircache\n",[12,329,330,331,334,335,338],{},"みなさんにはまったくなじみがないと思います。",[26,332,333],{},".git","ディレクトリではなく、",[26,336,337],{},".dircache","ディレクトリが使用されていました。では、プライベートストレージ領域はどこでしょうか？",[12,340,341],{},"初期のGitのデザインでは、オブジェクトストレージ領域は「共有」と「プライベート」に分かれていました。このオブジェクトストレージ領域には、コミットやblobなども含め、あらゆるGitオブジェクトが格納されていました。",[12,343,344,346],{},[26,345,216],{},"は、デフォルトではプライベートオブジェクトストレージ領域を作成します。これは、領域の作成先の管理ディレクトリ専用として使用されていました。一方、同じオブジェクトを二重に保存する必要がないように、「共有」オブジェクトストレージ領域を使用して、複数の管理ディレクトリ間でオブジェクトの内容を共有していました。",[348,349,350],"h3",{"id":350},"コミットを作成する",[12,352,353,354,357],{},"リポジトリの作成後は、どのようにコミットを作成していたのでしょうか？作成方法は、現在利用可能な",[26,355,356],{},"git add . && git commit","ほどシンプルではありませんでした。その代わりに、以下の方法で行っていました。",[359,360,361,367,372,375],"ol",{},[212,362,363,364,366],{},"追加するファイルごとに",[26,365,222],{},"を呼び出してインデックスを更新する。",[212,368,369,371],{},[26,370,228],{},"を呼び出して新規ツリーを書き込む。インデックスに追加済みのすべての内容をもとに作成される。",[212,373,374],{},"環境変数を設定して、Gitにコミッターの情報を伝える。",[212,376,377,379],{},[26,378,240],{},"を呼び出して、コミットオブジェクトを書き込む。",[12,381,382],{},"それでは、リポジトリにコミットを作成してみましょう。",[33,384,386],{"className":35,"code":385,"language":37,"meta":38,"style":38},"$ echo content-1 >file-a\n$ update-cache file-a\n$ echo content-2 >file-b\n$ update-cache file-b\n$ write-tree\n3f143dfb48f2d84936626e2e5402e1f10c2050fb\n$ export COMMITTER_NAME=\"Patrick Steinhardt\"\n$ export COMMITER_EMAIL=ps@pks.im\n$ echo \"commit message\" | commit-tree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\nCommitting initial tree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\n5f8e928066c03cebe5fd0a0cc1b93d058155b969\n",[26,387,388,405,415,429,438,445,450,460,469,487,500],{"__ignoreMap":38},[42,389,390,392,395,398,402],{"class":44,"line":45},[42,391,49],{"class":48},[42,393,394],{"class":52}," echo",[42,396,397],{"class":52}," content-1",[42,399,401],{"class":400},"sD7c4"," >",[42,403,404],{"class":52},"file-a\n",[42,406,407,409,412],{"class":44,"line":62},[42,408,49],{"class":48},[42,410,411],{"class":52}," update-cache",[42,413,414],{"class":52}," file-a\n",[42,416,417,419,421,424,426],{"class":44,"line":77},[42,418,49],{"class":48},[42,420,394],{"class":52},[42,422,423],{"class":52}," content-2",[42,425,401],{"class":400},[42,427,428],{"class":52},"file-b\n",[42,430,431,433,435],{"class":44,"line":90},[42,432,49],{"class":48},[42,434,411],{"class":52},[42,436,437],{"class":52}," file-b\n",[42,439,440,442],{"class":44,"line":103},[42,441,49],{"class":48},[42,443,444],{"class":52}," write-tree\n",[42,446,447],{"class":44,"line":116},[42,448,449],{"class":48},"3f143dfb48f2d84936626e2e5402e1f10c2050fb\n",[42,451,452,454,457],{"class":44,"line":129},[42,453,49],{"class":48},[42,455,456],{"class":52}," export",[42,458,459],{"class":52}," COMMITTER_NAME=\"Patrick Steinhardt\"\n",[42,461,462,464,466],{"class":44,"line":142},[42,463,49],{"class":48},[42,465,456],{"class":52},[42,467,468],{"class":52}," COMMITER_EMAIL=ps@pks.im\n",[42,470,471,473,475,478,481,484],{"class":44,"line":155},[42,472,49],{"class":48},[42,474,394],{"class":52},[42,476,477],{"class":52}," \"commit message\"",[42,479,480],{"class":400}," |",[42,482,483],{"class":48}," commit-tree",[42,485,486],{"class":52}," 3f143dfb48f2d84936626e2e5402e1f10c2050fb\n",[42,488,489,492,495,498],{"class":44,"line":168},[42,490,491],{"class":48},"Committing",[42,493,494],{"class":52}," initial",[42,496,497],{"class":52}," tree",[42,499,486],{"class":52},[42,501,502],{"class":44,"line":181},[42,503,504],{"class":48},"5f8e928066c03cebe5fd0a0cc1b93d058155b969\n",[12,506,507],{},"人間工学的な方法とは言えないものの、コミットは作成されます。それでは、生成されたコミットを見てみましょう。",[33,509,511],{"className":35,"code":510,"language":37,"meta":38,"style":38},"$ cat-file 5f8e928066c03cebe5fd0a0cc1b93d058155b969\ntemp_git_file_rlTXtE: commit\n$ cat temp_git_file_rlTXtE\ntree 3f143dfb48f2d84936626e2e5402e1f10c2050fb\nauthor Patrick Steinhardt \u003Cps@pks.im> Wed Mar 26 13:10:16 2025\ncommitter Patrick Steinhardt \u003Cps@pks.im> Wed Mar 26 13:10:16 2025\n\ncommit message\n",[26,512,513,523,531,541,548,587,614,620],{"__ignoreMap":38},[42,514,515,517,520],{"class":44,"line":45},[42,516,49],{"class":48},[42,518,519],{"class":52}," cat-file",[42,521,522],{"class":52}," 5f8e928066c03cebe5fd0a0cc1b93d058155b969\n",[42,524,525,528],{"class":44,"line":62},[42,526,527],{"class":48},"temp_git_file_rlTXtE:",[42,529,530],{"class":52}," commit\n",[42,532,533,535,538],{"class":44,"line":77},[42,534,49],{"class":48},[42,536,537],{"class":52}," cat",[42,539,540],{"class":52}," temp_git_file_rlTXtE\n",[42,542,543,546],{"class":44,"line":90},[42,544,545],{"class":48},"tree",[42,547,486],{"class":52},[42,549,550,553,556,559,562,565,569,572,575,578,581,584],{"class":44,"line":103},[42,551,552],{"class":48},"author",[42,554,555],{"class":52}," Patrick",[42,557,558],{"class":52}," Steinhardt",[42,560,561],{"class":400}," \u003C",[42,563,564],{"class":52},"ps@pks.i",[42,566,568],{"class":567},"sgsFI","m",[42,570,571],{"class":400},">",[42,573,574],{"class":52}," Wed",[42,576,577],{"class":52}," Mar",[42,579,580],{"class":315}," 26",[42,582,583],{"class":52}," 13:10:16",[42,585,586],{"class":315}," 2025\n",[42,588,589,592,594,596,598,600,602,604,606,608,610,612],{"class":44,"line":116},[42,590,591],{"class":48},"committer",[42,593,555],{"class":52},[42,595,558],{"class":52},[42,597,561],{"class":400},[42,599,564],{"class":52},[42,601,568],{"class":567},[42,603,571],{"class":400},[42,605,574],{"class":52},[42,607,577],{"class":52},[42,609,580],{"class":315},[42,611,583],{"class":52},[42,613,586],{"class":315},[42,615,616],{"class":44,"line":129},[42,617,619],{"emptyLinePlaceholder":618},true,"\n",[42,621,622,625],{"class":44,"line":142},[42,623,624],{"class":48},"commit",[42,626,627],{"class":52}," message\n",[12,629,630,631,633],{},"注目していただきたいのは、",[26,632,246],{},"は内容を直接表示せず、まずは一時ファイルに書き出す点です。しかしながら、ファイルの内容は、まさに現代的なコミットと同じように見えます。",[348,635,636],{"id":636},"変更を加える",[12,638,639,640,643],{},"ファイルの作成後、どのようにステータスを確認していたのでしょうか？おそらくお察しのとおりで、",[26,641,642],{},"show-diff","を使用していました。",[33,645,647],{"className":35,"code":646,"language":37,"meta":38,"style":38},"$ show-diff\nfile-a: ok\nfile-b: ok\n\n$ echo modified-content >file-a\n$ show-diff\n--- -   2025-03-26 13:14:53.457611094 +0100\n+++ file-a  2025-03-26 13:14:52.230085756 +0100\n@@ -1 +1 @@\n-content-1\n+modified-content\nfile-a:  46d8be14cdec97aac6a769fdbce4db340e888bf8\nfile-b: ok\n",[26,648,649,656,664,671,675,688,694,711,727,741,746,751,758],{"__ignoreMap":38},[42,650,651,653],{"class":44,"line":45},[42,652,49],{"class":48},[42,654,655],{"class":52}," show-diff\n",[42,657,658,661],{"class":44,"line":62},[42,659,660],{"class":48},"file-a:",[42,662,663],{"class":52}," ok\n",[42,665,666,669],{"class":44,"line":77},[42,667,668],{"class":48},"file-b:",[42,670,663],{"class":52},[42,672,673],{"class":44,"line":90},[42,674,619],{"emptyLinePlaceholder":618},[42,676,677,679,681,684,686],{"class":44,"line":103},[42,678,49],{"class":48},[42,680,394],{"class":52},[42,682,683],{"class":52}," modified-content",[42,685,401],{"class":400},[42,687,404],{"class":52},[42,689,690,692],{"class":44,"line":116},[42,691,49],{"class":48},[42,693,655],{"class":52},[42,695,696,699,702,705,708],{"class":44,"line":129},[42,697,698],{"class":48},"---",[42,700,701],{"class":52}," -",[42,703,704],{"class":52},"   2025-03-26",[42,706,707],{"class":52}," 13:14:53.457611094",[42,709,710],{"class":52}," +0100\n",[42,712,713,716,719,722,725],{"class":44,"line":142},[42,714,715],{"class":48},"+++",[42,717,718],{"class":52}," file-a",[42,720,721],{"class":52},"  2025-03-26",[42,723,724],{"class":52}," 13:14:52.230085756",[42,726,710],{"class":52},[42,728,729,732,735,738],{"class":44,"line":155},[42,730,731],{"class":48},"@@",[42,733,734],{"class":315}," -1",[42,736,737],{"class":52}," +1",[42,739,740],{"class":52}," @@\n",[42,742,743],{"class":44,"line":168},[42,744,745],{"class":48},"-content-1\n",[42,747,748],{"class":44,"line":181},[42,749,750],{"class":48},"+modified-content\n",[42,752,753,755],{"class":44,"line":194},[42,754,660],{"class":48},[42,756,757],{"class":52},"  46d8be14cdec97aac6a769fdbce4db340e888bf8\n",[42,759,761,763],{"class":44,"line":760},13,[42,762,668],{"class":48},[42,764,663],{"class":52},[12,766,767,768,770],{},"驚くべきことに、すでに",[26,769,642],{},"では、変更されたファイルの新旧の状態を比較して差分を取得していました。しかも面白いことに、GitではこれをUNIXのdiff(1)ツールを使用するという簡単な方法で実現していました。",[12,772,773],{},"つまり、これらはすべて必要最低限の機能しか備えていなかったものの、履歴の追跡に必要なすべての役割を果たしていました。以下のように制限は多数ありました。",[209,775,776,779,782,785,791],{},[212,777,778],{},"あるコミットから別のコミットへ簡単に切り替える方法がなかった。",[212,780,781],{},"ログを表示できなかった。",[212,783,784],{},"ブランチやtag、また参照すら存在しなかった。そのため、ユーザーは手動でオブジェクトIDを追跡しなければならなかった。",[212,786,787,788,790],{},"2つのリポジトリを相互に同期させる方法がなかった。代わりに、ユーザーがrsync(1)を使用して、",[26,789,337],{},"ディレクトリを同期させる必要があった。",[212,792,793],{},"マージの実行方法がなかった。",[19,795,797],{"id":796},"git-099","Git 0.99",[12,799,800],{},"Gitの最初のテストリリースは、バージョン0.99でした。バージョン0.99は、最初のコミットからわずか2か月後にリリースされたものの、すでに1,076件のコミットが追加されていました。約50人のデベロッパーが開発に携わっており、最も頻繁にコミットを行っていたのはTorvalds氏自身でした。トーバルズ氏に続く勢いで、コミット件数の多かったコミッターは、現在メンテナーを務めている濱野純氏でした。",[12,802,803],{},"最初のコミット以降、多数の変更が加えられました。",[209,805,806,809,812,820],{},[212,807,808],{},"Gitは参照を使って複数の開発ブランチを追跡するようになりました。その結果、大抵の場合、手作業でオブジェクトIDを追跡せずに済むようになりました。",[212,810,811],{},"新たにリモートプロトコルが導入され、2つのリポジトリ間で相互にオブジェクトを交換できるようになりました。",[212,813,814,816,817,819],{},[26,815,337],{},"ディレクトリの名前が",[26,818,333],{},"に変更されました。",[212,821,822],{},"個々のファイルを相互にマージできるようになりました。",[12,824,825,826,828],{},"ただし、最も重要かつ顕著な変化は、トップレベルの",[26,827,253],{},"コマンドとそのサブコマンドが導入されたことでした。興味深いことに、「配管（plumbing）」コマンドと「磁器（porcelain）」コマンドの概念が導入されたのも、このリリースです。",[209,830,831,834],{},[212,832,833],{},"「配管」ツールは、基盤となるGitリポジトリにアクセスして低レベルな処理を行うコマンドです。",[212,835,836],{},"「磁器」ツールは、「配管」コマンドをラップして、高レベルでよりユーザーフレンドリーなユーザーインターフェイスを提供するShellスクリプトです。",[12,838,839,840,848],{},"Gitには現在でもこの分け方は採用されており、",[841,842,845],"a",{"href":843,"rel":844},"https://git-scm.com/docs/git#_high_level_commands_porcelain",[],[26,846,847],{},"git(1)","にも概説されています。しかしながら、「磁器」ツールの大半はShellスクリプトからC言語に書き直されたため、これらの2つのカテゴリ間の境界線はかなり曖昧になってきています。",[19,850,852],{"id":851},"torvalds氏メンテナーの役割を濱野氏に引き継ぐ","Torvalds氏、メンテナーの役割を濱野氏に引き継ぐ",[12,854,855],{},"Torvalds氏がGitに取り掛かった理由は、バージョン管理システムが好きだったためではなく、Linuxカーネル開発のためにBitKeeperの代替ツールを必要としていたためです。そのため、Gitのメンテナンスをずっと続けるつもりはなく、信頼できる人が現れるまで、メンテナーを務めようと考えていました。",[12,857,858,859,864],{},"その条件に当てはまったのが、濱野純氏でした。濱野氏は、Torvalds氏が最初のコミットを行った約1週間後にGitの開発に参加しました。Git 0.99のリリース後にはすでに数百件のコミットを行っていました。そのため、2005年7月26日に、",[841,860,863],{"href":861,"rel":862},"https://lore.kernel.org/git/Pine.LNX.4.58.0507262004320.3227@g5.osdl.org/",[],"Torvalds氏は濱野氏をGitプロジェクトの新たなメンテナーに任命しました","。Torvalds氏は引き続きGitにコントリビュートしているものの、徐々にGitプロジェクトへの関わりは薄れていきました。これは、Linuxプロジェクトの責任者として多忙を極めているため、当然のことでした。",[12,866,867],{},"現在でも、引き続き濱野氏がGitプロジェクトを率いています。",[19,869,871],{"id":870},"git-10","Git 1.0",[12,873,874],{},"濱野氏は、2025年12月21日にGitの最初のメジャーリリースを行いました。興味深いことに、バージョン0.99から1.0の間には、34回もリリースが行われました（0.99.1～0.99.7、0.99.7a～0.99.7d、0.99.8～0.99.8g、0.99.9～0.99.9n）。",[12,876,877,878,881],{},"0.99以降の特に重要なマイルストーンのひとつは、おそらく2つのツリーを相互にマージできる",[26,879,880],{},"git-merge(1)","コマンドの追加でしょう。それまでは基本的にファイルのマージを行う場合、ファイルごとにスクリプトを作成する必要があったことを考えると、非常に対照的です。",[348,883,884],{"id":884},"リモート",[12,886,887],{},"もう1つの大きな変化は、リモートリポジトリの省略記法が導入されたことです。すでにGitからリモートリポジトリを操作することはできましたが、変更をフェッチする際に毎回、対象のリポジトリのURLを指定する必要がありました。通常は同じリモートリポジトリと何度もやり取りを行うため、これはユーザーにとってかなり使い勝手の悪い仕様でした。",[12,889,890,891,894,895,898,899,903],{},"現在のremoteコマンドの仕組みはご存知だと思いますが、当時の仕組みはまだ大きく異なっていました。リモートリポジトリを管理するための",[26,892,893],{},"git-remote(1)","コマンドはまだ存在しておらず、リモートリポジトリの情報は",[26,896,897],{},".git/config","ファイルに保存すらされていませんでした。実のところ、バージョン0.99.2でremoteコマンドが最初に導入された際、Gitにはconfigファイル自体",[900,901,902],"em",{},"ありませんでした","。",[12,905,906,907,910],{},"代わりに、",[26,908,909],{},".git/branches","に直接ファイルを書き込んでリモートリポジトリの設定を行う必要がありました。今となってはあまり直感的な方法とは思えません。しかしながら、この仕組みは今でも動作します。",[33,912,914],{"className":35,"code":913,"language":37,"meta":38,"style":38},"$ git init repo --\nInitialized empty Git repository in /tmp/repo/.git/\n$ cd repo\n$ mkdir .git/branches\n$ echo https://gitlab.com/git-scm/git.git >.git/branches/origin\n$ git fetch origin refs/heads/master\n",[26,915,916,931,951,959,968,982],{"__ignoreMap":38},[42,917,918,920,922,925,928],{"class":44,"line":45},[42,919,49],{"class":48},[42,921,53],{"class":52},[42,923,924],{"class":52}," init",[42,926,927],{"class":52}," repo",[42,929,930],{"class":315}," --\n",[42,932,933,936,939,942,945,948],{"class":44,"line":62},[42,934,935],{"class":48},"Initialized",[42,937,938],{"class":52}," empty",[42,940,941],{"class":52}," Git",[42,943,944],{"class":52}," repository",[42,946,947],{"class":52}," in",[42,949,950],{"class":52}," /tmp/repo/.git/\n",[42,952,953,955,957],{"class":44,"line":77},[42,954,49],{"class":48},[42,956,279],{"class":52},[42,958,272],{"class":52},[42,960,961,963,965],{"class":44,"line":90},[42,962,49],{"class":48},[42,964,269],{"class":52},[42,966,967],{"class":52}," .git/branches\n",[42,969,970,972,974,977,979],{"class":44,"line":103},[42,971,49],{"class":48},[42,973,394],{"class":52},[42,975,976],{"class":52}," https://gitlab.com/git-scm/git.git",[42,978,401],{"class":400},[42,980,981],{"class":52},".git/branches/origin\n",[42,983,984,986,988,991,994],{"class":44,"line":116},[42,985,49],{"class":48},[42,987,53],{"class":52},[42,989,990],{"class":52}," fetch",[42,992,993],{"class":52}," origin",[42,995,996],{"class":52}," refs/heads/master\n",[12,998,999],{},"それだけではなく、その直後にGitバージョン0.99.5でディレクトリ名が「remotes」に変更されたため、現在のGitクライアントではリモートリポジトリの設定方法が全部で3つあります。",[12,1001,1002,1003,1005,1006,1009],{},"おそらく多くの方は、",[26,1004,909],{},"も",[26,1007,1008],{},".git/remotes","も使ったことがないと思います。これらはそれぞれ、2005年、および2011年以降、非推奨化されています。また、最終的にこれらのディレクトリは、Git 3.0で削除される予定です。",[19,1011,1013],{"id":1012},"gitのブランディング","Gitのブランディング",[12,1015,1016,1017,1020],{},"2007年に、Gitの最初のロゴが作成されました。これは、単に3つの緑のプラス記号の上に3つの赤いマイナス記号が配置された構成（",[26,1018,1019],{},"git diff","の出力がどのように見えるかを表していた）だったため、ロゴと呼べるかどうかについては、議論の余地があります。",[12,1022,1023],{},[1024,1025],"img",{"alt":1026,"src":1027},"git diffの出力がどのように見えるかを表し、3つの緑のプラス記号の上に3つの赤いマイナス記号が配置されている","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image3_aHR0cHM6_1750097387927.png",[12,1029,1030,1031,1036],{},"それから少し経った2008年に、ウェブサイト",[841,1032,1035],{"href":1033,"rel":1034},"https://git-scm.com",[],"git-scm.com","が公開されました。",[12,1038,1039],{},[1024,1040],{"alt":1041,"src":1042},"2026年時点でのgit-scm.comのランディングページ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image4_aHR0cHM6_1750097387930.png",[12,1044,1045,1046,1051],{},"2012年に、Scott Chacon氏とJason Long氏によって、Gitのウェブサイトは",[841,1047,1050],{"href":1048,"rel":1049},"https://lore.kernel.org/git/CAP2yMaJy=1c3b4F72h6jL_454+0ydEQNXYiC6E-ZeQQgE0PcVA@mail.gmail.com/",[],"リニューアル","されました。ご覧のように現在の外観にかなり近くなりました。",[12,1053,1054],{},[1024,1055],{"alt":1056,"src":1057},"2012年にリニューアルされたGitウェブサイト","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image2_aHR0cHM6_1750097387932.png",[12,1059,1060],{},"再デザインされたウェブサイトには、Jason Long氏がデザインし、今でも使用されている新しい赤橙色のロゴが目立つように掲載されていました。",[12,1062,1063],{},[1024,1064],{"alt":1065,"src":1066},"Gitロゴ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097388/Blog/Content%20Images/Blog/Content%20Images/image1_aHR0cHM6_1750097387934.png",[19,1068,1070],{"id":1069},"git-20","Git 2.0",[12,1072,1073],{},"Git 1.0のリリース時点で、すでに現在のGitとかなり同じようになってきたため、ここでGitの歴史をたどる旅の歩みをGit 2.0まで進めます。Git 1.0の約10年後にリリースされたこのバージョンは、中央ワークフローに後方互換性のない変更を意図的に含めた最初のリリースでした。",[348,1075,1077,1080],{"id":1076},"git-push1のデフォルトの動作",[26,1078,1079],{},"git-push(1)","のデフォルトの動作",[12,1082,1083,1084,1086],{},"このリリースで最も混乱を招いたのは、間違いなく",[26,1085,1079],{},"のデフォルトの動作が変更されたことです。",[12,1088,1089],{},"リモートリポジトリへのプッシュ時に何をプッシュするかを具体的に指定しなかった場合、Gitは以下のいずれかのアクションを取る可能性がありました。",[209,1091,1092,1095,1098,1101],{},[212,1093,1094],{},"Gitは何も実行せず、何をプッシュするか具体的な情報をユーザーに要求する。",[212,1096,1097],{},"その時点でチェックアウトされているブランチをプッシュする。",[212,1099,1100],{},"その時点でチェックアウトされているブランチをプッシュする（ただし、リモート側に対応するブランチがあることを確認できた場合に限る）。",[212,1102,1103],{},"リモート側に対応するブランチが存在する全ブランチをプッシュする。",[12,1105,1106],{},"現在のGitは、いわゆる「シンプル」な手法を採用しており、上記の3番目のアクションを行います。しかしながら、Git 2.0より前のバージョンにおけるデフォルトの動作は、「マッチング」手法を使用した上記の最後のアクションでした。",[12,1108,1109],{},"「マッチング」手法は、現在採用されている手法と比べて、はるかにリスクがありました。プッシュする前に毎回、リモート側に対応するブランチがあるすべてのローカルブランチをプッシュしても問題がないか確認する必要がありました。そうしないと、意図せずに変更がプッシュされてしまう可能性がありました。そこでリスクを軽減し、Gitを使い始めたばかりのユーザーにとって使い勝手をよくするために「シンプル」手法が採用されました。",[348,1111,1113],{"id":1112},"git-add1",[26,1114,1115],{},"git-add(1)",[12,1117,1118,1119,1121,1122,1124,1125,1128,1129,1131],{},"もう1つの大きな変化は、削除された追跡済みファイルに対する",[26,1120,1115],{},"のデフォルトの動作が変更されたことです。Git 2.0より前のバージョンでは、",[26,1123,1115],{},"は削除済みのファイルを自動的にステージングしませんでした。そのため、コミットに含めるには、",[26,1126,1127],{},"git-rm(1)","を使用して削除済みのファイルを1つずつ手動で追加する必要がありました。Git 2.0ではこの動作が変更され、",[26,1130,1115],{},"を実行すると、削除済みのファイルもインデックスに追加されるようになりました。",[19,1133,1135],{"id":1134},"gitコミュニティの業績を称えよう","Gitコミュニティの業績を称えよう",[12,1137,1138],{},"おそらくみなさんGitを日々活用しているかと思いますので、Gitの現在の仕組みについて細かくはここでは取り上げません。まだ活用していない方向けには、利用開始に役立つチュートリアルが多数用意されています。現在の仕組みについて説明する代わりに、Git誕生から20年経った今でも機能するように取り組んでくださったGitコミュニティの業績を称えたいと思います。",[12,1140,1141],{},"Gitは、その歴史の中で以下の実績を達成してきました。",[209,1143,1144,1147,1150],{},[212,1145,1146],{},"Git 2.49のリリース時点での累計コミット件数、56,721件",[212,1148,1149],{},"2,000人の個人のコントリビューターによるコントリビュート",[212,1151,1152],{},"公開されたメジャーリリース件数、60件",[12,1154,1155,1156,1161,1162,1167],{},"また、Gitプロジェクトは",[841,1157,1160],{"href":1158,"rel":1159},"https://summerofcode.withgoogle.com/",[],"Google Summer of Code（GSOC）","や",[841,1163,1166],{"href":1164,"rel":1165},"https://www.outreachy.org/",[],"Outreachy","にも参加しており、新たなコントリビューターが着実に増えています。このような新たなコントリビューターのおかげで、Gitプロジェクトは長期的に健全な状態を保てます。",[12,1169,1170],{},"この場を借りて、すべてのコントリビューターに心からお礼申し上げます。みなさんのコントリビュートのおかげで、Gitが実現しました。",[19,1172,1173],{"id":1173},"今後の展開",[12,1175,1176],{},"Gitがバージョン管理システムの競争で事実上勝利を収めたと言っても、異論はほとんどないでしょう。Gitは大きな市場シェアを占めており、Git以外のバージョン管理システムを使用しているオープンソースプロジェクトはほとんどありません。そう考えると、Gitが多くのことを正しく成し遂げてきたことは明らかです。",[12,1178,1179],{},"とは言っても、Gitの開発は完結したわけではなく、依存として多くの課題が残されています。その例が、以下のような技術的な課題です。",[209,1181,1182],{},[212,1183,1184],{},"古くなったコードベースのモダナイゼーション  - 拡大し続けるモノレポのサイズに合わせたスケーリング  - サイズの大きいバイナリファイルの処理の改善",[12,1186,1187],{},"それとは別に、以下のような社会的な課題もあります。",[209,1189,1190],{},[212,1191,1192],{},"Gitの使いやすさの向上  - 長期にわたってプロジェクトの健全性を確保することを目的とした、Gitコミュニティの育成\n取り組むべき作業は常にあります。次の20年もGitが素晴らしいバージョン管理システムであり続けられるよう、私たちGitLabもコントリビュートできることを誇りに思います。",[19,1194,1196],{"id":1195},"git関連のその他のリソース","Git関連のその他のリソース",[209,1198,1199,1206],{},[212,1200,1201],{},[841,1202,1205],{"href":1203,"rel":1204},"https://about.gitlab.com/blog/celebrating-gits-20th-anniversary-with-creator-linus-torvalds/",[],"Gitの生みの親であるLinus Torvalds氏と20周年を祝う",[212,1207,1208,1213,1214,1213,1219],{},[841,1209,1212],{"href":1210,"rel":1211},"https://about.gitlab.com/blog/whats-new-in-git-2-49-0/",[],"Git 2.49.0の新機能","  - ",[841,1215,1218],{"href":1216,"rel":1217},"https://about.gitlab.com/ja-jp/blog/whats-new-in-git-2-48-0/",[],"Git 2.48.0の新機能",[841,1220,1223],{"href":1221,"rel":1222},"https://about.gitlab.com/ja-jp/blog/a-beginners-guide-to-the-git-reftable-format/",[],"初心者向けGit reftableフォーマットガイド",[1225,1226,1227],"style",{},"html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sD7c4, html code.shiki .sD7c4{--shiki-default:#D73A49}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}",{"title":38,"searchDepth":62,"depth":62,"links":1229},[1230,1234,1235,1236,1239,1240,1245,1246,1247],{"id":21,"depth":62,"text":21,"children":1231},[1232,1233],{"id":350,"depth":77,"text":350},{"id":636,"depth":77,"text":636},{"id":796,"depth":62,"text":797},{"id":851,"depth":62,"text":852},{"id":870,"depth":62,"text":871,"children":1237},[1238],{"id":884,"depth":77,"text":884},{"id":1012,"depth":62,"text":1013},{"id":1069,"depth":62,"text":1070,"children":1241},[1242,1244],{"id":1076,"depth":77,"text":1243},"git-push(1)のデフォルトの動作",{"id":1112,"depth":77,"text":1115},{"id":1134,"depth":62,"text":1135},{"id":1173,"depth":62,"text":1173},{"id":1195,"depth":62,"text":1196},"open-source","2025-04-14","初めて行われたコミット、初期リリースのユニークな特徴、そしてgit-push(1)のデフォルト動作の変更によって生じた混乱について、一緒に振り返っていきましょう。","md",null,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750097380/Blog/Hero%20Images/Blog/Hero%20Images/git-20-years-opt2_TWNsNk8KH43b3jP0KLD0U_1750097380123.png",{},"/ja-jp/blog/journey-through-gits-20-year-history",{"title":5,"description":1250,"ogTitle":5,"ogDescription":1250,"noIndex":1257,"ogImage":1253,"ogUrl":1258,"ogSiteName":1259,"ogType":1260,"canonicalUrls":1258},false,"https://about.gitlab.com/blog/journey-through-gits-20-year-history","https://about.gitlab.com","article","journey-through-gits-20-year-history","ja-jp/blog/journey-through-gits-20-year-history",[1264,253],"open source","BlogPost","YLQeTmyZv15dwyXTamxL5Jm1fCj30eiyOpLS5GoihA8",{"logo":1268,"freeTrial":1273,"sales":1278,"login":1283,"items":1288,"search":1616,"minimal":1649,"duo":1666,"switchNav":1675,"pricingDeployment":1686},{"config":1269},{"href":1270,"dataGaName":1271,"dataGaLocation":1272},"/ja-jp/","gitlab logo","header",{"text":1274,"config":1275},"無料トライアルを開始",{"href":1276,"dataGaName":1277,"dataGaLocation":1272},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":1279,"config":1280},"デモをリクエスト",{"href":1281,"dataGaName":1282,"dataGaLocation":1272},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":1284,"config":1285},"サインイン",{"href":1286,"dataGaName":1287,"dataGaLocation":1272},"https://gitlab.com/users/sign_in/","sign in",[1289,1318,1420,1425,1538,1594],{"text":1290,"config":1291,"menu":1293},"プラットフォーム",{"dataNavLevelOne":1292},"platform",{"type":1294,"columns":1295},"cards",[1296,1302,1310],{"title":1290,"description":1297,"link":1298},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":1299,"config":1300},"プラットフォームの詳細はこちら",{"href":1301,"dataGaName":1292,"dataGaLocation":1272},"/ja-jp/platform/",{"title":1303,"description":1304,"link":1305},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":1306,"config":1307},"GitLab Duoのご紹介",{"href":1308,"dataGaName":1309,"dataGaLocation":1272},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1311,"description":1312,"link":1313},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":1314,"config":1315},"詳細はこちら",{"href":1316,"dataGaName":1317,"dataGaLocation":1272},"/ja-jp/why-gitlab/","why gitlab",{"text":1319,"left":618,"config":1320,"menu":1322},"製品",{"dataNavLevelOne":1321},"solutions",{"type":1323,"link":1324,"columns":1328,"feature":1399},"lists",{"text":1325,"config":1326},"すべてのソリューションを表示",{"href":1327,"dataGaName":1321,"dataGaLocation":1272},"/ja-jp/solutions/",[1329,1354,1377],{"title":1330,"description":1331,"link":1332,"items":1337},"自動化","CI/CDと自動化でデプロイを加速",{"config":1333},{"icon":1334,"href":1335,"dataGaName":1336,"dataGaLocation":1272},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[1338,1342,1345,1350],{"text":1339,"config":1340},"CI/CD",{"href":1341,"dataGaLocation":1272,"dataGaName":1339},"/ja-jp/solutions/continuous-integration/",{"text":1303,"config":1343},{"href":1308,"dataGaLocation":1272,"dataGaName":1344},"gitlab duo agent platform - product menu",{"text":1346,"config":1347},"ソースコード管理",{"href":1348,"dataGaLocation":1272,"dataGaName":1349},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":1351,"config":1352},"自動化されたソフトウェアデリバリー",{"href":1335,"dataGaLocation":1272,"dataGaName":1353},"Automated software delivery",{"title":1355,"description":1356,"link":1357,"items":1362},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":1358},{"href":1359,"dataGaName":1360,"dataGaLocation":1272,"icon":1361},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1363,1367,1372],{"text":1364,"config":1365},"アプリケーションセキュリティテスト",{"href":1359,"dataGaName":1366,"dataGaLocation":1272},"Application security testing",{"text":1368,"config":1369},"ソフトウェアサプライチェーンセキュリティ",{"href":1370,"dataGaLocation":1272,"dataGaName":1371},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":1373,"config":1374},"ソフトウェアコンプライアンス",{"href":1375,"dataGaName":1376,"dataGaLocation":1272},"/ja-jp/solutions/software-compliance/","software compliance",{"title":1378,"link":1379,"items":1384},"測定",{"config":1380},{"icon":1381,"href":1382,"dataGaName":1383,"dataGaLocation":1272},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[1385,1389,1394],{"text":1386,"config":1387},"可視性と測定",{"href":1382,"dataGaLocation":1272,"dataGaName":1388},"Visibility and Measurement",{"text":1390,"config":1391},"バリューストリーム管理",{"href":1392,"dataGaLocation":1272,"dataGaName":1393},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":1395,"config":1396},"分析とインサイト",{"href":1397,"dataGaLocation":1272,"dataGaName":1398},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":1400,"type":1323,"items":1401},"GitLabが活躍する場所",[1402,1408,1414],{"text":1403,"config":1404},"大企業",{"icon":1405,"href":1406,"dataGaLocation":1272,"dataGaName":1407},"Building","/ja-jp/enterprise/","enterprise",{"text":1409,"config":1410},"スモールビジネス",{"icon":1411,"href":1412,"dataGaLocation":1272,"dataGaName":1413},"Work","/ja-jp/small-business/","small business",{"text":1415,"config":1416},"公共部門",{"icon":1417,"href":1418,"dataGaLocation":1272,"dataGaName":1419},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":1421,"config":1422},"価格",{"href":1423,"dataGaName":1424,"dataGaLocation":1272,"dataNavLevelOne":1424},"/ja-jp/pricing/","pricing",{"text":1426,"config":1427,"menu":1429},"関連リソース",{"dataNavLevelOne":1428},"resources",{"type":1323,"link":1430,"columns":1434,"feature":1527},{"text":1431,"config":1432},"すべてのリソースを表示",{"href":1433,"dataGaName":1428,"dataGaLocation":1272},"/ja-jp/resources/",[1435,1468,1494],{"title":1436,"items":1437},"はじめに",[1438,1443,1448,1453,1458,1463],{"text":1439,"config":1440},"インストール",{"href":1441,"dataGaName":1442,"dataGaLocation":1272},"/ja-jp/install/","install",{"text":1444,"config":1445},"クイックスタートガイド",{"href":1446,"dataGaName":1447,"dataGaLocation":1272},"/ja-jp/get-started/","quick setup checklists",{"text":1449,"config":1450},"学ぶ",{"href":1451,"dataGaLocation":1272,"dataGaName":1452},"https://university.gitlab.com/","learn",{"text":1454,"config":1455},"製品ドキュメント",{"href":1456,"dataGaName":1457,"dataGaLocation":1272},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":1459,"config":1460},"ベストプラクティスビデオ",{"href":1461,"dataGaName":1462,"dataGaLocation":1272},"/ja-jp/getting-started-videos/","best practice videos",{"text":1464,"config":1465},"インテグレーション",{"href":1466,"dataGaName":1467,"dataGaLocation":1272},"/ja-jp/integrations/","integrations",{"title":1469,"items":1470},"検索する",[1471,1476,1481,1486,1490],{"text":1472,"config":1473},"お客様成功事例",{"href":1474,"dataGaName":1475,"dataGaLocation":1272},"/ja-jp/customers/","customer success stories",{"text":1477,"config":1478},"ブログ",{"href":1479,"dataGaName":1480,"dataGaLocation":1272},"/ja-jp/blog/","blog",{"text":1482,"config":1483},"Demo Hub",{"href":1484,"dataGaName":1485,"dataGaLocation":1272},"/ja-jp/demo-hub/","demo hub",{"text":1487,"config":1488},"The Source",{"href":1489,"dataGaName":1480,"dataGaLocation":1272},"/ja-jp/the-source/",{"text":884,"config":1491},{"href":1492,"dataGaName":1493,"dataGaLocation":1272},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1495,"items":1496},"つなげる",[1497,1502,1507,1512,1517,1522],{"text":1498,"config":1499},"GitLabサービス",{"href":1500,"dataGaName":1501,"dataGaLocation":1272},"/ja-jp/services/","services",{"text":1503,"config":1504},"コントリビュート",{"href":1505,"dataGaName":1506,"dataGaLocation":1272},"https://contributors.gitlab.com","contribute",{"text":1508,"config":1509},"コミュニティ",{"href":1510,"dataGaName":1511,"dataGaLocation":1272},"/community/","community",{"text":1513,"config":1514},"フォーラム",{"href":1515,"dataGaName":1516,"dataGaLocation":1272},"https://forum.gitlab.com/","forum",{"text":1518,"config":1519},"イベント",{"href":1520,"dataGaName":1521,"dataGaLocation":1272},"/events/","events",{"text":1523,"config":1524},"パートナー",{"href":1525,"dataGaName":1526,"dataGaLocation":1272},"/ja-jp/partners/","partners",{"config":1528,"title":1531,"text":1532,"link":1533},{"background":1529,"textColor":1530},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":1534,"config":1535},"最新情報を読む",{"href":1536,"dataGaName":1537,"dataGaLocation":1272},"/ja-jp/whats-new/","whats new",{"text":1539,"config":1540,"menu":1542},"企業情報",{"dataNavLevelOne":1541},"company",{"type":1323,"columns":1543},[1544],{"items":1545},[1546,1551,1557,1559,1564,1569,1574,1579,1584,1589],{"text":1547,"config":1548},"GitLabについて",{"href":1549,"dataGaName":1550,"dataGaLocation":1272},"/ja-jp/company/","about",{"text":1552,"config":1553,"footerGa":1556},"採用情報",{"href":1554,"dataGaName":1555,"dataGaLocation":1272},"/jobs/","jobs",{"dataGaName":1555},{"text":1518,"config":1558},{"href":1520,"dataGaName":1521,"dataGaLocation":1272},{"text":1560,"config":1561},"経営陣",{"href":1562,"dataGaName":1563,"dataGaLocation":1272},"/company/team/e-group/","leadership",{"text":1565,"config":1566},"ハンドブック",{"href":1567,"dataGaName":1568,"dataGaLocation":1272},"https://handbook.gitlab.com/","handbook",{"text":1570,"config":1571},"投資家向け情報",{"href":1572,"dataGaName":1573,"dataGaLocation":1272},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1575,"config":1576},"トラストセンター",{"href":1577,"dataGaName":1578,"dataGaLocation":1272},"/ja-jp/security/","trust center",{"text":1580,"config":1581},"AI Transparency Center",{"href":1582,"dataGaName":1583,"dataGaLocation":1272},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":1585,"config":1586},"ニュースレター",{"href":1587,"dataGaName":1588,"dataGaLocation":1272},"/company/contact/#contact-forms","newsletter",{"text":1590,"config":1591},"プレス",{"href":1592,"dataGaName":1593,"dataGaLocation":1272},"/press/","press",{"text":1595,"config":1596,"menu":1597},"お問い合わせ",{"dataNavLevelOne":1541},{"type":1323,"columns":1598},[1599],{"items":1600},[1601,1606,1611],{"text":1602,"config":1603},"お問い合わせはこちら",{"href":1604,"dataGaName":1605,"dataGaLocation":1272},"/ja-jp/sales/","talk to sales",{"text":1607,"config":1608},"サポートを受ける",{"href":1609,"dataGaName":1610,"dataGaLocation":1272},"https://support.gitlab.com/hc/en-us","support portal",{"text":1612,"config":1613},"カスタマーポータル",{"href":1614,"dataGaName":1615,"dataGaLocation":1272},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1617,"login":1618,"suggestions":1625},"閉じる",{"text":1619,"link":1620},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":1621,"config":1622},"GitLab.com",{"href":1286,"dataGaName":1623,"dataGaLocation":1624},"search login","search",{"text":1626,"default":1627},"提案",[1628,1630,1635,1637,1641,1645],{"text":1303,"config":1629},{"href":1308,"dataGaName":1303,"dataGaLocation":1624},{"text":1631,"config":1632},"コード提案（AI）",{"href":1633,"dataGaName":1634,"dataGaLocation":1624},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":1339,"config":1636},{"href":1341,"dataGaName":1339,"dataGaLocation":1624},{"text":1638,"config":1639},"GitLab on AWS",{"href":1640,"dataGaName":1638,"dataGaLocation":1624},"/ja-jp/partners/technology-partners/aws/",{"text":1642,"config":1643},"GitLab on Google Cloud",{"href":1644,"dataGaName":1642,"dataGaLocation":1624},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":1646,"config":1647},"GitLabを選ぶ理由",{"href":1316,"dataGaName":1648,"dataGaLocation":1624},"Why GitLab?",{"freeTrial":1650,"mobileIcon":1654,"desktopIcon":1659,"secondaryButton":1662},{"text":1274,"config":1651},{"href":1652,"dataGaName":1277,"dataGaLocation":1653},"https://gitlab.com/-/trials/new/","nav",{"altText":1655,"config":1656},"GitLabアイコン",{"src":1657,"dataGaName":1658,"dataGaLocation":1653},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1655,"config":1660},{"src":1661,"dataGaName":1658,"dataGaLocation":1653},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1436,"config":1663},{"href":1664,"dataGaName":1665,"dataGaLocation":1653},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":1667,"mobileIcon":1671,"desktopIcon":1673},{"text":1668,"config":1669},"GitLab Duoの詳細について",{"href":1308,"dataGaName":1670,"dataGaLocation":1653},"gitlab duo",{"altText":1655,"config":1672},{"src":1657,"dataGaName":1658,"dataGaLocation":1653},{"altText":1655,"config":1674},{"src":1661,"dataGaName":1658,"dataGaLocation":1653},{"button":1676,"mobileIcon":1681,"desktopIcon":1683},{"text":1677,"config":1678},"/switch",{"href":1679,"dataGaName":1680,"dataGaLocation":1653},"#contact","switch",{"altText":1655,"config":1682},{"src":1657,"dataGaName":1658,"dataGaLocation":1653},{"altText":1655,"config":1684},{"src":1685,"dataGaName":1658,"dataGaLocation":1653},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1687,"mobileIcon":1692,"desktopIcon":1694},{"text":1688,"config":1689},"料金ページに戻る",{"href":1423,"dataGaName":1690,"dataGaLocation":1653,"icon":1691},"back to pricing","GoBack",{"altText":1655,"config":1693},{"src":1657,"dataGaName":1658,"dataGaLocation":1653},{"altText":1655,"config":1695},{"src":1661,"dataGaName":1658,"dataGaLocation":1653},{"title":1697,"button":1698,"config":1702},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー",{"text":1314,"config":1699},{"href":1700,"dataGaName":1701,"dataGaLocation":1272},"/ja-jp/gitlab-orbit/","orbit",{"layout":1703,"disabled":1257},"release",{"data":1705},{"text":1706,"source":1707,"edit":1713,"contribute":1718,"config":1723,"items":1728,"minimal":1937},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":1708,"config":1709},"ページのソースを表示",{"href":1710,"dataGaName":1711,"dataGaLocation":1712},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1714,"config":1715},"このページを編集",{"href":1716,"dataGaName":1717,"dataGaLocation":1712},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1719,"config":1720},"ご協力をお願いします",{"href":1721,"dataGaName":1722,"dataGaLocation":1712},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1724,"facebook":1725,"youtube":1726,"linkedin":1727},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1729,1774,1827,1870,1904],{"title":1421,"links":1730,"subMenu":1745},[1731,1735,1740],{"text":1732,"config":1733},"プランの表示",{"href":1423,"dataGaName":1734,"dataGaLocation":1712},"view plans",{"text":1736,"config":1737},"Premiumを選ぶ理由",{"href":1738,"dataGaName":1739,"dataGaLocation":1712},"/ja-jp/pricing/premium/","why premium",{"text":1741,"config":1742},"Ultimateを選ぶ理由",{"href":1743,"dataGaName":1744,"dataGaLocation":1712},"/ja-jp/pricing/ultimate/","why ultimate",[1746],{"title":1595,"links":1747},[1748,1750,1752,1754,1759,1764,1769],{"text":1595,"config":1749},{"href":1604,"dataGaName":1282,"dataGaLocation":1712},{"text":1607,"config":1751},{"href":1609,"dataGaName":1610,"dataGaLocation":1712},{"text":1612,"config":1753},{"href":1614,"dataGaName":1615,"dataGaLocation":1712},{"text":1755,"config":1756},"ステータス",{"href":1757,"dataGaName":1758,"dataGaLocation":1712},"https://status.gitlab.com/","status",{"text":1760,"config":1761},"利用規約",{"href":1762,"dataGaName":1763,"dataGaLocation":1712},"/terms/","terms of use",{"text":1765,"config":1766},"プライバシーに関する声明",{"href":1767,"dataGaName":1768,"dataGaLocation":1712},"/ja-jp/privacy/","privacy statement",{"text":1770,"config":1771},"Cookie 優先設定",{"dataGaName":1772,"dataGaLocation":1712,"id":1773,"isOneTrustButton":618},"cookie preferences","ot-sdk-btn",{"title":1319,"links":1775,"subMenu":1784},[1776,1780],{"text":1777,"config":1778},"DevSecOpsプラットフォーム",{"href":1301,"dataGaName":1779,"dataGaLocation":1712},"devsecops platform",{"text":1781,"config":1782},"AI支援開発",{"href":1308,"dataGaName":1783,"dataGaLocation":1712},"ai-assisted development",[1785],{"title":1786,"links":1787},"トピック",[1788,1792,1797,1802,1807,1812,1817,1822],{"text":1339,"config":1789},{"href":1790,"dataGaName":1791,"dataGaLocation":1712},"/ja-jp/topics/ci-cd/","cicd",{"text":1793,"config":1794},"GitOps",{"href":1795,"dataGaName":1796,"dataGaLocation":1712},"/ja-jp/topics/gitops/","gitops",{"text":1798,"config":1799},"DevOps",{"href":1800,"dataGaName":1801,"dataGaLocation":1712},"/ja-jp/topics/devops/","devops",{"text":1803,"config":1804},"バージョン管理",{"href":1805,"dataGaName":1806,"dataGaLocation":1712},"/ja-jp/topics/version-control/","version control",{"text":1808,"config":1809},"DevSecOps",{"href":1810,"dataGaName":1811,"dataGaLocation":1712},"/ja-jp/topics/devsecops/","devsecops",{"text":1813,"config":1814},"クラウドネイティブ",{"href":1815,"dataGaName":1816,"dataGaLocation":1712},"/ja-jp/topics/cloud-native/","cloud native",{"text":1818,"config":1819},"コーディングのためのAI",{"href":1820,"dataGaName":1821,"dataGaLocation":1712},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":1823,"config":1824},"エージェント型AI",{"href":1825,"dataGaName":1826,"dataGaLocation":1712},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":1828,"links":1829},"ソリューション",[1830,1833,1835,1840,1844,1847,1850,1853,1855,1857,1860,1865],{"text":1364,"config":1831},{"href":1359,"dataGaName":1832,"dataGaLocation":1712},"Application Security Testing",{"text":1351,"config":1834},{"href":1335,"dataGaName":1336,"dataGaLocation":1712},{"text":1836,"config":1837},"アジャイル開発",{"href":1838,"dataGaName":1839,"dataGaLocation":1712},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":1841,"config":1842},"SCM",{"href":1348,"dataGaName":1843,"dataGaLocation":1712},"source code management",{"text":1339,"config":1845},{"href":1341,"dataGaName":1846,"dataGaLocation":1712},"continuous integration & delivery",{"text":1390,"config":1848},{"href":1392,"dataGaName":1849,"dataGaLocation":1712},"value stream management",{"text":1793,"config":1851},{"href":1852,"dataGaName":1796,"dataGaLocation":1712},"/ja-jp/solutions/gitops/",{"text":1403,"config":1854},{"href":1406,"dataGaName":1407,"dataGaLocation":1712},{"text":1409,"config":1856},{"href":1412,"dataGaName":1413,"dataGaLocation":1712},{"text":1858,"config":1859},"公共機関",{"href":1418,"dataGaName":1419,"dataGaLocation":1712},{"text":1861,"config":1862},"教育",{"href":1863,"dataGaName":1864,"dataGaLocation":1712},"/ja-jp/solutions/education/","education",{"text":1866,"config":1867},"金融サービス",{"href":1868,"dataGaName":1869,"dataGaLocation":1712},"/ja-jp/solutions/finance/","financial services",{"title":1871,"links":1872},"リソース",[1873,1875,1877,1879,1883,1885,1888,1890,1892,1894,1896,1898,1900,1902],{"text":1439,"config":1874},{"href":1441,"dataGaName":1442,"dataGaLocation":1712},{"text":1444,"config":1876},{"href":1446,"dataGaName":1447,"dataGaLocation":1712},{"text":1449,"config":1878},{"href":1451,"dataGaName":1452,"dataGaLocation":1712},{"text":1454,"config":1880},{"href":1881,"dataGaName":1882,"dataGaLocation":1712},"https://docs.gitlab.com/ja-jp","docs",{"text":1477,"config":1884},{"href":1479,"dataGaName":1480,"dataGaLocation":1712},{"text":1886,"config":1887},"最新リリース",{"href":1536,"dataGaName":1537,"dataGaLocation":1712},{"text":1472,"config":1889},{"href":1474,"dataGaName":1475,"dataGaLocation":1712},{"text":884,"config":1891},{"href":1492,"dataGaName":1493,"dataGaLocation":1712},{"text":1498,"config":1893},{"href":1500,"dataGaName":1501,"dataGaLocation":1712},{"text":1503,"config":1895},{"href":1505,"dataGaName":1506,"dataGaLocation":1712},{"text":1508,"config":1897},{"href":1510,"dataGaName":1511,"dataGaLocation":1712},{"text":1513,"config":1899},{"href":1515,"dataGaName":1516,"dataGaLocation":1712},{"text":1518,"config":1901},{"href":1520,"dataGaName":1521,"dataGaLocation":1712},{"text":1523,"config":1903},{"href":1525,"dataGaName":1526,"dataGaLocation":1712},{"title":1905,"links":1906},"会社情報",[1907,1909,1911,1913,1915,1917,1921,1926,1928,1930,1932],{"text":1547,"config":1908},{"href":1549,"dataGaName":1541,"dataGaLocation":1712},{"text":1552,"config":1910},{"href":1554,"dataGaName":1555,"dataGaLocation":1712},{"text":1560,"config":1912},{"href":1562,"dataGaName":1563,"dataGaLocation":1712},{"text":1565,"config":1914},{"href":1567,"dataGaName":1568,"dataGaLocation":1712},{"text":1570,"config":1916},{"href":1572,"dataGaName":1573,"dataGaLocation":1712},{"text":1918,"config":1919},"Sustainability",{"href":1920,"dataGaName":1918,"dataGaLocation":1712},"/sustainability/",{"text":1922,"config":1923},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":1924,"dataGaName":1925,"dataGaLocation":1712},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1575,"config":1927},{"href":1577,"dataGaName":1578,"dataGaLocation":1712},{"text":1585,"config":1929},{"href":1587,"dataGaName":1588,"dataGaLocation":1712},{"text":1590,"config":1931},{"href":1592,"dataGaName":1593,"dataGaLocation":1712},{"text":1933,"config":1934},"現代奴隷制の透明性に関する声明",{"href":1935,"dataGaName":1936,"dataGaLocation":1712},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1938},[1939,1941,1944],{"text":1760,"config":1940},{"href":1762,"dataGaName":1763,"dataGaLocation":1712},{"text":1942,"config":1943},"Cookieの設定",{"dataGaName":1772,"dataGaLocation":1712,"id":1773,"isOneTrustButton":618},{"text":1765,"config":1945},{"href":1767,"dataGaName":1768,"dataGaLocation":1712},[1947],{"id":1948,"title":7,"body":1252,"config":1949,"content":1951,"description":1252,"extension":1955,"meta":1956,"navigation":618,"path":1957,"seo":1958,"stem":1959,"__hash__":1960},"blogAuthors/en-us/blog/authors/patrick-steinhardt.yml",{"template":1950},"BlogAuthor",{"name":7,"config":1952},{"headshot":1953,"ctfId":1954},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749661952/Blog/Author%20Headshots/pks-gitlab-headshot.png","pksgitlab","yml",{},"/en-us/blog/authors/patrick-steinhardt",{},"en-us/blog/authors/patrick-steinhardt","SV9Yd_vW69UbvntDP-SEOV9NKT_VwUAj5nfftf2ElSw",[1962,1970,1978],{"title":1963,"description":1964,"heroImage":1965,"category":1248,"date":1966,"authors":1967,"slug":1969,"externalUrl":1252},"GitLab AIハッカソン2026：受賞者発表","約7,000人の開発者がGitLab Duo Agent Platform上で600以上のAIエージェントとフローを構築したハッカソンの結果をご紹介。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1776457632/llddiylsgwuze0u1rjks.png","2026-04-22",[1968],"Nick Veenhof","gitlab-ai-hackathon-2026-meet-the-winners",{"title":1971,"description":1972,"heroImage":1973,"category":1248,"date":1974,"authors":1975,"slug":1977,"externalUrl":1252},"git mergeコマンドの基本を徹底解説","この記事では、git mergeコマンドについてコマンドの基本的な使い方からリクエストコードまで解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1754287290/averr2ecwl01q2f9lknf.jpg","2025-08-04",[1976],"GitLab Team","git-merge-command-overview",{"title":1979,"description":1980,"heroImage":1981,"category":1248,"date":1982,"authors":1983,"slug":1984,"externalUrl":1252},"オープンソースソフトウェア（OSS）とは？詳しく解説​","オープンソースの意味や、メリットとデメリットについて、分かりやすく解説します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1752720740/g9x8oi988xuhioglpczi.jpg","2025-07-17",[1976],"what-is-open-source",{"promotions":1986},[1987,2001,2013,2025],{"id":1988,"categories":1989,"header":1991,"text":1992,"button":1993,"image":1998},"ai-modernization",[1990],"ai","AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":1994,"config":1995},"AI成熟度スコアを確認する",{"href":1996,"dataGaName":1997,"dataGaLocation":1480},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":1999},{"src":2000},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":2002,"categories":2003,"header":2005,"text":1992,"button":2006,"image":2010},"devops-modernization",[2004,1811],"product","単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":2007,"config":2008},"DevOps成熟度スコアを確認しましょう",{"href":2009,"dataGaName":1997,"dataGaLocation":1480},"/ja-jp/assessments/devops-modernization-assessment/",{"config":2011},{"src":2012},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":2014,"categories":2015,"header":2017,"text":1992,"button":2018,"image":2022},"security-modernization",[2016],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":2019,"config":2020},"セキュリティ成熟度スコアを確認しましょう",{"href":2021,"dataGaName":1997,"dataGaLocation":1480},"/ja-jp/assessments/security-modernization-assessment/",{"config":2023},{"src":2024},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":2026,"paths":2027,"header":2030,"text":2031,"button":2032,"image":2037},"github-azure-migration",[2028,2029],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":2033,"config":2034},"GitLabとGitHubの比較を見る",{"href":2035,"dataGaName":2036,"dataGaLocation":1480},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":2038},{"src":2012},{"header":2040,"blurb":2041,"button":2042,"secondaryButton":2046},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":1274,"config":2043},{"href":2044,"dataGaName":1277,"dataGaLocation":2045},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":1595,"config":2047},{"href":1604,"dataGaName":1282,"dataGaLocation":2045},1786803783001]