[{"data":1,"prerenderedAt":1618},["ShallowReactive",2],{"/ja-jp/blog/keeping-git-commit-history-clean":3,"navigation-ja-jp":837,"banner-ja-jp":1267,"footer-ja-jp":1275,"blog-post-authors-ja-jp-Kushal Pandya":1517,"blog-related-posts-ja-jp-keeping-git-commit-history-clean":1532,"blog-promotions-ja-jp":1555,"next-steps-ja-jp":1609},{"id":4,"title":5,"authors":6,"body":8,"category":816,"date":817,"description":818,"extension":819,"externalUrl":820,"faq":820,"featured":821,"heroImage":822,"meta":823,"navigation":824,"path":825,"seo":826,"slug":830,"stem":831,"tags":832,"template":834,"updatedDate":835,"__hash__":836},"blogPosts/ja-jp/blog/keeping-git-commit-history-clean.md"," git Commit（コミット）の履歴が重要な理由とその整理方法",[7],"Kushal Pandya",{"type":9,"value":10,"toc":800},"minimark",[11,15,37,41,44,47,74,77,90,94,97,142,145,184,191,195,205,255,269,277,281,287,294,304,320,328,331,362,368,387,396,410,415,419,422,425,431,438,456,467,470,476,479,485,491,503,508,511,517,524,527,535,538,565,571,577,585,594,599,602,607,610,617,621,624,631,743,746,750,759,773,776,796],[12,13,14],"h2",{"id":14},"目次",[16,17,18,22,25,28,31,34],"ul",{},[19,20,21],"li",{},"git コミットの履歴が重要な理由",[19,23,24],{},"直前のgitコミットメッセージを変更する",[19,26,27],{},"２つ以上前のgitコミットの内容を修正する",[19,29,30],{},"修正用に作ったgitコマンドは元のコミットと組み合わせて履歴をクリーンに保つ",[19,32,33],{},"gitコミットのセーフティネット reflogs",[19,35,36],{},"gitコミットを整理して、未来の開発に備えよう",[38,39,40],"p",{},"gitコミットは、リポジトリの重要な要素のひとつであり、コミットメッセージはリポジトリの履歴ログでもあります。プロジェクトやリポジトリがチームメンバーに編集・更新（新機能の追加、バグ修正、アーキテクチャのリファクタリングなど）されていくなかで、コミットメッセージは何がどのように変更されたのかを知るための重要な手掛かりとなります。そのため、コミットメッセージは基本的な変更を、簡潔かつ正確に反映することが求められます。",[12,42,21],{"id":43},"git-コミットの履歴が重要な理由",[38,45,46],{},"gitコミットメッセージは、あなたが触れたコードに残す指紋のようなものです。あなたが今日コミットしたコードには、一年後に同じ変更を見たときにもすぐに理解できるよう、簡潔で正確なメッセージが添えてあるべきです。gitコミットがコンテキストに基づいて分割されていれば、該当のコミットで発生したバグを素早く見つけられ、バグの原因となるコミットを元通りに修正することができます。大規模なプロジェクトで作業していると、常に多数の更新、追加、削除が発生します。そのような場合に、適切なコミットメッセージの記載は不可欠になります。この記事では、gitリポジトリでの作業中に開発者がよく使うgitコミットについて解説していきます。\nこの記事では、git の基本的な知識、ブランチの仕組み、ブランチの未コミットの変更をステージングす方法、変更をコミットする方法について理解していることを前提としています。これらの流れがよくわからないという方は、こちらのGitLabドキュメントもご参照ください。",[16,48,49,56,62,68],{},[19,50,51],{},[52,53,55],"a",{"href":54},"#situation-1-i-need-to-change-the-most-recent-commit","Situation 1: I need to change the most recent commit",[19,57,58],{},[52,59,61],{"href":60},"#situation-2-i-need-to-change-a-specific-commit","Situation 2: I need to change a specific commit",[19,63,64],{},[52,65,67],{"href":66},"#situation-3-i-need-to-add-remove-or-combine-commits","Situation 3: I need to add, remove, or combine commits",[19,69,70],{},[52,71,73],{"href":72},"#situation-4-my-commit-history-doesnt-make-sense-i-need-a-fresh-start","Situation 4: My commit history doesn't make sense, I need a fresh start!",[38,75,76],{},"But before we dive in, let's quickly go through what a typical development workflow looks like in our hypothetical Ruby application.",[38,78,79,83,84,89],{},[80,81,82],"strong",{},"Note:"," This article assumes that you are aware about basics of Git, how branches work, how to add uncommitted changes of a branch to stage and how to commit the changes. If you're unsure of these flows, ",[52,85,88],{"href":86,"rel":87},"https://docs.gitlab.com/ja-jp/topics/git/",[],"our documentation"," is a great starting point.",[12,91,93],{"id":92},"a-day-in-the-life","A day in the life",[38,95,96],{},"Here, we are working on a small Ruby on Rails project where we need to add a navigation view on the homepage and that involves updating and adding several files. Following is a step by step breakdown of the entire flow:",[16,98,99,106,112,118,124,139],{},[19,100,101,102],{},"You start working on a feature with updating a single file; let's call it ",[103,104,105],"code",{},"application_controller.rb",[19,107,108,109],{},"This feature requires you to also update a view: ",[103,110,111],{},"index.html.haml",[19,113,114,115],{},"You added a partial which is used in index page: ",[103,116,117],{},"_navigation.html.haml",[19,119,120,121],{},"Styles for the page also need to be updated to reflect the partial we added: ",[103,122,123],{},"styles.css.scss",[19,125,126,127],{},"Feature is now ready with the desired changes, time to also update tests; files to be updated are as follows:\n",[16,128,129,134],{},[19,130,131],{},[103,132,133],{},"application_controller_spec.rb",[19,135,136],{},[103,137,138],{},"navigation_spec.rb",[19,140,141],{},"Tests are updated and passing as expected, now time to commit the changes!",[38,143,144],{},"Since all the files belong to different territories of the architecture, we commit the changes isolated of each other to ensure that each commit represents a certain context and is made in a certain order. I usually prefer backend -> frontend order where most backend-centric change is committed first, followed by the middle layer and then by frontend-centric changes in the Git list commits.",[146,147,148,160,170,177],"ol",{},[19,149,150,152,153,155,156,159],{},[103,151,105],{}," & ",[103,154,133],{},"; ",[80,157,158],{},"Add routes for navigation",".",[19,161,162,164,165,155,167,159],{},[103,163,117],{}," &  ",[103,166,138],{},[80,168,169],{},"Page Navigation View",[19,171,172,155,174,159],{},[103,173,111],{},[80,175,176],{},"Render navigation partial",[19,178,179,155,181,159],{},[103,180,123],{},[80,182,183],{},"Add styles for navigation",[38,185,186,187,190],{},"Now that we have our changes committed, we create a merge request with the branch. Once you have merge request open, it typically gets reviewed by your peer before the changes are merged into repo's ",[103,188,189],{},"master"," branch. Now let's learn what different situations we may end up with during code review.",[12,192,194],{"id":193},"situation-1-how-to-change-the-most-recent-git-commit","Situation 1: How to change the most recent Git commit",[38,196,197,198,200,201,204],{},"Imagine a case where the reviewer looked at ",[103,199,123],{}," and suggested a change. In such a case, it is very simple to do the change as the stylesheet changes are part of ",[80,202,203],{},"last"," commit on your branch. Here's how we can handle this;",[16,206,207,213,219,247,252],{},[19,208,209,210,212],{},"You directly do the necessary changes to ",[103,211,123],{}," in your current branch.",[19,214,215,216,159],{},"Once you're done with the changes, add these changes to stage; run ",[103,217,218],{},"git add styles.css.scss",[19,220,221,222,226,227,230,231],{},"Once changes are staged, we need to ",[223,224,225],"em",{},"add"," these changes to our last commit; run ",[103,228,229],{},"git commit --amend",".\n",[16,232,233],{},[19,234,235,238,239,242,243,246],{},[80,236,237],{},"Command breakdown",": Here, we're asking the ",[103,240,241],{},"git commit"," command to ",[223,244,245],{},"amend"," whatever changes are present in stage to the most recent commit.",[19,248,249,250,159],{},"This will open your last commit in your Git-defined text editor which has the commit message ",[80,251,183],{},[19,253,254],{},"Since we only updated the CSS declaration, we don't need to alter the commit message. At this point, you can just save and exit the text editor that Git opened for you and your changes will be reflected in the commit.",[38,256,257,258,261,262,265,266,268],{},"Since you modified an existing Git commit, these changes are required to be ",[223,259,260],{},"force pushed"," to your remote repo using ",[103,263,264],{},"git push --force-with-lease \u003Cremote_name> \u003Cbranch_name>",". This command will override the commit ",[103,267,183],{}," on remote repo with updated commit that we just made in our local repo.",[38,270,271,272,159],{},"One thing to keep in mind while force pushing branches is that if you are working on the same branch with multiple people, force pushing may cause trouble for other users when they try to normally push their changes on a remote branch that has new commits force pushed. Hence, use this feature wisely. You can learn more about Git force push options ",[52,273,276],{"href":274,"rel":275},"https://git-scm.com/docs/git-push#git-push---no-force-with-lease",[],"here",[12,278,280],{"id":279},"situation-2-how-to-change-a-specific-git-commit-changes","Situation 2: How to change a specific Git commit changes",[38,282,283,284,286],{},"In the previous situation, the Git commit change was rather simple as we had to modify only our last Git commit, but imagine if reviewer suggested to change something in ",[103,285,117],{},". In this case, it is second commit from the top, so changing it won't be as direct as it was in the first situation. Let's see how we can handle this:",[38,288,289,290,293],{},"Whenever a commit is made in a branch, it is identified by a unique SHA-1 hash string. Think of it as a unique ID that separates one commit from another. You can view all the previous commits, along with their SHA-1 hashes in a branch by running the ",[103,291,292],{},"git log"," command. With this, you would see an output that looks somewhat as follows and is a list of commits, where the most recent commits are at the top;",[295,296,302],"pre",{"className":297,"code":299,"language":300,"meta":301},[298],"language-text","commit aa0a35a867ed2094da60042062e8f3d6000e3952 (HEAD -> add-page-navigation)\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 15:24:02 2018 +0530\n\n    Add styles for navigation\n\ncommit c22a3fa0c5cdc175f2b8232b9704079d27c619d0\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 08:42:52 2018 +0000\n\n    Render navigation partial\n\ncommit 4155df1cdc7be01c98b0773497ff65c22ba1549f\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 08:42:51 2018 +0000\n\n    Page Navigation View\n\ncommit 8d74af102941aa0b51e1a35b8ad731284e4b5a20\nAuthor: Kushal Pandya \u003Ckushal@gitlab.com>\nDate: Wed May 2 08:12:20 2018 +0000\n\n    Add routes for navigation\n\n","text","",[103,303,299],{"__ignoreMap":301},[38,305,306,307,310,311,313,314,317,318,159],{},"This is where ",[103,308,309],{},"git rebase"," command comes into play. Whenever we wish to edit a specific commit with ",[103,312,309],{},", we need to first rebase our branch by moving back HEAD to the point right ",[223,315,316],{},"before"," the commit we wish to edit. In our case, we need to change the commit that reads ",[103,319,169],{},[38,321,322,327],{},[323,324],"img",{"alt":325,"src":326},"Commit Log","https://res.cloudinary.com/about-gitlab-com/image/upload/v1782398597/blog/Content%20Images/keeping-git-commit-history-clean/GitRebase.png","{: .shadow.center.medium}",[38,329,330],{},"Here, notice the hash of commit which is right before the commit we want to modify; copy the hash and perform the following steps:",[16,332,333,355],{},[19,334,335,336,339],{},"Rebase the branch to move to commit before our target commit; run ",[103,337,338],{},"git rebase -i 8d74af102941aa0b51e1a35b8ad731284e4b5a20",[16,340,341],{},[19,342,343,346,347,350,351,354],{},[80,344,345],{},"Git command breakdown",": Here we're running Git's ",[103,348,349],{},"rebase"," command with ",[223,352,353],{},"interactive"," mode with provided SHA-1 hash as commit to rebase to.",[19,356,357,358,361],{},"This will run rebase command for Git in interactive mode and will open your text editor showing all of your commits that came ",[223,359,360],{},"after"," the commit you rebased to. It will look somewhat like this:",[295,363,366],{"className":364,"code":365,"language":300,"meta":301},[298],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\npick aa0a35a867e Add styles for navigation\n\n# Rebase 8d74af10294..aa0a35a867e onto 8d74af10294 (3 commands)\n#\n# Commands:\n# p, pick = use commit\n# r, reword = use commit, but edit the commit message\n# e, edit = use commit, but stop for amending\n# s, squash = use commit, but meld into previous commit\n# f, fixup = like \"squash\", but discard this commit's log message\n# x, exec = run command (the rest of the line) using shell\n# d, drop = remove Git commit\n#\n# These lines can be re-ordered; they are executed from top to bottom.\n#\n# If you remove a line here THAT COMMIT WILL BE LOST.\n#\n# However, if you remove everything, the rebase will be aborted.\n#\n# Note that empty commits are commented out\n",[103,367,365],{"__ignoreMap":301},[38,369,370,371,374,375,378,379,382,383,386],{},"Notice how each commit has a word ",[103,372,373],{},"pick"," in front of it, and in the contents below, there are all possible keywords we can use. Since we want to ",[223,376,377],{},"edit"," a commit, we need to change ",[103,380,381],{},"pick 4155df1cdc7 Page Navigation View"," to ",[103,384,385],{},"edit 4155df1cdc7 Page Navigation View",". Save the changes and exit editor.",[38,388,389,390,392,393,159],{},"Now your branch is rebased to the point in time right before the commit you made which included ",[103,391,117],{},". Open the file and perform desired changes as per the review feedback. Once you're done with the changes, stage them by running ",[103,394,395],{},"git add _navigation.html.haml",[38,397,398,399,402,403,405,406,409],{},"Since we have staged the changes, it is time to move branch HEAD back to the commit we originally had (while also including the new changes we added), run ",[103,400,401],{},"git rebase --continue",", this will open your default editor in the terminal and show you the commit message that we edited during rebase; ",[103,404,169],{},". You can change this message if you wish, but we would leave it as it is for now, so save and exit the editor. At this point, Git will replay all the commits that followed after the commit you just edited and now branch ",[103,407,408],{},"HEAD"," is back to the top commit we originally had, and it also includes the new changes you made to one of the commits.",[38,411,412,413,159],{},"Since we again modified a commit that's already present in remote repo, we need force push this branch again using ",[103,414,264],{},[12,416,418],{"id":417},"situation-3-how-to-add-remove-or-combine-git-commits","Situation 3: How to add, remove, or combine Git commits",[38,420,421],{},"A common situation is when you've made several commits just to fix something previously committed. Now let's reduce them as much as we can, combining them with the original commits.",[38,423,424],{},"All you need to do is start the interactive rebase as you would in the other scenarios.",[295,426,429],{"className":427,"code":428,"language":300,"meta":301},[298],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\npick aa0a35a867e Add styles for navigation\npick 62e858a322 Fix a typo\npick 5c25eb48c8 Ops another fix\npick 7f0718efe9 Fix 2\npick f0ffc19ef7 Argh Another fix!\n",[103,430,428],{"__ignoreMap":301},[38,432,433,434,437],{},"Now imagine you want to combine all those fixes into ",[103,435,436],{},"c22a3fa0c5c Render navigation partial",". You just need to:",[146,439,440,443],{},[19,441,442],{},"Move the fixes up so that they are right below the commit you want to keep in the end.",[19,444,445,446,382,448,451,452,455],{},"Change ",[103,447,373],{},[103,449,450],{},"squash"," or ",[103,453,454],{},"fixup"," for each of the fixes.",[38,457,458,460,461,463,464,466],{},[223,459,82],{}," ",[103,462,450],{}," keeps the git fix commit messages in the description. ",[103,465,454],{}," will forget the commit messages of the fixes and keep the original.",[38,468,469],{},"You'll end up with something like this:",[295,471,474],{"className":472,"code":473,"language":300,"meta":301},[298],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\nfixup 62e858a322 Fix a typo\nfixup 5c25eb48c8 Ops another fix\nfixup 7f0718efe9 Fix 2\nfixup f0ffc19ef7 Argh Another fix!\npick aa0a35a867e Add styles for navigation\n",[103,475,473],{"__ignoreMap":301},[38,477,478],{},"Save the changes, exit the editor, and you're done! This is the resulting history:",[295,480,483],{"className":481,"code":482,"language":300,"meta":301},[298],"pick 4155df1cdc7 Page Navigation View\npick 96373c0bcf Render navigation partial\npick aa0a35a867e Add styles for navigation\n",[103,484,482],{"__ignoreMap":301},[38,486,487,488,490],{},"As before, all you need to do now is ",[103,489,264],{}," and the changes are up.",[38,492,493,494,451,496,498,499,502],{},"If you want to remove a Git commit from branch altogether, instead of ",[103,495,450],{},[103,497,454],{},", just write ",[103,500,501],{},"drop"," or simply delete that line.",[504,505,507],"h3",{"id":506},"how-to-avoid-git-commit-conflicts","How to avoid Git commit conflicts",[38,509,510],{},"To avoid conflicts, make sure the commits you're moving up the timeline aren't touching the same files touched by the commits left after them.",[295,512,515],{"className":513,"code":514,"language":300,"meta":301},[298],"pick 4155df1cdc7 Page Navigation View\npick c22a3fa0c5c Render navigation partial\nfixup 62e858a322 Fix a typo                 # this changes styles.css\nfixup 5c25eb48c8 Ops another fix            # this changes image/logo.svg\nfixup 7f0718efe9 Fix 2                      # this changes styles.css\nfixup f0ffc19ef7 Argh Another fix!          # this changes styles.css\npick aa0a35a867e Add styles for navigation  # this changes index.html (no conflict)\n",[103,516,514],{"__ignoreMap":301},[504,518,520,521,523],{"id":519},"pro-tip-quick-git-commit-fixups","Pro-tip: Quick Git commit ",[103,522,454],{},"s",[38,525,526],{},"If you know exactly which commit you want to fixup, when committing you don't have to waste brain cycles thinking of good temporary names for \"Fix 1\", \"Fix 2\", ..., \"Fix 42\".",[38,528,529],{},[80,530,531,532],{},"Step 1: Meet ",[103,533,534],{},"--fixup",[38,536,537],{},"After you've staged the changes fixing whatever it is that needs fixing, just Git commit all the changes like this:",[295,539,543],{"className":540,"code":541,"language":542,"meta":301,"style":301},"language-shell shiki shiki-themes github-light","git commit --fixup c22a3fa0c5c\n","shell",[103,544,545],{"__ignoreMap":301},[546,547,550,554,558,562],"span",{"class":548,"line":549},"line",1,[546,551,553],{"class":552},"s7eDp","git",[546,555,557],{"class":556},"sYBdl"," commit",[546,559,561],{"class":560},"sYu0t"," --fixup",[546,563,564],{"class":556}," c22a3fa0c5c\n",[38,566,567,568,570],{},"(Note that this is the hash for the commit ",[103,569,436],{},")",[38,572,573,574,159],{},"This will generate this commit message: ",[103,575,576],{},"fixup! Render navigation partial",[38,578,579],{},[80,580,581,582],{},"Step 2: And the sidekick ",[103,583,584],{},"--autosquash",[38,586,587,588,590,591,593],{},"Easy interactive rebase. You can have ",[103,589,553],{}," place the ",[103,592,454],{},"s automatically in the right place.",[38,595,596],{},[103,597,598],{},"git rebase -i 4155df1cdc7 --autosquash",[38,600,601],{},"History will be shown like so:",[295,603,605],{"className":604,"code":473,"language":300,"meta":301},[298],[103,606,473],{"__ignoreMap":301},[38,608,609],{},"Ready for you to just review and proceed.",[38,611,612,613,616],{},"If you're feeling adventurous you can do a non-interactive rebase ",[103,614,615],{},"git rebase --autosquash",", but only if you like living dangerously, as you'll have no opportunity to review the squashes being made before they're applied.",[12,618,620],{"id":619},"situation-4-my-git-commit-history-doesnt-make-sense-i-need-a-fresh-start","Situation 4: My Git commit history doesn't make sense, I need a fresh start!",[38,622,623],{},"If we're working on a large feature, it is common to have several fixup and review-feedback changes that are being committed frequently. Instead of constantly rebasing the branch, we can leave the cleaning up of Git commits until the end of development.",[38,625,626,627,630],{},"This is where creating patch files is extremely handy. In fact, patch files were the primary way of sharing code over email while collaborating on large open source projects before Git-based services like GitLab were available to developers. Imagine you have one such branch (eg; ",[103,628,629],{},"add-page-navigation",") where there are tons of commits that don't convey the underlying changes clearly. Here's how you can create a patch file for all the changes you made in this branch:",[16,632,633,639,655,694,697,700,709,719,728,731,737,740],{},[19,634,635,636,638],{},"The first step to create the patch file is to make sure that your branch has all the changes present from ",[103,637,189],{}," branch and has no conflicts with the same.",[19,640,641,642,451,645,648,649,651,652,654],{},"You can run ",[103,643,644],{},"git rebase master",[103,646,647],{},"git merge master"," while you're checked out in ",[103,650,629],{}," branch to get all the changes from ",[103,653,189],{}," on to your branch.",[19,656,657,658,230,661],{},"Now create the patch file; run ",[103,659,660],{},"git diff master add-page-navigation > ~/add_page_navigation.patch",[16,662,663],{},[19,664,665,667,668,671,672,674,675,677,678,681,682,685,686,689,690,693],{},[80,666,237],{},": Here we're using Git's ",[223,669,670],{},"diff"," feature, and asking for a diff between ",[103,673,189],{}," branch and ",[103,676,629],{}," branch, and ",[223,679,680],{},"redirecting"," the output (via ",[103,683,684],{},">"," symbol) to a file named ",[103,687,688],{},"add_page_navigation.patch"," in our user home directory (typically ",[103,691,692],{},"~/"," in *nix operating systems).",[19,695,696],{},"You can specify any path you wish to keep this file in and the file name and extension could be anything you want.",[19,698,699],{},"Once the command is run and you don't see any errors, the patch file is generated.",[19,701,702,703,705,706,159],{},"Now checkout ",[103,704,189],{}," branch; run ",[103,707,708],{},"git checkout master",[19,710,711,712,714,715,718],{},"Delete the branch ",[103,713,629],{}," from local repo; run ",[103,716,717],{},"git branch -D add-page-navigation",". Remember, we already have changes of this branch in a created patch file.",[19,720,721,722,724,725,159],{},"Now create a new branch with the same name (while ",[103,723,189],{}," is checked out); run ",[103,726,727],{},"git checkout -b add-page-navigation",[19,729,730],{},"At this point, this is a fresh branch and doesn't have any of your changes.",[19,732,733,734,159],{},"Finally, apply your changes from the patch file; ",[103,735,736],{},"git apply ~/add_page_navigation.patch",[19,738,739],{},"Here, all of your changes are applied in a branch and they will appear as uncommitted, as if all your modification where done, but none of the modifications were actually committed in the branch.",[19,741,742],{},"Now you can go ahead and commit individual files or files grouped by area of impact in the order you want with concise commit messages.",[38,744,745],{},"As with previous situations, we basically modified the whole branch, so it is time to force push!",[12,747,749],{"id":748},"git-commit-history-conclusion","Git commit history: Conclusion",[38,751,752,753,758],{},"While we have covered most common and basic situations that arise in a day-to-day workflow with Git, rewriting Git history is a vast topic and as you get familiar with above tips, you can learn more advanced concepts around the subject in the ",[52,754,757],{"href":755,"rel":756},"https://git-scm.com/book/en/v2/Git-Tools-Rewriting-History",[],"Git Official Documentation",". Happy git'ing!",[38,760,761,762,767,768],{},"Photo by ",[52,763,766],{"href":764,"rel":765},"https://unsplash.com/photos/pj-BrFZ9eAA?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"pan xiaozhen"," on ",[52,769,772],{"href":770,"rel":771},"https://unsplash.com/search/photos/clean?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText",[],"Unsplash",[774,775],"blockquote",{},[38,777,778,781,783,460,791,793],{},[779,780],"br",{},[779,782],{},[223,784,785,786],{},"監修：知念 梨果 ",[52,787,790],{"href":788,"rel":789},"https://gitlab.com/rikachinen",[],"@rikachinen",[779,792],{},[223,794,795],{},"（GitLab合同会社 カスタマーサクセス本部 カスタマーサクセスエンジニア）",[797,798,799],"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 pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}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);}",{"title":301,"searchDepth":801,"depth":801,"links":802},2,[803,804,805,806,807,808,814,815],{"id":14,"depth":801,"text":14},{"id":43,"depth":801,"text":21},{"id":92,"depth":801,"text":93},{"id":193,"depth":801,"text":194},{"id":279,"depth":801,"text":280},{"id":417,"depth":801,"text":418,"children":809},[810,812],{"id":506,"depth":811,"text":507},3,{"id":519,"depth":811,"text":813},"Pro-tip: Quick Git commit fixups",{"id":619,"depth":801,"text":620},{"id":748,"depth":801,"text":749},"engineering","2018-06-07","git コミット履歴は、煩雑になりがち。gitコミットのメッセージ履歴をクリーンに保ち、変更内容を把握する方法とその重要性をご紹介します。","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659457/Blog/Hero%20Images/keep-git-commit-history-clean.jpg",{},true,"/ja-jp/blog/keeping-git-commit-history-clean",{"title":5,"description":818,"ogTitle":5,"ogDescription":818,"noIndex":821,"ogImage":822,"ogUrl":827,"ogSiteName":828,"ogType":829,"canonicalUrls":827},"https://about.gitlab.com/blog/keeping-git-commit-history-clean","https://about.gitlab.com","article","keeping-git-commit-history-clean","ja-jp/blog/keeping-git-commit-history-clean",[553,833],"workflow","BlogPost","2025-06-12","ymsy_OS-9DbiQ97MkK5KIZVyPhmvgJ9j6opYYa1-MkE",{"logo":838,"freeTrial":843,"sales":848,"login":853,"items":858,"search":1187,"minimal":1220,"duo":1237,"switchNav":1246,"pricingDeployment":1257},{"config":839},{"href":840,"dataGaName":841,"dataGaLocation":842},"/ja-jp/","gitlab logo","header",{"text":844,"config":845},"無料トライアルを開始",{"href":846,"dataGaName":847,"dataGaLocation":842},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp&glm_content=default-saas-trial/","free trial",{"text":849,"config":850},"デモをリクエスト",{"href":851,"dataGaName":852,"dataGaLocation":842},"/ja-jp/sales/?contact-topic=request-demo","sales",{"text":854,"config":855},"サインイン",{"href":856,"dataGaName":857,"dataGaLocation":842},"https://gitlab.com/users/sign_in/","sign in",[859,888,990,995,1109,1165],{"text":860,"config":861,"menu":863},"プラットフォーム",{"dataNavLevelOne":862},"platform",{"type":864,"columns":865},"cards",[866,872,880],{"title":860,"description":867,"link":868},"DevSecOpsに特化したインテリジェントオーケストレーションプラットフォーム",{"text":869,"config":870},"プラットフォームの詳細はこちら",{"href":871,"dataGaName":862,"dataGaLocation":842},"/ja-jp/platform/",{"title":873,"description":874,"link":875},"GitLab Duo Agent Platform","ソフトウェアライフサイクル全体を支えるエージェント型AI",{"text":876,"config":877},"GitLab Duoのご紹介",{"href":878,"dataGaName":879,"dataGaLocation":842},"/ja-jp/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":881,"description":882,"link":883},"GitLabが選ばれる理由","エンタープライズがGitLabを選ぶ主な理由をご覧ください",{"text":884,"config":885},"詳細はこちら",{"href":886,"dataGaName":887,"dataGaLocation":842},"/ja-jp/why-gitlab/","why gitlab",{"text":889,"left":824,"config":890,"menu":892},"製品",{"dataNavLevelOne":891},"solutions",{"type":893,"link":894,"columns":898,"feature":969},"lists",{"text":895,"config":896},"すべてのソリューションを表示",{"href":897,"dataGaName":891,"dataGaLocation":842},"/ja-jp/solutions/",[899,924,947],{"title":900,"description":901,"link":902,"items":907},"自動化","CI/CDと自動化でデプロイを加速",{"config":903},{"icon":904,"href":905,"dataGaName":906,"dataGaLocation":842},"AutomatedCodeAlt","/ja-jp/solutions/delivery-automation/","automated software delivery",[908,912,915,920],{"text":909,"config":910},"CI/CD",{"href":911,"dataGaLocation":842,"dataGaName":909},"/ja-jp/solutions/continuous-integration/",{"text":873,"config":913},{"href":878,"dataGaLocation":842,"dataGaName":914},"gitlab duo agent platform - product menu",{"text":916,"config":917},"ソースコード管理",{"href":918,"dataGaLocation":842,"dataGaName":919},"/ja-jp/solutions/source-code-management/","Source Code Management",{"text":921,"config":922},"自動化されたソフトウェアデリバリー",{"href":905,"dataGaLocation":842,"dataGaName":923},"Automated software delivery",{"title":925,"description":926,"link":927,"items":932},"セキュリティ","セキュリティを犠牲にすることなくコード作成を高速化",{"config":928},{"href":929,"dataGaName":930,"dataGaLocation":842,"icon":931},"/ja-jp/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[933,937,942],{"text":934,"config":935},"アプリケーションセキュリティテスト",{"href":929,"dataGaName":936,"dataGaLocation":842},"Application security testing",{"text":938,"config":939},"ソフトウェアサプライチェーンセキュリティ",{"href":940,"dataGaLocation":842,"dataGaName":941},"/ja-jp/solutions/supply-chain/","Software supply chain security",{"text":943,"config":944},"ソフトウェアコンプライアンス",{"href":945,"dataGaName":946,"dataGaLocation":842},"/ja-jp/solutions/software-compliance/","software compliance",{"title":948,"link":949,"items":954},"測定",{"config":950},{"icon":951,"href":952,"dataGaName":953,"dataGaLocation":842},"DigitalTransformation","/ja-jp/solutions/visibility-measurement/","visibility and measurement",[955,959,964],{"text":956,"config":957},"可視性と測定",{"href":952,"dataGaLocation":842,"dataGaName":958},"Visibility and Measurement",{"text":960,"config":961},"バリューストリーム管理",{"href":962,"dataGaLocation":842,"dataGaName":963},"/ja-jp/solutions/value-stream-management/","Value Stream Management",{"text":965,"config":966},"分析とインサイト",{"href":967,"dataGaLocation":842,"dataGaName":968},"/ja-jp/solutions/analytics-and-insights/","Analytics and insights",{"title":970,"type":893,"items":971},"GitLabが活躍する場所",[972,978,984],{"text":973,"config":974},"大企業",{"icon":975,"href":976,"dataGaLocation":842,"dataGaName":977},"Building","/ja-jp/enterprise/","enterprise",{"text":979,"config":980},"スモールビジネス",{"icon":981,"href":982,"dataGaLocation":842,"dataGaName":983},"Work","/ja-jp/small-business/","small business",{"text":985,"config":986},"公共部門",{"icon":987,"href":988,"dataGaLocation":842,"dataGaName":989},"Organization","/ja-jp/solutions/public-sector/","public sector",{"text":991,"config":992},"価格",{"href":993,"dataGaName":994,"dataGaLocation":842,"dataNavLevelOne":994},"/ja-jp/pricing/","pricing",{"text":996,"config":997,"menu":999},"関連リソース",{"dataNavLevelOne":998},"resources",{"type":893,"link":1000,"columns":1004,"feature":1098},{"text":1001,"config":1002},"すべてのリソースを表示",{"href":1003,"dataGaName":998,"dataGaLocation":842},"/ja-jp/resources/",[1005,1038,1065],{"title":1006,"items":1007},"はじめに",[1008,1013,1018,1023,1028,1033],{"text":1009,"config":1010},"インストール",{"href":1011,"dataGaName":1012,"dataGaLocation":842},"/ja-jp/install/","install",{"text":1014,"config":1015},"クイックスタートガイド",{"href":1016,"dataGaName":1017,"dataGaLocation":842},"/ja-jp/get-started/","quick setup checklists",{"text":1019,"config":1020},"学ぶ",{"href":1021,"dataGaLocation":842,"dataGaName":1022},"https://university.gitlab.com/","learn",{"text":1024,"config":1025},"製品ドキュメント",{"href":1026,"dataGaName":1027,"dataGaLocation":842},"https://docs.gitlab.com/ja-jp/","product documentation",{"text":1029,"config":1030},"ベストプラクティスビデオ",{"href":1031,"dataGaName":1032,"dataGaLocation":842},"/ja-jp/getting-started-videos/","best practice videos",{"text":1034,"config":1035},"インテグレーション",{"href":1036,"dataGaName":1037,"dataGaLocation":842},"/ja-jp/integrations/","integrations",{"title":1039,"items":1040},"検索する",[1041,1046,1051,1056,1060],{"text":1042,"config":1043},"お客様成功事例",{"href":1044,"dataGaName":1045,"dataGaLocation":842},"/ja-jp/customers/","customer success stories",{"text":1047,"config":1048},"ブログ",{"href":1049,"dataGaName":1050,"dataGaLocation":842},"/ja-jp/blog/","blog",{"text":1052,"config":1053},"Demo Hub",{"href":1054,"dataGaName":1055,"dataGaLocation":842},"/ja-jp/demo-hub/","demo hub",{"text":1057,"config":1058},"The Source",{"href":1059,"dataGaName":1050,"dataGaLocation":842},"/ja-jp/the-source/",{"text":1061,"config":1062},"リモート",{"href":1063,"dataGaName":1064,"dataGaLocation":842},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1066,"items":1067},"つなげる",[1068,1073,1078,1083,1088,1093],{"text":1069,"config":1070},"GitLabサービス",{"href":1071,"dataGaName":1072,"dataGaLocation":842},"/ja-jp/services/","services",{"text":1074,"config":1075},"コントリビュート",{"href":1076,"dataGaName":1077,"dataGaLocation":842},"https://contributors.gitlab.com","contribute",{"text":1079,"config":1080},"コミュニティ",{"href":1081,"dataGaName":1082,"dataGaLocation":842},"/community/","community",{"text":1084,"config":1085},"フォーラム",{"href":1086,"dataGaName":1087,"dataGaLocation":842},"https://forum.gitlab.com/","forum",{"text":1089,"config":1090},"イベント",{"href":1091,"dataGaName":1092,"dataGaLocation":842},"/events/","events",{"text":1094,"config":1095},"パートナー",{"href":1096,"dataGaName":1097,"dataGaLocation":842},"/ja-jp/partners/","partners",{"config":1099,"title":1102,"text":1103,"link":1104},{"background":1100,"textColor":1101},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","GitLabの最新情報","最新の機能と改善点に関する情報をお届けします。",{"text":1105,"config":1106},"最新情報を読む",{"href":1107,"dataGaName":1108,"dataGaLocation":842},"/ja-jp/whats-new/","whats new",{"text":1110,"config":1111,"menu":1113},"企業情報",{"dataNavLevelOne":1112},"company",{"type":893,"columns":1114},[1115],{"items":1116},[1117,1122,1128,1130,1135,1140,1145,1150,1155,1160],{"text":1118,"config":1119},"GitLabについて",{"href":1120,"dataGaName":1121,"dataGaLocation":842},"/ja-jp/company/","about",{"text":1123,"config":1124,"footerGa":1127},"採用情報",{"href":1125,"dataGaName":1126,"dataGaLocation":842},"/jobs/","jobs",{"dataGaName":1126},{"text":1089,"config":1129},{"href":1091,"dataGaName":1092,"dataGaLocation":842},{"text":1131,"config":1132},"経営陣",{"href":1133,"dataGaName":1134,"dataGaLocation":842},"/company/team/e-group/","leadership",{"text":1136,"config":1137},"ハンドブック",{"href":1138,"dataGaName":1139,"dataGaLocation":842},"https://handbook.gitlab.com/","handbook",{"text":1141,"config":1142},"投資家向け情報",{"href":1143,"dataGaName":1144,"dataGaLocation":842},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1146,"config":1147},"トラストセンター",{"href":1148,"dataGaName":1149,"dataGaLocation":842},"/ja-jp/security/","trust center",{"text":1151,"config":1152},"AI Transparency Center",{"href":1153,"dataGaName":1154,"dataGaLocation":842},"/ja-jp/ai-transparency-center/","ai transparency center",{"text":1156,"config":1157},"ニュースレター",{"href":1158,"dataGaName":1159,"dataGaLocation":842},"/company/contact/#contact-forms","newsletter",{"text":1161,"config":1162},"プレス",{"href":1163,"dataGaName":1164,"dataGaLocation":842},"/press/","press",{"text":1166,"config":1167,"menu":1168},"お問い合わせ",{"dataNavLevelOne":1112},{"type":893,"columns":1169},[1170],{"items":1171},[1172,1177,1182],{"text":1173,"config":1174},"お問い合わせはこちら",{"href":1175,"dataGaName":1176,"dataGaLocation":842},"/ja-jp/sales/","talk to sales",{"text":1178,"config":1179},"サポートを受ける",{"href":1180,"dataGaName":1181,"dataGaLocation":842},"https://support.gitlab.com/hc/en-us","support portal",{"text":1183,"config":1184},"カスタマーポータル",{"href":1185,"dataGaName":1186,"dataGaLocation":842},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1188,"login":1189,"suggestions":1196},"閉じる",{"text":1190,"link":1191},"リポジトリとプロジェクトを検索するには、次にログインします",{"text":1192,"config":1193},"GitLab.com",{"href":856,"dataGaName":1194,"dataGaLocation":1195},"search login","search",{"text":1197,"default":1198},"提案",[1199,1201,1206,1208,1212,1216],{"text":873,"config":1200},{"href":878,"dataGaName":873,"dataGaLocation":1195},{"text":1202,"config":1203},"コード提案（AI）",{"href":1204,"dataGaName":1205,"dataGaLocation":1195},"/ja-jp/solutions/code-suggestions/","Code Suggestions (AI)",{"text":909,"config":1207},{"href":911,"dataGaName":909,"dataGaLocation":1195},{"text":1209,"config":1210},"GitLab on AWS",{"href":1211,"dataGaName":1209,"dataGaLocation":1195},"/ja-jp/partners/technology-partners/aws/",{"text":1213,"config":1214},"GitLab on Google Cloud",{"href":1215,"dataGaName":1213,"dataGaLocation":1195},"/ja-jp/partners/technology-partners/google-cloud-platform/",{"text":1217,"config":1218},"GitLabを選ぶ理由",{"href":886,"dataGaName":1219,"dataGaLocation":1195},"Why GitLab?",{"freeTrial":1221,"mobileIcon":1225,"desktopIcon":1230,"secondaryButton":1233},{"text":844,"config":1222},{"href":1223,"dataGaName":847,"dataGaLocation":1224},"https://gitlab.com/-/trials/new/","nav",{"altText":1226,"config":1227},"GitLabアイコン",{"src":1228,"dataGaName":1229,"dataGaLocation":1224},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1226,"config":1231},{"src":1232,"dataGaName":1229,"dataGaLocation":1224},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1006,"config":1234},{"href":1235,"dataGaName":1236,"dataGaLocation":1224},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/ja-jp/get-started/","get started",{"freeTrial":1238,"mobileIcon":1242,"desktopIcon":1244},{"text":1239,"config":1240},"GitLab Duoの詳細について",{"href":878,"dataGaName":1241,"dataGaLocation":1224},"gitlab duo",{"altText":1226,"config":1243},{"src":1228,"dataGaName":1229,"dataGaLocation":1224},{"altText":1226,"config":1245},{"src":1232,"dataGaName":1229,"dataGaLocation":1224},{"button":1247,"mobileIcon":1252,"desktopIcon":1254},{"text":1248,"config":1249},"/switch",{"href":1250,"dataGaName":1251,"dataGaLocation":1224},"#contact","switch",{"altText":1226,"config":1253},{"src":1228,"dataGaName":1229,"dataGaLocation":1224},{"altText":1226,"config":1255},{"src":1256,"dataGaName":1229,"dataGaLocation":1224},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1258,"mobileIcon":1263,"desktopIcon":1265},{"text":1259,"config":1260},"料金ページに戻る",{"href":993,"dataGaName":1261,"dataGaLocation":1224,"icon":1262},"back to pricing","GoBack",{"altText":1226,"config":1264},{"src":1228,"dataGaName":1229,"dataGaLocation":1224},{"altText":1226,"config":1266},{"src":1232,"dataGaName":1229,"dataGaLocation":1224},{"title":1268,"button":1269,"config":1273},"GitLab Orbitが登場: AIエージェントのためのコンテキストレイヤー",{"text":884,"config":1270},{"href":1271,"dataGaName":1272,"dataGaLocation":842},"/ja-jp/gitlab-orbit/","orbit",{"layout":1274,"disabled":821},"release",{"data":1276},{"text":1277,"source":1278,"edit":1284,"contribute":1289,"config":1294,"items":1299,"minimal":1508},"GitはSoftware Freedom Conservancyの商標です。当社は「GitLab」をライセンスに基づいて使用しています",{"text":1279,"config":1280},"ページのソースを表示",{"href":1281,"dataGaName":1282,"dataGaLocation":1283},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1285,"config":1286},"このページを編集",{"href":1287,"dataGaName":1288,"dataGaLocation":1283},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1290,"config":1291},"ご協力をお願いします",{"href":1292,"dataGaName":1293,"dataGaLocation":1283},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1295,"facebook":1296,"youtube":1297,"linkedin":1298},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1300,1345,1398,1441,1475],{"title":991,"links":1301,"subMenu":1316},[1302,1306,1311],{"text":1303,"config":1304},"プランの表示",{"href":993,"dataGaName":1305,"dataGaLocation":1283},"view plans",{"text":1307,"config":1308},"Premiumを選ぶ理由",{"href":1309,"dataGaName":1310,"dataGaLocation":1283},"/ja-jp/pricing/premium/","why premium",{"text":1312,"config":1313},"Ultimateを選ぶ理由",{"href":1314,"dataGaName":1315,"dataGaLocation":1283},"/ja-jp/pricing/ultimate/","why ultimate",[1317],{"title":1166,"links":1318},[1319,1321,1323,1325,1330,1335,1340],{"text":1166,"config":1320},{"href":1175,"dataGaName":852,"dataGaLocation":1283},{"text":1178,"config":1322},{"href":1180,"dataGaName":1181,"dataGaLocation":1283},{"text":1183,"config":1324},{"href":1185,"dataGaName":1186,"dataGaLocation":1283},{"text":1326,"config":1327},"ステータス",{"href":1328,"dataGaName":1329,"dataGaLocation":1283},"https://status.gitlab.com/","status",{"text":1331,"config":1332},"利用規約",{"href":1333,"dataGaName":1334,"dataGaLocation":1283},"/terms/","terms of use",{"text":1336,"config":1337},"プライバシーに関する声明",{"href":1338,"dataGaName":1339,"dataGaLocation":1283},"/ja-jp/privacy/","privacy statement",{"text":1341,"config":1342},"Cookie 優先設定",{"dataGaName":1343,"dataGaLocation":1283,"id":1344,"isOneTrustButton":824},"cookie preferences","ot-sdk-btn",{"title":889,"links":1346,"subMenu":1355},[1347,1351],{"text":1348,"config":1349},"DevSecOpsプラットフォーム",{"href":871,"dataGaName":1350,"dataGaLocation":1283},"devsecops platform",{"text":1352,"config":1353},"AI支援開発",{"href":878,"dataGaName":1354,"dataGaLocation":1283},"ai-assisted development",[1356],{"title":1357,"links":1358},"トピック",[1359,1363,1368,1373,1378,1383,1388,1393],{"text":909,"config":1360},{"href":1361,"dataGaName":1362,"dataGaLocation":1283},"/ja-jp/topics/ci-cd/","cicd",{"text":1364,"config":1365},"GitOps",{"href":1366,"dataGaName":1367,"dataGaLocation":1283},"/ja-jp/topics/gitops/","gitops",{"text":1369,"config":1370},"DevOps",{"href":1371,"dataGaName":1372,"dataGaLocation":1283},"/ja-jp/topics/devops/","devops",{"text":1374,"config":1375},"バージョン管理",{"href":1376,"dataGaName":1377,"dataGaLocation":1283},"/ja-jp/topics/version-control/","version control",{"text":1379,"config":1380},"DevSecOps",{"href":1381,"dataGaName":1382,"dataGaLocation":1283},"/ja-jp/topics/devsecops/","devsecops",{"text":1384,"config":1385},"クラウドネイティブ",{"href":1386,"dataGaName":1387,"dataGaLocation":1283},"/ja-jp/topics/cloud-native/","cloud native",{"text":1389,"config":1390},"コーディングのためのAI",{"href":1391,"dataGaName":1392,"dataGaLocation":1283},"/ja-jp/topics/devops/ai-for-coding/","ai for coding",{"text":1394,"config":1395},"エージェント型AI",{"href":1396,"dataGaName":1397,"dataGaLocation":1283},"/ja-jp/topics/agentic-ai/","agentic ai",{"title":1399,"links":1400},"ソリューション",[1401,1404,1406,1411,1415,1418,1421,1424,1426,1428,1431,1436],{"text":934,"config":1402},{"href":929,"dataGaName":1403,"dataGaLocation":1283},"Application Security Testing",{"text":921,"config":1405},{"href":905,"dataGaName":906,"dataGaLocation":1283},{"text":1407,"config":1408},"アジャイル開発",{"href":1409,"dataGaName":1410,"dataGaLocation":1283},"/ja-jp/solutions/agile-delivery/","agile delivery",{"text":1412,"config":1413},"SCM",{"href":918,"dataGaName":1414,"dataGaLocation":1283},"source code management",{"text":909,"config":1416},{"href":911,"dataGaName":1417,"dataGaLocation":1283},"continuous integration & delivery",{"text":960,"config":1419},{"href":962,"dataGaName":1420,"dataGaLocation":1283},"value stream management",{"text":1364,"config":1422},{"href":1423,"dataGaName":1367,"dataGaLocation":1283},"/ja-jp/solutions/gitops/",{"text":973,"config":1425},{"href":976,"dataGaName":977,"dataGaLocation":1283},{"text":979,"config":1427},{"href":982,"dataGaName":983,"dataGaLocation":1283},{"text":1429,"config":1430},"公共機関",{"href":988,"dataGaName":989,"dataGaLocation":1283},{"text":1432,"config":1433},"教育",{"href":1434,"dataGaName":1435,"dataGaLocation":1283},"/ja-jp/solutions/education/","education",{"text":1437,"config":1438},"金融サービス",{"href":1439,"dataGaName":1440,"dataGaLocation":1283},"/ja-jp/solutions/finance/","financial services",{"title":1442,"links":1443},"リソース",[1444,1446,1448,1450,1454,1456,1459,1461,1463,1465,1467,1469,1471,1473],{"text":1009,"config":1445},{"href":1011,"dataGaName":1012,"dataGaLocation":1283},{"text":1014,"config":1447},{"href":1016,"dataGaName":1017,"dataGaLocation":1283},{"text":1019,"config":1449},{"href":1021,"dataGaName":1022,"dataGaLocation":1283},{"text":1024,"config":1451},{"href":1452,"dataGaName":1453,"dataGaLocation":1283},"https://docs.gitlab.com/ja-jp","docs",{"text":1047,"config":1455},{"href":1049,"dataGaName":1050,"dataGaLocation":1283},{"text":1457,"config":1458},"最新リリース",{"href":1107,"dataGaName":1108,"dataGaLocation":1283},{"text":1042,"config":1460},{"href":1044,"dataGaName":1045,"dataGaLocation":1283},{"text":1061,"config":1462},{"href":1063,"dataGaName":1064,"dataGaLocation":1283},{"text":1069,"config":1464},{"href":1071,"dataGaName":1072,"dataGaLocation":1283},{"text":1074,"config":1466},{"href":1076,"dataGaName":1077,"dataGaLocation":1283},{"text":1079,"config":1468},{"href":1081,"dataGaName":1082,"dataGaLocation":1283},{"text":1084,"config":1470},{"href":1086,"dataGaName":1087,"dataGaLocation":1283},{"text":1089,"config":1472},{"href":1091,"dataGaName":1092,"dataGaLocation":1283},{"text":1094,"config":1474},{"href":1096,"dataGaName":1097,"dataGaLocation":1283},{"title":1476,"links":1477},"会社情報",[1478,1480,1482,1484,1486,1488,1492,1497,1499,1501,1503],{"text":1118,"config":1479},{"href":1120,"dataGaName":1112,"dataGaLocation":1283},{"text":1123,"config":1481},{"href":1125,"dataGaName":1126,"dataGaLocation":1283},{"text":1131,"config":1483},{"href":1133,"dataGaName":1134,"dataGaLocation":1283},{"text":1136,"config":1485},{"href":1138,"dataGaName":1139,"dataGaLocation":1283},{"text":1141,"config":1487},{"href":1143,"dataGaName":1144,"dataGaLocation":1283},{"text":1489,"config":1490},"Sustainability",{"href":1491,"dataGaName":1489,"dataGaLocation":1283},"/sustainability/",{"text":1493,"config":1494},"ダイバーシティ、インクルージョン、ビロンギング（DIB）",{"href":1495,"dataGaName":1496,"dataGaLocation":1283},"/ja-jp/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1146,"config":1498},{"href":1148,"dataGaName":1149,"dataGaLocation":1283},{"text":1156,"config":1500},{"href":1158,"dataGaName":1159,"dataGaLocation":1283},{"text":1161,"config":1502},{"href":1163,"dataGaName":1164,"dataGaLocation":1283},{"text":1504,"config":1505},"現代奴隷制の透明性に関する声明",{"href":1506,"dataGaName":1507,"dataGaLocation":1283},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1509},[1510,1512,1515],{"text":1331,"config":1511},{"href":1333,"dataGaName":1334,"dataGaLocation":1283},{"text":1513,"config":1514},"Cookieの設定",{"dataGaName":1343,"dataGaLocation":1283,"id":1344,"isOneTrustButton":824},{"text":1336,"config":1516},{"href":1338,"dataGaName":1339,"dataGaLocation":1283},[1518],{"id":1519,"title":7,"body":820,"config":1520,"content":1522,"description":820,"extension":1526,"meta":1527,"navigation":824,"path":1528,"seo":1529,"stem":1530,"__hash__":1531},"blogAuthors/en-us/blog/authors/kushal-pandya.yml",{"template":1521},"BlogAuthor",{"name":7,"config":1523},{"headshot":1524,"ctfId":1525},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749659454/Blog/Author%20Headshots/kushalpandya-headshot.png","kushalpandya","yml",{},"/en-us/blog/authors/kushal-pandya",{},"en-us/blog/authors/kushal-pandya","5usuoILmHesSGmSO_7xZlme00WJWoDZxY1ccCfTzrwY",[1533,1540,1547],{"title":1534,"description":1534,"heroImage":1535,"category":816,"date":1536,"authors":1537,"slug":1539,"externalUrl":820},"MCPサーバーとは？仕組みやソフトウェア開発の活用例をわかりやすく解説","https://res.cloudinary.com/about-gitlab-com/image/upload/v1786001428/qedvughylmeposoqm5zs.jpg","2026-08-07",[1538],"GitLab Team","what-is-mcp-server",{"title":1541,"description":1542,"heroImage":1543,"category":816,"date":1544,"authors":1545,"slug":1546,"externalUrl":820},"イテレーションとは？意味や進め方、おすすめの支援ツールを紹介","イテレーションとは、アジャイル開発における「反復」を意味する開発単位です。本記事では、イテレーションの意味やスプリントとの違い、具体的な進め方、成功のポイントをわかりやすく解説します。アジャイル開発を支援するツールもあわせて紹介します。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1785816755/mj23yaguu0gxvbztd6pl.jpg","2026-08-06",[1538],"what-is-iteration",{"title":1548,"description":1549,"heroImage":1550,"category":816,"date":1544,"authors":1551,"slug":1554,"externalUrl":820},"GitLab Self-Hostedで実現するコンフィデンシャルAI","ソースコードをハードウェアで暗号化された境界の外に出すことなく、GitLab DuoのAIコーディングエージェントを開発者に提供します。GPUは不要です。","https://res.cloudinary.com/about-gitlab-com/image/upload/v1773866173/vte9qh8rriznvyclhkes.png",[1552,1553],"Mathias Ewald","Martin Paloncy, Edgeless Systems","confidential-ai-for-gitlab-self-hosted",{"promotions":1556},[1557,1571,1583,1595],{"id":1558,"categories":1559,"header":1561,"text":1562,"button":1563,"image":1568},"ai-modernization",[1560],"ai","AIの真価、組織全体で発揮できていますか？","所要時間は5分以内です",{"text":1564,"config":1565},"AI成熟度スコアを確認する",{"href":1566,"dataGaName":1567,"dataGaLocation":1050},"/ja-jp/assessments/ai-modernization-assessment/","modernization assessment",{"config":1569},{"src":1570},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1572,"categories":1573,"header":1575,"text":1562,"button":1576,"image":1580},"devops-modernization",[1574,1382],"product","単にツールを管理するだけでなく、イノベーションを提供していますか？",{"text":1577,"config":1578},"DevOps成熟度スコアを確認しましょう",{"href":1579,"dataGaName":1567,"dataGaLocation":1050},"/ja-jp/assessments/devops-modernization-assessment/",{"config":1581},{"src":1582},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1584,"categories":1585,"header":1587,"text":1562,"button":1588,"image":1592},"security-modernization",[1586],"security","スピードのためにセキュリティを犠牲にしていませんか？",{"text":1589,"config":1590},"セキュリティ成熟度スコアを確認しましょう",{"href":1591,"dataGaName":1567,"dataGaLocation":1050},"/ja-jp/assessments/security-modernization-assessment/",{"config":1593},{"src":1594},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1596,"paths":1597,"header":1600,"text":1601,"button":1602,"image":1607},"github-azure-migration",[1598,1599],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","チームはGitHubのAzure移行に対応できていますか？","GitHubはすでにAzureを基盤として再構築を進めています。それがあなたのチームにとって何を意味するのか、ご確認ください。",{"text":1603,"config":1604},"GitLabとGitHubの比較を見る",{"href":1605,"dataGaName":1606,"dataGaLocation":1050},"/ja-jp/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1608},{"src":1582},{"header":1610,"blurb":1611,"button":1612,"secondaryButton":1616},"今すぐ開発をスピードアップ","DevSecOpsに特化したインテリジェントオーケストレーションプラットフォームで実現できることをご確認ください。\n",{"text":844,"config":1613},{"href":1614,"dataGaName":847,"dataGaLocation":1615},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/ja-jp/","feature",{"text":1166,"config":1617},{"href":1175,"dataGaName":852,"dataGaLocation":1615},1786803792442]