<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>GitHub | ビズドットオンライン</title>
	<atom:link href="https://it-biz.online/tag/github/feed/" rel="self" type="application/rss+xml" />
	<link>https://it-biz.online</link>
	<description></description>
	<lastBuildDate>Thu, 07 May 2026 01:11:31 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://it-biz.online/wp-content/uploads/2019/10/cropped-4a332f05ade4ac7bb3c46c472cb5eac8-32x32.png</url>
	<title>GitHub | ビズドットオンライン</title>
	<link>https://it-biz.online</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【IT用語解説】CI/CDとは？初心者向けに1からわかりやすく解説</title>
		<link>https://it-biz.online/it-skills/ci-cd/</link>
					<comments>https://it-biz.online/it-skills/ci-cd/#respond</comments>
		
		<dc:creator><![CDATA[bizonline_admin]]></dc:creator>
		<pubDate>Thu, 07 May 2026 01:11:29 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[用語解説]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=10763</guid>

					<description><![CDATA[CI/CDとは何か、CIとCDの違い、ビルド・テスト・デプロイとの関係、GitHub Actionsとのつながりを初心者向けに解説します。]]></description>
										<content:encoded><![CDATA[
<p>CI/CDとは、ひとことで言うと、<strong><span class="marker-under">コードの変更を自動で確認し、安全に届けるための流れ</span></strong>です。</p>



<p>たとえば、開発者がGitHubにコードをpushしたとします。そのたびに、人が手作業でビルドして、テストして、問題がなければデプロイの準備をするのは大変です。そこで使われる考え方がCI/CDです。CI/CDでは、コード変更をきっかけに、ビルド、テスト、成果物作成、デプロイ準備などを自動で実行します。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon">
  <div class="speech-person">
    <figure class="speech-icon"><img wpfc-lazyload-disable="true" decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure>
    <div class="speech-name"></div>
  </div>
  <div class="speech-balloon">
    <p>CI/CDはツール名ではありません。GitHub ActionsやJenkinsなどは、CI/CDを実現するための道具です。</p>
  </div>
</div>



<p>この記事では、CI/CDとは何か、CIとCDの違い、ビルド・テスト・デプロイとの関係、GitHub Actionsとのつながりを初心者向けに解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-1" checked><label class="toc-title" for="toc-checkbox-1">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">まず結論：CI/CDは変更を安全に届けるための流れ</a></li><li><a href="#toc2" tabindex="0">CIとは？変更をこまめに取り込み、自動で確認すること</a></li><li><a href="#toc3" tabindex="0">CDとは？確認済みの変更を届けられる状態にすること</a></li><li><a href="#toc4" tabindex="0">CI/CDの全体像を図で整理する</a></li><li><a href="#toc5" tabindex="0">CI/CDでは何が自動化されるのか</a></li><li><a href="#toc6" tabindex="0">GitHub ActionsとCI/CDの関係</a></li><li><a href="#toc7" tabindex="0">CI/CDを使うメリット</a></li><li><a href="#toc8" tabindex="0">手作業リリースとの違い</a></li><li><a href="#toc9" tabindex="0">初心者がつまずきやすいポイント</a></li><li><a href="#toc10" tabindex="0">関連して読みたい記事</a></li><li><a href="#toc11" tabindex="0">まとめ</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">まず結論：CI/CDは変更を安全に届けるための流れ</span></h2>



<p>CI/CDを最初に理解するときは、次のように考えると分かりやすいです。</p>



<pre class="wp-block-code"><code>コードを変更する
  ↓
自動でビルドする
  ↓
自動でテストする
  ↓
問題がなければ、届けられる状態にする</code></pre>



<p>この一連の流れをまとめてCI/CDと呼びます。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>用語</th><th>読み方</th><th>ざっくりした意味</th></tr></thead><tbody><tr><td>CI</td><td>Continuous Integration</td><td>変更をこまめに取り込み、自動で確認すること</td></tr><tr><td>CD</td><td>Continuous Delivery / Continuous Deployment</td><td>確認済みの変更を、利用者へ届けられる状態にすること</td></tr></tbody></table></div></figure>



<p>日本語では、CIは「継続的インテグレーション」、CDは「継続的デリバリー」または「継続的デプロイメント」と呼ばれます。</p>



<p>難しく見えますが、初心者のうちは<strong>「変更したコードを、毎回きちんと確認して、届けやすくする仕組み」</strong>と理解すれば十分です。</p>



<h2 class="wp-block-heading"><span id="toc2">CIとは？変更をこまめに取り込み、自動で確認すること</span></h2>



<p>CIは、Continuous Integrationの略です。直訳すると「継続的インテグレーション」です。</p>



<p>インテグレーションとは、複数の変更を1つに統合することです。チーム開発では、複数人がそれぞれコードを変更します。その変更を長期間ため込むと、あとでまとめたときに問題が起きやすくなります。</p>



<p>CIでは、コードの変更をこまめに取り込み、そのたびに自動で確認します。</p>



<ul class="wp-block-list is-style-icon-list-check has-list-style">
<li>ビルドできるか</li>



<li>テストが通るか</li>



<li>基本的なチェックに失敗していないか</li>
</ul>



<p>つまりCIの目的は、<strong><span class="marker-under">問題を早く見つけること</span></strong>です。</p>



<p>ビルドの意味が曖昧な場合は、先に<a href="https://it-biz.online/it-skills/build/">ビルドとは？</a>を読むと理解しやすくなります。コンパイルとの違いは、<a href="https://it-biz.online/it-skills/compile/">コンパイルとは？</a>で整理しています。</p>



<h2 class="wp-block-heading"><span id="toc3">CDとは？確認済みの変更を届けられる状態にすること</span></h2>



<p>CDは、文脈によって2つの意味で使われます。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>用語</th><th>意味</th><th>ポイント</th></tr></thead><tbody><tr><td>Continuous Delivery</td><td>継続的デリバリー</td><td>いつでもリリースできる状態まで自動化する</td></tr><tr><td>Continuous Deployment</td><td>継続的デプロイメント</td><td>テストに通った変更を本番環境などへ自動で反映する</td></tr></tbody></table></div></figure>



<p>初心者がまず押さえるべきなのは、<strong>CDは「確認済みの変更を届ける段階」</strong>だということです。</p>



<p>ただし、すべての現場で本番環境への反映まで完全自動化しているわけではありません。最後の公開判断は人が行い、そこまでのビルドやテスト、リリース準備を自動化する構成もよくあります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon">
  <div class="speech-person">
    <figure class="speech-icon"><img wpfc-lazyload-disable="true" decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure>
    <div class="speech-name"></div>
  </div>
  <div class="speech-balloon">
    <p>「CD」とだけ書かれている場合は、継続的デリバリーなのか、継続的デプロイメントなのかを文脈で確認しましょう。</p>
  </div>
</div>



<h2 class="wp-block-heading"><span id="toc4">CI/CDの全体像を図で整理する</span></h2>



<p>CI/CDは、コード変更からリリース準備までをつなぐパイプラインとして考えると理解しやすくなります。</p>



<p>次の図では、<strong><span class="marker-under">CIは「壊れていないか確認する場所」、CDは「届けられる状態にする場所」</span></strong>として見てください。CI/CDをツール名として覚えるより、この流れで見る方が実務の会話を理解しやすくなります。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2026/05/ci-cd-flow-v2.png" alt="CI/CDではコード変更を起点にCIで確認しCDで届けられる状態へ進むことを示す図"/><figcaption class="wp-element-caption">CIは確認、CDは届ける準備として見ると、CI/CDの役割を分けて理解できます。</figcaption></figure>



<p>パイプラインとは、複数の処理を順番につないだ流れのことです。CI/CDパイプラインでは、たとえば次のような処理が順番に動きます。</p>



<ul class="wp-block-list is-style-icon-list-comment has-list-style">
<li>コードがpushされる</li>



<li>依存ライブラリを準備する</li>



<li>ビルドする</li>



<li>自動テストを実行する</li>



<li>成果物を作る</li>



<li>必要に応じてデプロイする</li>
</ul>



<p>重要なのは、CI/CDが「一度設定したら何でも勝手にうまくいく魔法」ではないことです。どのチェックを実行するか、失敗したときに止めるか、誰が最終確認するかは、プロジェクトごとに設計します。</p>



<h2 class="wp-block-heading"><span id="toc5">CI/CDでは何が自動化されるのか</span></h2>



<p>CI/CDで自動化される代表的な処理を整理します。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>処理</th><th>何をするか</th><th>なぜ必要か</th></tr></thead><tbody><tr><td>ビルド</td><td>プログラムを実行・配布できる形にする</td><td>変更後も成果物を作れるか確認するため</td></tr><tr><td>テスト</td><td>自動テストを実行する</td><td>変更で既存機能が壊れていないか確認するため</td></tr><tr><td>静的解析</td><td>コードの書き方や潜在的な問題をチェックする</td><td>人の目だけでは見落としやすい問題を早く見つけるため</td></tr><tr><td>成果物作成</td><td>jar、zip、Dockerイメージなどを作る</td><td>配布やデプロイに使う材料を作るため</td></tr><tr><td>デプロイ</td><td>アプリを環境へ反映する</td><td>利用者が変更後のアプリを使えるようにするため</td></tr></tbody></table></div></figure>



<p>すべてのプロジェクトで、これらを全部自動化する必要があるわけではありません。最初は「pushしたらテストだけ自動で動く」でもCIの第一歩です。</p>



<h2 class="wp-block-heading"><span id="toc6">GitHub ActionsとCI/CDの関係</span></h2>



<p>GitHub Actionsは、GitHub上でワークフローを自動実行できる仕組みです。CI/CDそのものではなく、CI/CDを実現するためのツールの1つです。</p>



<p>たとえば、GitHubにpushされたらテストを実行する、pull requestが作られたらビルドする、といった処理を自動化できます。</p>



<pre class="wp-block-code"><code>name: ci

on:
  push:
  pull_request:

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm install
      - run: npm test</code></pre>



<p>この例では、pushやpull requestをきっかけに、依存ライブラリのインストールとテストを実行しています。実際の設定はプロジェクトによって変わりますが、考え方は同じです。</p>



<p>GitHub Actionsの基本は、<a href="https://it-biz.online/it-skills/github-actions/">GitHub Actionsとは？</a>の記事で解説しています。Gitの変更単位であるコミットについては、<a href="https://it-biz.online/it-skills/git-commit/">Gitのコミットとは何か？</a>もあわせて読むと理解しやすくなります。</p>



<h2 class="wp-block-heading"><span id="toc7">CI/CDを使うメリット</span></h2>



<p>CI/CDを使うメリットは、単に作業が楽になることだけではありません。開発の品質とスピードを両方支えるために使われます。</p>



<ul class="wp-block-list is-style-icon-list-thumb-up has-list-style">
<li>問題を早く見つけられる</li>



<li>手作業によるミスを減らせる</li>



<li>チーム全員が同じ確認手順を使える</li>



<li>リリース前の不安を小さくできる</li>



<li>小さな変更をこまめに届けやすくなる</li>
</ul>



<p>特に大きいのは、<strong><span class="marker-under">問題を「あとでまとめて見つける」のではなく、「変更した直後に見つける」</span></strong>点です。</p>



<p>テストの考え方を押さえたい場合は、<a href="https://it-biz.online/it-skills/7rules-testing/">システムテストの７原則</a>や、<a href="https://it-biz.online/it-skills/testing/">ホワイトボックステストとブラックボックステストの違い</a>も参考になります。</p>



<h2 class="wp-block-heading"><span id="toc8">手作業リリースとの違い</span></h2>



<p>CI/CDを導入する前は、ビルドやテスト、デプロイ準備を人が手順書に沿って実行することがあります。もちろん手作業がすべて悪いわけではありませんが、毎回同じ確認を人が行うと、漏れや手順違いが起きやすくなります。</p>



<p>この比較図で見てほしいのは、CI/CDが単に「作業を楽にする仕組み」ではない点です。重要なのは、<strong><span class="marker-under">確認を人の記憶や手順から、毎回同じように動く仕組みへ移すこと</span></strong>です。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2026/05/ci-cd-manual-vs-auto-v2.png" alt="CI/CDは確認を人の手順からパイプラインへ移す考え方であることを示す比較図"/><figcaption class="wp-element-caption">CI/CDでは、確認の手順をパイプライン化することで、確認漏れや担当者ごとの差を減らしやすくなります。</figcaption></figure>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>観点</th><th>手作業中心</th><th>CI/CD</th></tr></thead><tbody><tr><td>確認タイミング</td><td>リリース前にまとめて確認しがち</td><td>変更ごとに確認しやすい</td></tr><tr><td>手順</td><td>担当者の作業に依存しやすい</td><td>設定された手順で毎回動く</td></tr><tr><td>失敗の発見</td><td>遅くなることがある</td><td>早く気づきやすい</td></tr><tr><td>改善</td><td>手順書更新が中心</td><td>パイプライン設定を改善する</td></tr></tbody></table></div></figure>



<p>ただし、CI/CDを入れれば品質が自動的に上がるわけではありません。意味のあるテストやチェックを用意し、その結果をチームが見て改善していくことが重要です。</p>



<h2 class="wp-block-heading"><span id="toc9">初心者がつまずきやすいポイント</span></h2>



<p>CI/CDで初心者がつまずきやすいポイントを整理します。</p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>つまずき</th><th>まずこう理解する</th></tr></thead><tbody><tr><td>CI/CDはGitHub Actionsのこと？</td><td>CI/CDは考え方。GitHub Actionsは実現するためのツール</td></tr><tr><td>CIとCDの境目が分からない</td><td>CIは確認、CDは届ける準備・反映と考える</td></tr><tr><td>CDは必ず本番自動反映？</td><td>必ずではない。最後に人が承認する運用もある</td></tr><tr><td>テストがないとCIはできない？</td><td>最初はビルド確認や簡単なチェックから始められる</td></tr><tr><td>CI/CDを入れればバグはなくなる？</td><td>なくならない。早く気づくための仕組みと考える</td></tr></tbody></table></div></figure>



<p>特に大事なのは、CI/CDを「自動化ツールの設定」とだけ考えないことです。CI/CDの本質は、<strong>変更を小さく確認し、問題を早く見つけ、届けるまでの流れを安定させること</strong>です。</p>



<h2 class="wp-block-heading"><span id="toc10">関連して読みたい記事</span></h2>



<p>CI/CDは、Git、ビルド、テスト、構成管理とつながっている用語です。次の記事もあわせて読むと理解が深まります。</p>



<ul class="wp-block-list">
<li><a href="https://it-biz.online/it-skills/github-actions/">GitHub Actionsとは？仕組みや使い方を３分でわかりやすく</a></li>



<li><a href="https://it-biz.online/it-skills/build/">ビルドとは？プログラミングの基本用語を１分でわかりやすく</a></li>



<li><a href="https://it-biz.online/it-skills/compile/">コンパイルとは？初心者向けに1からわかりやすく解説</a></li>



<li><a href="https://it-biz.online/it-skills/git-commit/">Gitのコミットとは何か？その本質を3分でわかりやすく解説</a></li>



<li><a href="https://it-biz.online/it-skills/c-management/">構成管理とは？目的と意味を３分で解説！</a></li>
</ul>



<h2 class="wp-block-heading"><span id="toc11">まとめ</span></h2>



<p>CI/CDとは、コードの変更を自動で確認し、安全に届けるための流れです。</p>



<ul class="wp-block-list is-style-icon-list-check has-list-style">
<li>CIは、変更をこまめに取り込み、自動で確認すること</li>



<li>CDは、確認済みの変更を届けられる状態にすること</li>



<li>GitHub Actionsなどのツールは、CI/CDを実現する手段</li>



<li>CI/CDの目的は、問題を早く見つけ、手作業のミスを減らすこと</li>
</ul>



<p>最初から高度なデプロイ戦略まで覚える必要はありません。まずは、<strong><span class="marker-under">「pushしたら自動でビルド・テストが動き、問題があれば早く気づける仕組み」</span></strong>として理解すると、CI/CDの全体像をつかみやすくなります。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://it-biz.online/it-skills/ci-cd/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Git：ステージングエリア（インデックス）とは？１分でわかりやすく解説</title>
		<link>https://it-biz.online/it-skills/git-staging/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 13 Dec 2024 09:36:25 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9524</guid>

					<description><![CDATA[結論：ステージングエリアは「次のコミット」を組み立てる作業台 ステージングエリア（インデックス）とは、Gitでコミットを作成する前に、どのファイルをどの状態でコミットするかを明示的に選び出せる「待機場所」のようなものです [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>結論：ステージングエリアは「次のコミット」を組み立てる作業台</strong></p>



<p>ステージングエリア（インデックス）とは、Gitでコミットを作成する前に、どのファイルをどの状態でコミットするかを明示的に選び出せる「待機場所」のようなものです。ステージングエリアをうまく活用することで、開発者は実際の作業ディレクトリ（作業コピー）で起きている変更のうち、どれを次のコミットに含めるかを厳選でき、コミットを丁寧に積み重ねることが可能になります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページでは初心者向けにわかりやすくステージングエリアと何か？について解説します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-3" checked><label class="toc-title" for="toc-checkbox-3">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ステージングエリアとは何か？</a><ol><li><a href="#toc2" tabindex="0">「作業ディレクトリ」と「コミット」の間の中継点</a></li></ol></li><li><a href="#toc3" tabindex="0">ステージングエリアを使うメリット</a><ol><li><a href="#toc4" tabindex="0">1. コミット内容の選別が可能</a></li><li><a href="#toc5" tabindex="0">2. ミスを減らし、コミットの質を向上</a></li><li><a href="#toc6" tabindex="0">3. チーム開発での透明性向上</a></li></ol></li><li><a href="#toc7" tabindex="0">ステージングエリアとコマンドの役割</a><ol><li><a href="#toc8" tabindex="0">git addコマンドの意味</a></li><li><a href="#toc9" tabindex="0">git statusでの確認</a></li><li><a href="#toc10" tabindex="0">git diffとgit diff --staged</a></li></ol></li><li><a href="#toc11" tabindex="0">ステージングエリアを使いこなす応用テクニック</a><ol><li><a href="#toc12" tabindex="0">部分的な変更のステージング</a></li><li><a href="#toc13" tabindex="0">ステージングエリアからの変更取り消し</a></li></ol></li><li><a href="#toc14" tabindex="0">ステージングエリアを正しく理解することで得られるもの</a></li><li><a href="#toc15" tabindex="0">補足：ステージングの次に押さえたいGit用語</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ステージングエリアとは何か？</span></h2>



<h3 class="wp-block-heading"><span id="toc2">「作業ディレクトリ」と「コミット」の間の中継点</span></h3>



<ul class="wp-block-list">
<li><strong>作業ディレクトリ</strong>：ファイルを実際に編集し、コードを書き換える場。まだコミットされていない最新の状態がここにあります。</li>



<li><strong>ステージングエリア（インデックス）</strong>：コミットされる直前の変更を一時的に登録しておくエリア。</li>



<li><strong>リポジトリ（過去の履歴）</strong>：すでにコミットされ、確定された履歴が保存されています。</li>
</ul>



<p>この3者の関係を簡単な図で表すと以下のようになります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">[作業ディレクトリ] --(git add)--> [ステージングエリア] --(git commit)--> [リポジトリ(コミット履歴)]</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>「ステージングエリア」は、料理でいうと「下ごしらえ台」のようなものです。</p>
</div></div>



<ul class="wp-block-list">
<li><strong>材料（ファイルの変更）</strong>はまずキッチン全体（作業ディレクトリ）に散らかっています。</li>



<li>料理（コミット）を作る前に、どの材料を使うか選んで下ごしらえする（ステージング）ことで、完成した料理（コミット）は綺麗にまとまり、再現性や理解しやすさが増します。</li>



<li>下ごしらえをすること（ステージング）で、いきなり全部を鍋に放り込む（コミット）よりも、味の調整や材料の再確認がしやすくなります。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc3">ステージングエリアを使うメリット</span></h2>



<h3 class="wp-block-heading"><span id="toc4">1. コミット内容の選別が可能</span></h3>



<ul class="wp-block-list">
<li>作業ディレクトリには様々な変更が混在しているかもしれませんが、次のコミットには特定のファイルや特定の変更部分だけを含めたい場合があります。</li>



<li>ステージングエリアを介することで、<code><span class="blue">git add</span></code>コマンドなどを使ってコミット対象の変更を細かくコントロールできます。</li>



<li>結果として、「一つのコミットは一つの論理的変更」という理想的なコミット粒度を実現しやすくなります。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc5">2. ミスを減らし、コミットの質を向上</span></h3>



<ul class="wp-block-list">
<li>直接作業ディレクトリからコミットが作られる場合、誤って不要なファイルや修正をコミットしてしまうリスクがあります。</li>



<li>ステージングエリアを経由することで、コミット対象が明確になり、コミット前に<code><span class="blue">git diff --staged</span></code>で確認し、内容を吟味した上でコミットできます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc6">3. チーム開発での透明性向上</span></h3>



<ul class="wp-block-list">
<li>チーム開発では、コミットが明確な目的を持つことが大切です。ステージングエリアを使えば、関係する変更だけを正確にまとめてコミットできるため、履歴を後から見返しても、意図が理解しやすいです。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc7">ステージングエリアとコマンドの役割</span></h2>



<h3 class="wp-block-heading"><span id="toc8">git addコマンドの意味</span></h3>



<ul class="wp-block-list">
<li><code><span class="blue">git add</span></code>は、「作業ディレクトリの変更をステージングエリアに登録する」ためのコマンドです。</li>



<li>具体的には、<code><span class="blue">git add ファイル名</span></code>で、特定のファイルの最新状態をステージングエリアへコピーします。</li>



<li><code><span class="blue">git add .</span></code>で現在のディレクトリ以下の全変更をステージングエリアへ追加できますが、慎重なコミット粒度を保つためには必要なファイルだけを個別に<code><span class="blue">git add</span></code>することが理想です。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc9">git statusでの確認</span></h3>



<ul class="wp-block-list">
<li><code><span class="blue">git status</span></code>を実行すると、ステージングエリアに登録されている変更（Staged changes）と、まだステージングされていない変更（Unstaged changes）が区別して表示されます。</li>



<li>これにより、自分が次のコミットに何を含もうとしているのか、何がまだ準備されていないのかを即座に把握できます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc10">git diffとgit diff --staged</span></h3>



<ul class="wp-block-list">
<li><code><span class="blue">git diff</span></code>：作業ディレクトリとステージングエリアの差分を表示します。「まだステージングしていない変更」を確認する際に便利です。</li>



<li><code><span class="blue">git diff --staged</span></code>：ステージングエリアと最後のコミット（HEAD）との差分を表示します。これで「ステージング済みの変更点」を正確に把握できます。</li>
</ul>



<p><span class="badge">参考</span>　<strong>ステージングエリアを活用した典型的なワークフロー</strong></p>



<ol class="wp-block-list is-style-numeric-list-step has-list-style">
<li class="is-style-bottom-margin-1em has-bottom-margin"><strong>ファイルを編集（作業ディレクトリ）</strong><br>コードを書き換えファイルを保存。この時点でGitは変更を監視していますが、まだコミット対象は未確定です。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong><code>git add</code>で必要な変更だけをステージング（ステージングエリア）</strong><br>編集したファイルの中から、次のコミットに含めたい変更を<code><span class="blue">git add</span></code>。このタイミングでコミット対象が一旦確定。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong><code>git status</code>や<code>git diff --staged</code>で確認</strong><br>本当にその変更だけでコミットしたいかを確認。<br>→不要な変更がステージングされていれば、<code><span class="blue">git restore --staged ファイル名</span></code>でステージングエリアから外すことも可能。</li>



<li class="is-style-bottom-margin-1em has-bottom-margin"><strong><code>git commit</code>でコミット作成</strong><br>ステージングエリアに溜まっていた変更が、ひとつのコミットとして履歴に保存される。</li>



<li><strong>次のコミットへ</strong><br>新たな変更があれば再び<code><span class="blue">git add</span></code>してコミットを組み上げていく。</li>
</ol>



<h2 class="wp-block-heading"><span id="toc11">ステージングエリアを使いこなす応用テクニック</span></h2>



<h3 class="wp-block-heading"><span id="toc12">部分的な変更のステージング</span></h3>



<ul class="wp-block-list">
<li><code><span class="blue">git add -p</span></code>コマンドを使用すると、1つのファイル内の一部の変更だけをステージングすることができます。これにより、1つのファイルに複数の論理的変更が混在していても、コミット単位を細分化できます。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc13">ステージングエリアからの変更取り消し</span></h3>



<ul class="wp-block-list">
<li><code><span class="blue">git restore --staged ファイル名</span></code>を使うと、ステージングエリアに乗せた変更を「やっぱりやめた」と戻すことができます。これにより、コミット直前に不必要な変更をコミット対象から外すことが可能です。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc14">ステージングエリアを正しく理解することで得られるもの</span></h2>



<ul class="wp-block-list">
<li><strong>精緻な履歴管理</strong>：必要な変更だけをコミットできるので、後から履歴を辿った時に「このコミットは何を意図していたのか」が明確になります。</li>



<li><strong>チームコラボレーションの円滑化</strong>：明確に整ったコミット履歴は、他の開発者がコードをレビューしたり、過去の変更点を把握したりする際に大きな助けになります。</li>



<li><strong>トラブルシューティングの容易化</strong>：コミットごとの変更が論理的にまとまっていると、バグ調査やロールバックが容易になり、ソフトウェア開発の生産性が向上します。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc15">補足：ステージングの次に押さえたいGit用語</span></h2>



<p>ステージングエリアは、作業内容をいきなり履歴に残さず、コミット前に整理するための場所です。次にブランチやコミットの意味を押さえると、Gitの一連の流れがかなりつながります。</p>



<ul class="wp-block-list">

<li><a href="https://it-biz.online/it-skills/git-commit/">Gitのコミット</a>を読むと、ステージングした変更がどのように履歴として残るかを理解できます。</li>


<li><a href="https://it-biz.online/it-skills/branch/">GitHubのブランチ</a>を押さえると、複数の作業を分けて進める考え方が見えやすくなります。</li>


<li><a href="https://it-biz.online/it-skills/github-repository/">リポジトリとは何か</a>も確認しておくと、作業ディレクトリやステージングとの関係を整理できます。</li>

</ul>

]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>初心者向けGit活用ガイド：ローカルリポジトリと基本操作を５分でマスターする</title>
		<link>https://it-biz.online/it-skills/git-abc-2/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 27 Dec 2024 04:30:18 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9543</guid>

					<description><![CDATA[プログラム開発や文書作成をしていると、過去に書いたコードや文章を「ちょっと前の状態に戻したい」「どこをいつ変更したのか履歴を見たい」ということがよくあります。こうしたニーズに応えるのがバージョン管理システムであり、その代 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>プログラム開発や文書作成をしていると、過去に書いたコードや文章を「ちょっと前の状態に戻したい」「どこをいつ変更したのか履歴を見たい」ということがよくあります。こうしたニーズに応えるのが<strong>バージョン管理システム</strong>であり、その代表格として今やデファクトスタンダードになっているのがGitです。</p>



<p>この記事ではGitの基本的な使い方として「ローカルリポジトリを構築し、ファイルの変更を記録する」という流れを学びつつ、Gitの本質的な仕組みを理解していきましょう。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この記事をご覧いただく前に、以下のページでGitの本質的な考え方を理解しておくとよりスムーズに学習することができるはずです。未読の方は、是非一度ご覧になってください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/git-abc/" title="Gitの本質を理解する4つの考え方" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img fetchpriority="high" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/12/image-8-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/12/image-8-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/12/image-8-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/12/image-8-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Gitの本質を理解する4つの考え方</div><div class="blogcard-snippet internal-blogcard-snippet">Gitはファイルをそのままコピーするのではなく、内容のハッシュをキーに独自形式で保存する“コンテンツアドレス型”の仕組みを持っています。この記事では、BlobやTreeオブジェクトを含む内部構造を掘り下げ、Gitの本質をわかりやすく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.12.25</div></div></div></div></a>
</div></figure>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-5" checked><label class="toc-title" for="toc-checkbox-5">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ローカルリポジトリとは？ 〜 Gitの世界における「自分だけの管理空間」</a></li><li><a href="#toc2" tabindex="0">Gitを使い始める前の準備：初期設定</a></li><li><a href="#toc3" tabindex="0">Gitリポジトリの作成：git init の仕組み</a></li><li><a href="#toc4" tabindex="0">ワーキングツリー（作業ツリー）・ステージ（インデックス）・リポジトリの関係</a></li><li><a href="#toc5" tabindex="0">ファイルを作成してステージ領域に追加する：git addの使いどころ</a></li><li><a href="#toc6" tabindex="0">コミットして変更を履歴として残す：git commit</a></li><li><a href="#toc7" tabindex="0">git statusで状態を確認する：変更があるかどうかを常にチェック</a></li><li><a href="#toc8" tabindex="0">変更の確認：git diffで何が変わったかを見る</a></li><li><a href="#toc9" tabindex="0">コミット履歴を覗く：git logで変更履歴を確認する</a></li><li><a href="#toc10" tabindex="0">不要なファイルをGit管理から外す：.gitignoreの活用</a></li><li><a href="#toc11" tabindex="0">「あっ、間違えた！」そんな時：コミットの取り消しややり直し</a></li><li><a href="#toc12" tabindex="0">ローカルリポジトリを活用して作業をスムーズにするコツ</a></li><li><a href="#toc13" tabindex="0">この先に待つGitの世界：ブランチやリモートリポジトリとの連携へ</a></li><li><a href="#toc14" tabindex="0">まとめ：ローカルリポジトリを知ることから始めよう</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ローカルリポジトリとは？ 〜 Gitの世界における「自分だけの管理空間」</span></h2>



<p>Gitには大きく分けて2種類のリポジトリがあります。</p>



<p>1つは今回学ぶ<strong>ローカルリポジトリ</strong>で、自分の手元のコンピュータ内に作成されるリポジトリです。もう1つはネットワーク越しに存在する<strong>リモートリポジトリ</strong>（GitHubなどが提供するリポジトリ）です。ローカルリポジトリでは、あなたが管理したいファイル・フォルダを「追跡対象」とし、それらのファイルの変更履歴を自分のコンピュータ内に保存する仕組みが作られます。</p>



<figure class="wp-block-image aligncenter size-large"><img decoding="async" width="800" height="496" src="https://it-biz.online/wp-content/uploads/2024/06/image-4-800x496.png" alt="リモートリポジトリ,ローカルリポジトリ" class="wp-image-9279" srcset="https://it-biz.online/wp-content/uploads/2024/06/image-4-800x496.png 800w, https://it-biz.online/wp-content/uploads/2024/06/image-4-500x310.png 500w, https://it-biz.online/wp-content/uploads/2024/06/image-4-300x186.png 300w, https://it-biz.online/wp-content/uploads/2024/06/image-4-768x476.png 768w, https://it-biz.online/wp-content/uploads/2024/06/image-4.png 1131w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">図1：リモートリポジトリとローカルリポジトリ</figcaption></figure>



<p>ローカルリポジトリを活用する最大の魅力は、ネットワークに接続していなくても自由に履歴を管理できるという点です。データはすべて自分のマシン内にあるため、<strong>コミット（変更の記録）</strong>や<code>git log</code>（履歴確認）といった操作が即座に行えます。これが「分散型バージョン管理システム」の強みなのです。</p>



<p>リモートリポジトリは、複数人での共同開発や別マシンとの同期に大変便利ですが、最初にバージョン管理の仕組みを理解するにはローカルリポジトリの操作から始めるのがおすすめです。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/github-repository/">ローカルリポジトリとリモートリポジトリ</a></p>



<h2 class="wp-block-heading"><span id="toc2">Gitを使い始める前の準備：初期設定</span></h2>



<p>Gitを利用する際には、まずユーザー名とメールアドレスを設定しておく必要があります。これらはコミットを行った時に「誰が変更したのか」を明確に記録するために使われます。以下のコマンドでグローバル設定を行いましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git config --global user.name "Your Name"
git config --global user.email "your_email@example.com"
</pre>



<p>ここで指定する名前とメールアドレスは、あなたがGitをインストールしている環境であれば、すべてのローカルリポジトリに適用されます。もちろん、後から変更も可能です。<code><span class="bold-blue">--global</span></code>オプションを外し、リポジトリごとにユーザー名やメールアドレスを切り替えるといった使い方もできます。</p>



<p>設定内容を確認したい場合は、以下のようにコマンドを入力すると設定の一覧が表示されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git config --list
</pre>



<p>表示された情報の中に<code><span class="bold-blue">user.name</span></code>や<code><span class="bold-blue">user.email</span></code>が含まれていれば、設定が反映されています。</p>



<h2 class="wp-block-heading"><span id="toc3">Gitリポジトリの作成：git init の仕組み</span></h2>



<p>では、いよいよローカルリポジトリを作成してみましょう。まずは、Gitで管理したいプロジェクトフォルダ、あるいは新規フォルダを作成し、そこへ移動します。例として<code>my-git-project</code>というフォルダを作りましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">mkdir my-git-project
cd my-git-project
</pre>



<p>その上で、以下のコマンドを実行します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git init
</pre>



<p>これにより、現在のディレクトリ（<code>my-git-project</code>フォルダ）内に隠しフォルダである<code>.git</code>が生成されます。<strong><code>.git</code>フォルダこそがGitの管理領域であり、このフォルダ内にコミット履歴やブランチ情報などが保存されます。</strong>言い換えると、この<code>.git</code>フォルダがあるディレクトリがローカルリポジトリである、ということです。</p>



<p>Gitの管理は基本的に「今いるディレクトリの<code>.git</code>フォルダ」を基点に行われますので、もしどこか別のフォルダで作業しているつもりが<code>.git</code>がなかった…となると、Git管理が適切に行われない原因となります。プロジェクトのルートとなる場所で<code>git init</code>を実行することを意識しましょう。</p>



<h2 class="wp-block-heading"><span id="toc4">ワーキングツリー（作業ツリー）・ステージ（インデックス）・リポジトリの関係</span></h2>



<p>Gitでは、作業ファイルの状態を把握する際に以下の3つの領域を認識すると理解しやすくなります。</p>



<ul class="wp-block-list">
<li><strong>ワーキングツリー（作業ツリー）</strong>: 実際にファイルを編集している手元のディレクトリ。普段の作業はこの領域で行う</li>



<li><strong>ステージ（インデックス）</strong>: 次にコミットする候補（変更内容）を一時的に登録しておく場所</li>



<li><strong>ローカルリポジトリ</strong>: コミット済みの変更履歴が保存されている場所。Gitの中枢</li>
</ul>



<p>ファイルに何らかの変更を行ったら、まずはその変更をステージに追加（<code><span class="bold-blue">git add</span></code>）し、その後コミット（<code><span class="bold-blue">git commit</span></code>）を行うことで、最終的にローカルリポジトリに変更が記録されます。この流れをしっかり押さえておくとGitの基本操作で迷うことが少なくなります。</p>



<h2 class="wp-block-heading"><span id="toc5">ファイルを作成してステージ領域に追加する：git addの使いどころ</span></h2>



<p>それでは、実際にファイルを作成し、Gitで追跡させてみましょう。以下の例では、<code>hello.txt</code>というファイルを新規作成してみます。コマンドはOSによって多少異なりますが、LinuxやmacOSの場合は以下でOKです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">echo "Hello Git!" > hello.txt
</pre>



<p>Windowsの場合は、コマンドプロンプトやPowerShellで<code>echo Hello Git! &gt; hello.txt</code>などと入力しても同様です。これで現在のディレクトリに<code>hello.txt</code>が作成され、中身として<code>Hello Git!</code>というテキストが書かれた状態になります。</p>



<p>次に、この新規ファイルをステージに登録します。コマンドは以下の通りです。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git add hello.txt
</pre>



<p>ここで「ステージに追加する」とは、「次回のコミットに含める変更として印を付ける」イメージです。1回のコミットで複数のファイルをまとめて記録することもあるため、<code><span class="bold-blue">git add</span></code>はある種の「候補リストに入れる」操作ともいえます。</p>



<p>もし変更したファイルが多数ある場合、一括で<code>git add .</code>（ドット）を使って現在のディレクトリ以下にある変更すべてをステージに追加することも可能です。しかし、慣れないうちは「意図しないファイルもコミット対象になる」リスクを避けるために、個別に<code>git add</code>した方が安全かもしれません。</p>



<h2 class="wp-block-heading"><span id="toc6">コミットして変更を履歴として残す：git commit</span></h2>



<p>ステージに追加した変更は、<strong>コミット</strong>という操作を行うことでリポジトリに正式に保存されます。コミットは、変更履歴に「スナップショット（変更の塊）」を刻む行為です。以下のように入力してコミットを実行してみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git commit -m "Add hello.txt"
</pre>



<p><code>-m</code>オプションに続けて記述するのが「コミットメッセージ」です。コミットメッセージには、<strong>その変更で何を行ったか</strong>を簡潔かつ明瞭に書くことが望ましいとされています。例えば「Fix login bug」「Update README for installation steps」のように、「誰が見ても理解しやすい形」に整えるのが理想です。後々、自分自身が過去の履歴を読み返す時にも役に立ちます。</p>



<p>コミットを行うと、Gitはステージにあったすべての変更ファイルを一つの固まりとしてリポジトリに保存します。これにより、<code>hello.txt</code>を作ったという履歴が正式に記録されたことになります。</p>



<h2 class="wp-block-heading"><span id="toc7">git statusで状態を確認する：変更があるかどうかを常にチェック</span></h2>



<p>Gitを使いこなす上で最も多用するコマンドの一つが<code><span class="bold-blue">git status</span></code>です。これは、現在のリポジトリがどのような状態になっているのか（コミットされていない変更はあるか、ステージに追加されていないファイルはあるか、など）を一覧表示してくれます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git status
</pre>



<p>このコマンドを実行すると、例えば「何も変更されていない」「新たに追加されていないファイルがある」「ステージに未登録の変更がある」などのメッセージを返してくれます。慣れないうちは「まずは<code>git status</code>」が合言葉になるくらい、頻繁に確認すると良いでしょう。特に複数のファイルを編集した時などは、<code>git status</code>を使用してどのファイルがまだステージに追加されていないかを把握することが大切です。</p>



<h2 class="wp-block-heading"><span id="toc8">変更の確認：git diffで何が変わったかを見る</span></h2>



<p>コミット前に「ファイルのどこがどう変わったのか」を可視化する方法として、<code><span class="bold-blue">git diff</span></code>コマンドがあります。例えば、<code>hello.txt</code>の内容を編集した後に<code>git diff hello.txt</code>を実行すると、編集前後の差分が表示されます。</p>



<p>Gitにおける差分表示は慣れるまで少し読みづらいかもしれませんが、「<code>+</code>」から始まる行が新しく追加・変更された部分、「<code>-</code>」から始まる行が削除・変更前の部分」を示します。差分を細かくチェックできるのはGitの非常に便利な点であり、コミット前の最終確認としても重宝します。</p>



<h2 class="wp-block-heading"><span id="toc9">コミット履歴を覗く：git logで変更履歴を確認する</span></h2>



<p>すでに行われたコミットの履歴を見る場合は、<code>git log</code>コマンドを使います。以下を実行してみましょう。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git log
</pre>



<p>すると、これまでに行ったコミットのハッシュ値（英数字が多数並んだID）や、コミットメッセージ、日時、コミッターの情報などが時系列順に表示されます。もし表示が長くてスクロールが面倒な場合は<code>git log --oneline</code>のようにすると、1行ずつの要約表示になるので、履歴をざっと確認したい時に便利です。</p>



<p>さらに詳細なオプションも数多く存在し、例えば<code>git log -p</code>を実行すると、各コミットの差分を同時に表示できます。いろいろ試してみると、今後の開発において「いつ、何をコミットしたか」を手早く把握する助けとなるでしょう。</p>



<h2 class="wp-block-heading"><span id="toc10">不要なファイルをGit管理から外す：.gitignoreの活用</span></h2>



<p>通常のプロジェクトでは、ログファイルやビルド生成物、個人設定ファイルなど、バージョン管理に含める必要がないファイルが多々存在します。こうした不要ファイルを毎回<code>git add</code>で追加しないようにするには、<code><span class="bold-blue">.gitignore</span></code>というファイルを活用します。</p>



<p><code>.gitignore</code>ファイルの中に「無視したいファイルやディレクトリのパターン」を記述しておくと、Gitはそれを自動的に無視し、ステージにも上げないようにしてくれます。例えば、以下のように書くと<code>logs</code>フォルダと<code>*.log</code>（拡張子が<code>.log</code>のすべてのファイル）を無視対象にできます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">.gitignore ファイルの内容:
logs/
*.log
</pre>



<p>これにより、ローカルで生成されたログ関連のファイルが誤ってリポジトリにコミットされることを防げます。<code>.gitignore</code>はプロジェクトの中で非常に重要な役割を果たすので、どんなファイルを無視すべきかを最初のうちに整理しておくと後が楽になります。</p>



<h2 class="wp-block-heading"><span id="toc11">「あっ、間違えた！」そんな時：コミットの取り消しややり直し</span></h2>



<p>Gitを使っていると、コミットメッセージのスペルミスに気づいたり、別のファイルを加えるのを忘れたままコミットしてしまったりと、「やり直したい」場面が出てきます。その時によく使われる手段が<code><span class="bold-blue">git commit --amend</span></code>です。</p>



<p>直前のコミットを修正したい場合、以下のように実行するとコミットをまとめ直すことができます。ただし、すでにリモートにプッシュ（後述）してしまったコミットを<code>--amend</code>で書き換えると、履歴が書き換わって混乱を引き起こす場合があるので注意が必要です。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 例: 直前のコミットメッセージを修正したい
git commit --amend -m "Fix commit message"
</pre>



<p>また、<code>git revert &lt;コミットID&gt;</code>を使うことで、過去のコミットを「取り消すための新たなコミット」を行うことができます。これは、「過去の変更をなかったことにする」イメージです。リポジトリの履歴は絶対に消えませんが、変更を打ち消すコミットを追加することで「取り消し」状態が実現します。</p>



<h2 class="wp-block-heading"><span id="toc12">ローカルリポジトリを活用して作業をスムーズにするコツ</span></h2>



<p>ここまでで、<strong>ローカルリポジトリを作成し、ファイルをステージしてコミットする</strong>というGitの基本的なフローを体験しました。効率的に作業するためのポイントをいくつか挙げてみましょう。</p>



<ul class="wp-block-list">
<li><strong>こまめにコミットする</strong>: ある程度まとまった変更ができたらコミットを行い、履歴を小さく区切っておく。後でトラブルがあったときに戻りやすい</li>



<li><strong>コミットメッセージを分かりやすく</strong>: 「何を変更したのか」を一目でわかるように書く。将来の自分や他の開発者にとって重要なドキュメントになる</li>



<li><strong>ステージに上げるファイルを意識して選ぶ</strong>: すべてを一度に<code>git add .</code>で追加するのではなく、変更意図に応じて必要なファイルだけをステージに追加すると、不要なミスコミットを防げる</li>



<li><strong>Gitの状態チェックを怠らない</strong>: <code>git status</code>や<code>git diff</code>を活用し、想定外のファイル変更や差分がないか頻繁に確認する</li>
</ul>



<h2 class="wp-block-heading"><span id="toc13">この先に待つGitの世界：ブランチやリモートリポジトリとの連携へ</span></h2>



<p>Gitにはまだまだ多くの機能が存在します。特に大型プロジェクトでは下記のような操作が重要になります。</p>



<ul class="wp-block-list">
<li><strong>ブランチ（branch）</strong>: 作業の流れを分岐させ、複数の並行開発を安全に進めるための機能。<code>git branch</code>や<code>git checkout -b</code>などのコマンドで使用</li>



<li><strong>マージ（merge）</strong>: 分岐したブランチを本流に統合する操作</li>



<li><strong>リモートリポジトリとの連携</strong>: GitHubやGitLabなどを利用して、他の開発者と作業を共有。<code>git push</code>や<code>git pull</code>、<code>git clone</code>などのコマンドを使う</li>
</ul>



<p>しかし、これらを活用する前に、まずはローカル環境だけでGitの基本操作をしっかりと体験することが大切です。<strong>「ローカルリポジトリを扱うスキル」</strong>は、後々大きな規模のプロジェクトに参加する際のベースになってくれます。</p>



<h2 class="wp-block-heading"><span id="toc14">まとめ：ローカルリポジトリを知ることから始めよう</span></h2>



<p>本ステップでは、以下の一連の流れを紹介しました。</p>



<ol class="wp-block-list">
<li>Gitの初期設定（ユーザー名・メールアドレス）</li>



<li><code>git init</code>でローカルリポジトリを作成</li>



<li>ファイルを作り、<code>git add</code>でステージに登録</li>



<li><code>git commit</code>でリポジトリに変更履歴を保存</li>



<li><code>git status</code>や<code>git diff</code>、<code>git log</code>で状態や履歴を確認</li>
</ol>



<p>これらはGitを使う上での最も基本的なステップです。少し慣れてくると、ブランチを作成して並行作業をしたり、リモートリポジトリを活用して他の人と共同開発を行ったり、Gitの強力な機能を存分に使いこなせるようになります。</p>



<p>まずは自分のPC上で小さなプロジェクトを作り、何度もファイルの編集・コミットを繰り返してみてください。その過程で<code>.git</code>フォルダの存在意義やステージ・コミットの流れ、コミット履歴の確認と取り消しの方法などを体感的に理解できるでしょう。</p>



<p>こうした基礎を踏まえた上で、次のステップでは複数の変更を同時に扱うためのブランチや、インターネット上（GitHubなど）にリポジトリを配置する方法について学んでいくと、より深くGitを理解できるはずです。<strong>まずはローカルリポジトリでの基本操作をしっかりと身につけることが、Gitを本質的に理解する第一歩</strong>となります。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gitのマージ（merge）を「本質」から理解する３分間</title>
		<link>https://it-biz.online/it-skills/git-merge/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Fri, 13 Dec 2024 11:22:02 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9527</guid>

					<description><![CDATA[Gitは分散型のバージョン管理システムで、複数のブランチ（参考　ブランチの基本）で同時に開発が進むことを前提に設計されています。このような環境で、並行して進んでいた変更を１つにまとめる行為が「マージ（merge）」です。 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Gitは分散型のバージョン管理システムで、複数のブランチ（<span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/branch/">ブランチの基本</a>）で同時に開発が進むことを前提に設計されています。このような環境で、並行して進んでいた変更を１つにまとめる行為が「マージ（merge）」です。単にファイルを結合するだけでなく、履歴（コミットの流れ）を整合的に再結合し、将来的な履歴解析や管理を容易にする点がマージの特徴です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>本記事では、Gitマージの基本的な仕組みから内部動作、そして初心者が混乱しやすいポイントについて、順を追って解説します。</p>
</div></div>



<p>また、難しい話の後には、「こう考えるとシンプルに捉えられる」というコツも付け加えます。これにより、単純な操作手順以上に、なぜGitがこのような動きをするのか理解でき、トラブルシューティングやブランチ戦略の検討に役立つでしょう。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-7" checked><label class="toc-title" for="toc-checkbox-7">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Gitのデータモデル：コミットとスナップショット</a><ol><li><a href="#toc2" tabindex="0">ブランチとDAG構造</a></li></ol></li><li><a href="#toc3" tabindex="0">マージの核心：3-wayマージと共通祖先</a><ol><li><a href="#toc4" tabindex="0">3-wayマージとは</a></li></ol></li><li><a href="#toc5" tabindex="0">マージプロセスの内部動作</a><ol><li><a href="#toc6" tabindex="0">作業ディレクトリ・インデックス・ツリー</a></li></ol></li><li><a href="#toc7" tabindex="0">コンフリクト（衝突）の仕組み</a></li><li><a href="#toc8" tabindex="0">マージコミットと履歴構造</a></li><li><a href="#toc9" tabindex="0">リベースとの比較</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Gitのデータモデル：コミットとスナップショット</span></h2>



<p>Gitは、各コミットを「プロジェクト全体のスナップショット」として扱います。</p>



<ul class="wp-block-list">
<li><strong>コミット</strong>は、ファイル群の状態を示すスナップショットと、そのスナップショットに至るまでの履歴（親コミットへの参照）を持っています。</li>



<li>Gitは履歴を「DAG（有向非巡回グラフ）」という形で管理し、ブランチはそのDAG上の特定のコミットを指す「名前（ポインタ）」です。</li>
</ul>



<p>「スナップショット」という考え方は、「差分管理」とは少し異なります。Gitは内部的には差分の圧縮を行いますが、基本的なモデルは「各コミットで全体を丸ごと記録している」ような感覚で構いません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>「Gitは各コミットごとに、プロジェクトの写真を1枚撮って、それを積み重ねていく」とイメージするとわかりやすいです。さらに詳しく理解したい方は↓ページをご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/git-commit/" title="Gitのコミットとは何か？その本質を3分でわかりやすく解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/12/image-5-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/12/image-5-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/12/image-5-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/12/image-5-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Gitのコミットとは何か？その本質を3分でわかりやすく解説</div><div class="blogcard-snippet internal-blogcard-snippet">Gitのコミットは単なる変更履歴ではなく、プロジェクト全体をスナップショットとして保存する重要な仕組みです。本記事では、初心者にもわかりやすく、コミットの本質とその活用法を詳しく解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.12.13</div></div></div></div></a>
</div></figure>
</div></div>



<div class="wp-block-cocoon-blocks-tab-caption-box-1 tab-caption-box block-box not-nested-style cocoon-block-tab-caption-box"><div class="tab-caption-box-label block-box-label box-label fab-lightbulb"><span class="tab-caption-box-label-text block-box-label-text box-label-text">DAG（有向非巡回グラフ）とは？</span></div><div class="tab-caption-box-content block-box-content box-content">
<p>DAGは、依存関係を表す際によく使われます。次のようなタスクの順序を考えてみます。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li>材料を買う</li>



<li>ケーキの生地を作る</li>



<li>オーブンを予熱する</li>



<li>ケーキを焼く</li>



<li>ケーキを冷ます</li>



<li>デコレーションする</li>
</ol>



<p>このタスクは「<strong><span class="marker-under">一方向の矢印で繋がる依存関係</span></strong>」として描けます（戻るループはありません）。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">材料を買う → 生地を作る → ケーキを焼く → 冷ます → デコレーションする
                 ↑
            オーブンを予熱する</pre>



<p>「材料を買う」が最初のタスク。そして「オーブンを予熱する」は「ケーキを焼く」の直前に必要なタスクです。冷ました後でしかデコレーションはできません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このように、「<strong><span class="marker-under">依存関係を持つけれど戻らない</span></strong>」構造がDAGの特徴です。</p>
</div></div>
</div></div>



<h3 class="wp-block-heading"><span id="toc2">ブランチとDAG構造</span></h3>



<p>ブランチは複数の機能開発を並行して行うために作成されます。</p>



<ul class="wp-block-list">
<li>ブランチAで新機能1を開発</li>



<li>ブランチBで新機能2を開発<br>これらは、DAG上でコミットの流れが2つに分かれている状態です。</li>
</ul>



<p>ここで注意して覚えておきたい点。それは<strong>ブランチは「ディレクトリ」でも「コピー」ではない</strong>ということ。単に「<strong><span class="marker-under">あるコミットを指す名札</span></strong>」だと思ってください。</p>



<p>ブランチが増えても、実際にファイルの重複が増えるわけではありません。詳しくは<span class="badge">参考</span><a href="https://it-biz.online/it-skills/branch/">ブランチとは？</a>をご覧いただければと思いますが、ブランチとは、履歴の分岐点に置かれた旗印（フラグ）のようなもの」だというのが、マージを本質的に理解するうえでの重要ポイントです。</p>



<h2 class="wp-block-heading"><span id="toc3">マージの核心：3-wayマージと共通祖先</span></h2>



<p>Gitのマージは「3-wayマージ」という仕組みを用いています。</p>



<h3 class="wp-block-heading"><span id="toc4">3-wayマージとは</span></h3>



<p>マージ対象となる2つのブランチには、それらが分岐する前の「共通祖先」が必ず存在します。3-wayマージは以下の3点を比較します。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li>共通祖先コミット</li>



<li>マージ元ブランチの先頭コミット</li>



<li>マージ先ブランチの先頭コミット</li>
</ol>



<p>共通祖先と各ブランチ先頭の差分を計算し、その差分を統合することで、両方の変更を取り込んだ新たなコミットを生成します。</p>



<p>「共通祖先」を探すのは、Gitが自動でやってくれるため、普段は意識しなくてもマージは可能です。ただ、なぜ共通祖先が必要なのかがわからないと、「どこが起点で、何を比べているのか」が見えにくくなります。</p>



<p><strong>具体例</strong>：</p>



<ul class="wp-block-list is-style-numeric-list-step has-list-style">
<li>共通祖先（A）は、まだ新機能が加えられる前のプロジェクト状態とします。</li>



<li>ブランチAの先頭（A'）では、例えば「ファイルXに行追加」を行ったとします。</li>



<li>ブランチBの先頭（B'）では、「ファイルYを修正」しました。<br>このとき、A～A'がブランチAの進化、A～B'がブランチBの進化です。<br>マージでは、この「A→A'」の変更と「A→B'」の変更を足し合わせるイメージです。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>「共通祖先は『分かれ道の分岐点』、そこからそれぞれがどう違う方向に進んだのかを見て、最後にそれらを足し算する」と考えるとわかりやすいです。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc5">マージプロセスの内部動作</span></h2>



<h3 class="wp-block-heading"><span id="toc6">作業ディレクトリ・インデックス・ツリー</span></h3>



<p>マージは、裏側で以下の手順を踏みます。</p>



<ol class="wp-block-list is-style-numeric-list-enclosed has-list-style">
<li>Gitは共通祖先と各ブランチ間の差分を取得します。</li>



<li>その差分をもとに新しいスナップショット（ツリー）を統合的に生成します。</li>



<li>統合結果を元にマージコミットが作られます。</li>
</ol>



<p>この際、Gitは「<a href="https://it-biz.online/it-skills/git-staging/">インデックス（ステージングエリア）</a>」という中間領域にファイル状況を反映し、最終的に<code><span class="blue">git commit</span></code>でマージコミットを記録します。</p>



<p>「インデックス」や「ツリー」という用語は初めて聞くと戸惑うかもしれません。インデックスは、Gitがコミットを作るために一時的に利用する「作業台」のようなものです。ツリーは「ディレクトリ構造を表すGit内部のデータ」です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>「インデックスはコミット前の作品展示台、ツリーは完成したコミットの作品目録」とイメージすると、少し理解が容易になるでしょう。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc7">コンフリクト（衝突）の仕組み</span></h2>



<p>マージ時、両方のブランチが同じ行を別々に変更していた場合、Gitは自動でまとめられず「<strong><span class="marker-under">コンフリクト</span></strong>」として開発者に判断を委ねます。</p>



<p>コンフリクトが発生すると、Gitは該当ファイルに特別なマーカー（<code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code>, <code>=======</code>, <code>&gt;&gt;&gt;&gt;&gt;&gt;&gt;</code>）を挿入します。これを見て、開発者はどちらの変更を採用するか、あるいは両方を統合するかを決めて、ファイルを修正した上で再コミットします。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># main.py
&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD
print("Hello from Branch A")
=======
print("Hello from Branch B")
>>>>>>> branch-b

</pre>



<p><strong>各マーカーの意味</strong></p>



<ul class="wp-block-list">
<li><code>&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</code>: 現在のブランチ（マージ先、通常はHEAD）の内容</li>



<li><code>=======</code>: 変更箇所の境界線</li>



<li><code>&gt;&gt;&gt;&gt;&gt;&gt;&gt; branch-b</code>: マージ元ブランチ（この例ではbranch-b）の内容</li>



<li></li>
</ul>



<h4 class="wp-block-heading">ブランチAの内容を採用する場合</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># main.py
print("Hello from Branch A")

</pre>



<h4 class="wp-block-heading">ブランチBの内容を採用する場合</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># main.py
print("Hello from Branch B")

</pre>



<h4 class="wp-block-heading">両方の内容を統合する場合</h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># main.py
print("Hello from Branch A")
print("Hello from Branch B")

</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>「コンフリクトになったらもうお手上げ」と思うかもしれません。しかし、実際には「ここが食い違っていますよ」というGitからの知らせです。あなたはその箇所を人間の目で判断し、最適な解決策（両方を合体する、片方のみ採用するなど）を見つければよいのです。</p>
</div></div>



<p>「コンフリクトは、Gitが『この部分はどうしたらいい？』と質問している状態」と考えると、恐れる必要はありません。</p>



<h2 class="wp-block-heading"><span id="toc8">マージコミットと履歴構造</span></h2>



<p>マージが成功すると、「マージコミット」という、親コミットを2つ以上持つ特別なコミットができます。これにより、DAG上で分岐していた履歴が再度一つに合流します。後から履歴をたどると、「ここで2つの開発ラインが1つになったのだな」と一目でわかるようになります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>なぜわざわざ「2つの親を持つコミット」を作るのでしょうか。</p>
</div></div>



<p>これは、開発の歴史を正直に残しているからです。分岐した履歴をそのまま残せば、「なぜこの変更が加わったのか」や「どの機能をどこで統合したのか」を後から正しく振り返ることができます。</p>



<h2 class="wp-block-heading"><span id="toc9">リベースとの比較</span></h2>



<p>マージとは別に、Gitには「リベース（rebase）」という操作もあります。</p>



<ul class="wp-block-list">
<li><strong>マージ</strong>：過去の分岐を正直に残し、合流点を明確にします。</li>



<li><strong>リベース</strong>：分岐した歴史をなかったことにし、あたかも一直線の履歴が続いていたかのように書き換えます。</li>
</ul>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table class="has-fixed-layout"><thead><tr><th>特徴</th><th>マージ (Merge)</th><th>リベース (Rebase)</th></tr></thead><tbody><tr><td>履歴の構造</td><td>分岐と統合が残る</td><td>履歴が一本化される</td></tr><tr><td>操作後のコミット数</td><td>元のコミット + マージコミット</td><td>新しいコミットが作り直される</td></tr><tr><td>利点</td><td>分岐の履歴が明確で、変更の流れを追いやすい</td><td>履歴が簡潔で見やすい</td></tr><tr><td>注意点</td><td>コンフリクトが多いと、履歴が複雑化する可能性</td><td>履歴を改変するため、チーム全体での使用に注意が必要</td></tr></tbody></table></div></figure>



<p>マージでは、2つのブランチ（<code>main</code>と<code>feature</code>）が分岐し、その変更を統合するために「マージコミット」が作成されます。履歴には分岐と統合がそのまま記録されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">      A---B---C   (main)
       \       \
        D---E---F (feature)
               /
      G-------H   (merge commit)</pre>



<p><code>A</code>, <code>B</code>, <code>C</code>は<code>main</code>ブランチのコミット。<code>D</code>, <code>E</code>, <code>F</code>は<code>feature</code>ブランチのコミット。<code>H</code>は「マージコミット」で、<code>main</code>と<code>feature</code>を統合した新しいコミットです。</p>



<p>リベースでは、<code>feature</code>ブランチの履歴を、<code>main</code>ブランチの最新コミットの上に「移動」させます。この操作により、分岐がなかったかのような直線的な履歴が作られます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">      A---B---C   (main)
                \
                 D'---E'---F' (feature after rebase)</pre>



<p><code>D'</code>, <code>E'</code>, <code>F'</code>は、リベースによって新しく作られたコミットで、<code>feature</code>ブランチの変更内容を反映しています。履歴が一本化されるため、分岐の痕跡は残りません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>リベースは少し上級者向けです。混乱する場合は、まずはマージになれてからで十分です。</p>
</div></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gitの本質を理解する4つの考え方</title>
		<link>https://it-biz.online/it-skills/git-abc/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Wed, 25 Dec 2024 10:11:52 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9534</guid>

					<description><![CDATA[Gitは世界中のソフトウェア開発者にとって、もはや不可欠といっても過言ではないバージョン管理システムです。しかし多くの入門書やチュートリアルは、どうしても「操作手順」に偏りがちであり、「そもそもGitの本質がどういう原理 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Gitは世界中のソフトウェア開発者にとって、もはや不可欠といっても過言ではないバージョン管理システムです。しかし多くの入門書やチュートリアルは、どうしても「<em>操作手順</em>」に偏りがちであり、「<em>そもそもGitの本質がどういう原理に基づいているのか</em>」という観点はあまり強調されていません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>結果として、バージョン管理のトラブルに直面したときや、チーム開発の運用ルールを設計するときに、根本の原理がわからないまま、場当たり的に対応してしまうケースが多々あります。</p>
</div></div>



<p>そこで本記事では、<strong>「Gitの本質を理解するための4つの考え方」</strong>というテーマで、普段あまり語られない内部仕組み・思想を可能な限りわかりやすく、そして少し長めに解説していきます。ここで紹介する4つの観点をしっかりと押さえれば、Gitの複雑なブランチ操作や履歴操作、あるいはリモートとのやり取りも「なぜそうなるのか」を納得して扱えるようになるでしょう。決して「コマンドを覚えるだけ」の勉強には終わらないように、本記事を通じてGitの深い理解への入り口をつかんでいただければと思います。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-9" checked><label class="toc-title" for="toc-checkbox-9">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. コンテンツアドレス型データベースという視点</a></li><li><a href="#toc2" tabindex="0">2. 「スナップショット」で履歴を管理する</a></li><li><a href="#toc3" tabindex="0">3. 分散型バージョン管理の思想</a></li><li><a href="#toc4" tabindex="0">4. すべては“オブジェクト”と“ポインタ”でつながっている</a></li><li><a href="#toc5" tabindex="0">Gitの4つの本質を土台に、次のステップへ</a></li><li><a href="#toc6" tabindex="0"></a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading" id="concept1"><span id="toc1">1. コンテンツアドレス型データベースという視点</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>まずは、Gitを単なる「バージョン管理システム」と捉えるのではなく、<strong>「コンテンツアドレス型データベース」</strong>として理解すると見え方がガラリと変わる、というお話から始めます。</p>
</div></div>



<p>一般的に「ファイルを管理するシステム」は、ファイル名や階層構造（フォルダ・ディレクトリ）を手がかりに取り扱うのが当たり前という認識を持つ方がほとんどでしょう。<strong><span class="marker-under">ところがGitは、中身（コンテンツ）を暗号学的ハッシュ関数（SHA-1やSHA-256）で指し示しているため、従来の概念とは大きく異なります。</span></strong></p>



<p>たとえば、ファイルをGitで管理するとき、Gitはその内容（テキストやバイナリの実際のバイト列）を読み取り、ある種の圧縮をかけたうえでハッシュ値を計算します。もし、<em>同一の内容</em>を持つファイルが別の場所に存在していたとしても、Gitにとっては「同じハッシュを持つBlob（ブロブ）」として扱われます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ここでいう“Blob”とは、Gitの内部で各ファイルの中身を保持しているオブジェクトを指します。詳細は以下参考ページをご覧ください。</p>
</div></div>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/git-datamodel/">Gitのデータモデル（Blob/Tree/Commit）を3分で解説</a></p>



<p>もう少し踏み込んで説明すると、Gitはディスク上のファイルをそのままコピーしているわけではなく、<strong>「<em>コンテンツそのもの</em>が持つハッシュ値</strong>」をキーにして、.gitディレクトリの中に独自の形式で保存しています。以下がイメージ。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">.git/
├─ objects/
│   ├─ 1a/
│   │   └─ abcdef0123456789...
│   ├─ 4b/
│   │   └─ ...
│   └─ ...
├─ refs/
├─ HEAD
└─ ...</pre>



<p>ハッシュ値が「1aabcdef0123456789...」なら、 <code><span class="blue">.git/objects/1a/abcdef0123456789...</span></code> というパスにファイル（オブジェクト）が置かれます。ファイルの中身は、<strong>ファイル内容＋ヘッダ情報を zlib 圧縮したバイナリ</strong>形式になっています。</p>



<p>これは、重複ファイルを効率的に排除するだけでなく、履歴の改ざんや不整合を検知する強力な仕組みでもあります。もし何かしらファイルの中身を不正に書き換えたり、タイムスタンプを改ざんしたとしても、中身が変わった段階でハッシュ値も変わるため、容易に整合性チェックで発覚するわけです。</p>



<p>ここで特に強調したいのは、「Gitでは<strong>ファイル名</strong>や<strong>ディレクトリ構造</strong>はあくまで“後付けの情報”である」という点です。<strong><span class="marker-under">Gitにとって最も重要なのは「内容（テキストやバイナリ）のハッシュ値」</span></strong>であり、ファイルの配置や命名規則は二次的なメタデータに過ぎません。これは従来のリニアなバージョン管理システム（CVSやSubversionなど）ではあまり見られなかった特徴です。</p>



<p>尚、実際「コンテンツアドレス型データベース」はGit固有の概念というより、ハッシュによるデータ識別を採用している各種システムで使われる汎用的な設計思想でもあります。プロジェクトの単位が巨大になればなるほど、“何がどこで重複しているのか”をハッシュベースで簡単に検出できるのは非常に効率的です。Gitは、この考え方をバージョン管理に最適化しながら取り入れた、という捉え方ができます。</p>



<p>では、なぜこの「コンテンツアドレス型」の発想を持っているとGitの深い部分が理解しやすいのでしょうか。</p>



<p>それは、ブランチやタグなどが<strong>実は「コミットオブジェクト（＝ハッシュ）」を指しているだけ</strong>であり、そこから遡って「Treeオブジェクト（＝ディレクトリの実態）」や「Blobオブジェクト（＝ファイルの中身）」を参照している、という仕組みを自然に受け止められるようになるからです。世の中的には、Gitを「分散型バージョン管理システム」として語ることが多いのですが、実はその前段階として「Gitはコンテンツをハッシュで管理しているデータベースなんだ」と理解するほうが先決なのです。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p><strong>最初の大事なポイント：</strong><br>Gitは、<strong>「ファイルをハッシュ値で識別・管理するコンテンツアドレス型データベース」</strong>であり、それこそが後述するスナップショット管理や分散型の仕組みを支える土台になっています。</p>
</div>



<h2 class="wp-block-heading" id="concept2"><span id="toc2">2. 「スナップショット」で履歴を管理する</span></h2>



<p>次に知っておきたいのが、Gitが<strong>「コミットのたびにプロジェクト全体のスナップショットを保存している」</strong>という考え方です。これは、ほかのバージョン管理システムとの大きな違いとしてよく語られる特徴でもあります。</p>



<p>SubversionやMercurialといったシステムは差分（diff）を主体にしている印象がありますが、実はGitも内部では差分圧縮を行っています。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>しかし、ユーザの抽象レイヤーから見ると、「コミットの度にすべてのファイルをまるごと保存している」と感じられる設計になっています。</p>
</div></div>



<p>具体的には、Gitのコミットオブジェクトは「<em>この時点でのTree</em>」（ディレクトリ構造）への参照と、「<em>親コミットのID</em>」「<em>作成者や日付などのメタデータ</em>」を持っています。<strong>“Tree”というのは実際のディレクトリ階層を表現したオブジェクト</strong>であり、その内部に複数の<em>Blobへの参照</em>が含まれています。これによって、<strong>コミット単位で「プロジェクトのファイル構成がどのようになっていたか」がまるっと再現できる</strong>のです。</p>



<p>このスナップショット管理のメリットは、特定の時点におけるファイルの状態をたやすく再現できること、そして複数ブランチの管理が非常にシンプルになることにあります。Gitでは各ブランチが「<em>自分が今指し示している最新コミット</em>」を指すだけで、あとはコミット同士が親子関係を通じてつながっているため、プロジェクトのどのタイミングにでも一瞬で戻れるわけです。</p>



<p>一般的には「差分」と聞くと“変更量”を積み重ねていくイメージが強いかもしれませんが、<strong>Gitの表層モデルは「完全なスナップショットの系列」</strong>だという点が肝心です。内部的に差分を持っていてもユーザの操作感としては、あるコミットをチェックアウトすればそのときの状態すべてが復元されるので、細かな差分をいちいち適用していくような手間は感じません。</p>



<p>もちろん、プロジェクトの規模が大きい場合、毎回本当にファイルを丸ごと複製して保存しているわけではありません。実際には「パックファイル（packfile）」と呼ばれる仕組みで、差分を効率よく圧縮・格納してストレージを節約しています。しかし、それは“あくまで内部の最適化”であって、ユーザーに対しては<strong>「コミット単位で全体がスナップショットとして扱われている」</strong>というモデルを提供しているのです。</p>



<p>そして、この「スナップショット」モデルが理解できているかどうかが、Gitを使いこなせるかどうかの分かれ目になりやすいといえます。<strong>「差分」ではなく「全体像」をイメージする</strong>ことで、ブランチを自由に行き来したり、特定のコミットにワークツリーを戻す操作が自然と頭に入りやすくなります。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p><strong>2つ目のポイント：</strong><br>Gitのコミットは「プロジェクト全体のスナップショット」を単位に履歴を構築しており、これがブランチやコミットの取り扱いを直感的にしている要因の一つです。</p>
</div>



<h2 class="wp-block-heading" id="concept3"><span id="toc3">3. 分散型バージョン管理の思想</span></h2>



<p>Gitが広く普及した背景には、<strong>「分散型バージョン管理システム(DVCS)」</strong>であることが大きく関係しています。それ以前の主流だったSubversion（SVN）やCVSの多くは「中央サーバとクライアント」という構造をとり、開発者は中央サーバにアクセスしてコミットやアップデートを行うのが普通でした。Gitはこのモデルを一気に覆し、<strong>「全員がフルリポジトリを持つ」</strong>形をとりました。</p>



<p>分散型の最大のメリットは、<strong>「開発者個々人が、中央リポジトリとは無関係に履歴操作を自由に行える」</strong>ことです。オフライン環境で作業するときにもコミットやブランチ操作がすべて可能であり、中央サーバがダウンしていても作業が止まりません。必要になったタイミングで<code>push</code>や<code>pull</code>で同期をとればよいわけです。</p>



<p>もう１つ重要なのが、<a href="https://it-biz.online/it-skills/github-repository/">リポジトリ</a>の冗長性です。</p>



<p>クラウド上のGitリポジトリが万一消失したとしても、<strong>ローカルにクローンを持っている開発者がそのまま“新たなリモート”</strong>を立てられるので、履歴を失うリスクが大幅に低減されます。これは「Gitを使っていればバックアップはほぼ万全」と断言できるほど強固な仕組みです。実際、多くのユーザはGitHubやGitLabといったホスティングサービスを“中央リポジトリ”っぽく運用していますが、本質的にはそれらも“一つのリモート”に過ぎません。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>複数のリモートを用意しても構わないし、別のホスティングサービスにまるごとクローンを置いてもOK。ルールであって制限ではありません。</p>
</div></div>



<p>加えて、<strong>分散型であることはブランチ運用の自由度を飛躍的に高めた</strong>と言われています。中央集権型だと、ブランチを切るたびにサーバーに問い合わせをして新たな分岐を作ったり、履歴を差し戻したりする操作が必要になるので、どうしても管理コストが高くなりがちです。しかし、Gitなら自分のローカル環境だけで無数のブランチを作り、気軽に試行錯誤してから良い結果だけをリモートに反映するという手順が取れます。これはOSS開発の現場でも顕著で、<em>フォーク</em>による分岐をベースにしたコントリビュートの流れが当たり前になっています。</p>



<p>以上を踏まえると、分散型というのは単に「中央サーバがない」わけでもなく、「コミットを全部ローカルで完結できる」以上の意味を持っています。言い換えるなら、<strong>「Gitではリポジトリを簡単にコピーし合って、オブジェクトを交換し合うことが前提になっている」</strong>のです。この点は次の「オブジェクトとポインタ」の話にもつながっていきます。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p><strong>3つ目のポイント：</strong><br>Gitは分散型バージョン管理システムとして、<strong>全員がフルリポジトリを持ち</strong>、自由にブランチやコミットを作り、必要に応じてリモートとオブジェクトを交換する。その結果、強固な冗長性と柔軟な開発フローが得られるのです。</p>
</div>



<h2 class="wp-block-heading" id="concept4"><span id="toc4">4. すべては“オブジェクト”と“ポインタ”でつながっている</span></h2>



<p>最後に、Gitの基本を学ぶうえで避けては通れないのが、「<strong>Gitの内部には4種類のオブジェクトがあり、それらをポインタ（リファレンス）が指し示す構造になっている</strong>」という事実です。先ほどちらっと述べたBlob、Tree、Commit、Tagというオブジェクトの存在が、Gitの動きを支える核心部分です。</p>



<ul class="wp-block-list">
<li><strong>Blob</strong>：ファイルの内容（コンテンツ）</li>



<li><strong>Tree</strong>：ディレクトリ（フォルダ）の構造と、そこに含まれるBlobや他のTreeを指す参照</li>



<li><strong>Commit</strong>：ひとつのコミットを表すメタデータ。どのTreeをルートとするか、親コミットは何か、誰がいつコミットしたかなど</li>



<li><strong>Tag</strong>：特定のコミット（あるいは他のオブジェクト）にラベルをつけるためのオブジェクト</li>
</ul>



<p>これらのオブジェクトはすべて、SHA-1（またはSHA-256）のハッシュをキーとして一意に管理されます。</p>



<p>例えば「最新のコミットは<em>abc1234…</em>」と呼んでいるのは、実際には<em>abc1234…</em>というハッシュ値を持つ“Commitオブジェクト”が存在するということに他なりません。さらに、そのCommitオブジェクトの中身を覗いてみると、<strong>「今回のコミットでは<em>def5678…</em>というTreeを指している」</strong>という形で情報が入っています。そしてそのTreeオブジェクトは内部で複数のBlobを参照していたり、さらにサブディレクトリを表す別のTreeを参照していたりします。</p>



<p>このつながりは基本的に“読み取り専用”です。つまり、一度生成されたオブジェクトは不変（immutable）であり、変更が加わると新しいハッシュのオブジェクトとして扱われます。これによって、履歴の一貫性や整合性が保たれ、改ざんが困難になるのです。Gitで履歴を書き換える際にコミットID自体が変わるのは、このハッシュ不変性の影響だと言えます。</p>



<p>次に、<strong><a href="https://it-biz.online/it-skills/branch/">ブランチ</a>やHEADなどのリファレンス</strong>について考えてみましょう。<code><span class="bold-blue">.git/refs/heads/main</span></code>などというファイルがあり、その中にコミットハッシュが書かれています。これが実質、<strong>「ブランチ=どのコミットを指しているか」</strong>というポインタの実体です。</p>



<p><code>HEAD</code>はさらに、現在チェックアウトしているブランチそのもの、もしくは直接コミットハッシュを指すこと（デタッチドHEAD）もあります。結局のところ、<strong><span class="marker-under"><em>Gitの操作はほとんどすべて“オブジェクトを生成または更新して、どのハッシュを指すかを変える行為”</em>で説明できます。</span></strong></p>



<p>たとえば、<strong>「git branch new-feature」</strong>とコマンドを打つと、<code>.git/refs/heads/new-feature</code>というファイルを作り、現在のコミットIDを書き込むだけです。<strong>「git checkout new-feature」</strong>ではHEADを<em>new-feature</em>ブランチに付け替え、ワークツリーの内容をそのブランチ（コミット）のスナップショットに一致させます。<strong>「git commit」</strong>は新しい<em>Tree</em>オブジェクトと<em>Commit</em>オブジェクトを生成し、ブランチのポインタを新しいコミットハッシュに更新するという動きです。</p>



<p>こうして見てみると、Gitの操作を学ぶときに発生する「ブランチが増えたから何がどうなったの？」「マージって結局何が起きてるの？」といった疑問は、すべて「<em>Git内部のオブジェクトとポインタがどう繋がったか</em>」を丁寧に追っていけば理解できるのです。単に「<em>GUIツールでポチポチしたらブランチができた</em>」とか「<em>コマンドを打ったらマージコミットができた</em>」ではなく、<strong>オブジェクト同士の参照とリファレンスの更新</strong>として捉えることで、はるかに論理的・体系的に把握できます。</p>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box information-box">
<p><strong>4つ目のポイント：</strong><br>GitにはBlob、Tree、Commit、Tagという4種類のオブジェクトがあり、それらをハッシュ値で管理・連結している。ブランチやHEADは「コミットオブジェクトを指すポインタ」に過ぎず、Gitのあらゆる操作はこの指し示す先を変更する行為として説明できる。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/git-datamodel/" title="Gitのデータモデルとオブジェクトを3分で徹底解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/11/image-1-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/11/image-1-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/11/image-1-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/11/image-1-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Gitのデータモデルとオブジェクトを3分で徹底解説</div><div class="blogcard-snippet internal-blogcard-snippet">Gitの基本データモデルであるBlob、Tree、Commitの仕組みとそれらの関連性について徹底解説。さらに、補助的な役割を果たすTagオブジェクトの概要と実用性を具体例を交えてわかりやすく説明します。Git内部の動作を理解し、効率的なバージョン管理を実現するための基礎知識を提供します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.12.25</div></div></div></div></a>
</div></figure>
</div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading"><span id="toc5">Gitの4つの本質を土台に、次のステップへ</span></h2>



<p>ここまで長々と、「Gitの本質を理解する4つの考え方」として以下を解説してきました：</p>



<ol class="wp-block-list">
<li><strong>コンテンツアドレス型データベース</strong><br>Gitを「ファイル名ではなく<em>内容</em>そのものをハッシュ値で識別するデータベース」として捉える。</li>



<li><strong>スナップショットで履歴を管理</strong><br>Gitのコミットはプロジェクト全体の状態を“スナップショット”として扱うため、ブランチやチェックアウトが直感的かつ柔軟に運用できる。</li>



<li><strong>分散型バージョン管理の思想</strong><br>すべての開発者がフルリポジトリを所持し、リモートとオブジェクトを交換する。オフラインで自由にブランチを切り、コミットできる。</li>



<li><strong>オブジェクトとポインタによる構造</strong><br>Git内部には4種のオブジェクトがあり（Blob, Tree, Commit, Tag）、ブランチやHEADは「コミットを指すポインタ」。すべてはハッシュでつながっている。</li>
</ol>



<p>これらの観点をつかめた状態で、次に「<strong>git add</strong>」や「<strong>git commit</strong>」が内部で何をしているのか、あるいは「<strong>git merge</strong>」や「<strong>git rebase</strong>」でどのように履歴が書き換わっていくのかを学ぶと、「ああ、なるほど。だからこうなるのか！」と腑に落ちやすくなります。さらに、その理解が進めばブランチの整理や履歴の書き換え時に起こるトラブルシューティングもスムーズに対処できるようになるでしょう。</p>



<p>単に「Gitを使う」「Gitを覚える」という段階から一歩進み、<strong>本質的な仕組み</strong>を抑えることで、複雑なプロジェクトや大人数での開発でも安心してバージョン管理を運用できるようになります。特にリベースや複数リモートの管理など、初心者が怖がりがちな操作も「中で起きていることは、オブジェクトの付け替えと履歴の再構成だ」と理解できれば、一気にハードルが下がるはずです。</p>



<p>今後はこの土台を踏まえつつ、より具体的なコマンドと内部のデータ構造を掘り下げていく記事を用意していく予定です。例えば：</p>



<ul class="wp-block-list">
<li>Gitの内部オブジェクトを覗く低レベルコマンド（<code>git cat-file</code>、<code>git hash-object</code>など）の使い方</li>



<li>.gitフォルダ配下の<code>objects/</code>や<code>refs/</code>、<code>HEAD</code>ファイル、<code>index</code>の詳細構造</li>



<li>ブランチ管理とマージ・リベースの仕組み（Fast-forwardマージ、3-wayマージ、rebase時のコミット再適用など）</li>



<li>リモートとローカルのやり取り（<code>git fetch</code>, <code>git push</code>, <code>git pull</code>）の内部処理</li>



<li>履歴改変（<code>git commit --amend</code>、<code>git rebase -i</code>）とその注意点</li>
</ul>



<p>こうした“枝葉”の部分を学ぶときでも、今回紹介した「4つの本質」が頭にあれば、「ああ、要するにオブジェクトを生成して参照を更新しているだけなんだな」「実際にはローカルにもフル履歴があるから、操作の失敗をやり直すのも可能だな」といった形で紐づけられるようになるのです。そうしてGitの操作が「指先の感覚」に落とし込まれると、本当に強力なツールとして活躍してくれるようになります。</p>



<p>また、チーム開発においては、Gitの運用ルールやブランチ戦略を決める際にも「<strong>Gitがどうやってデータを扱っているか</strong>」をメンバー全員が一定レベルで共有しているかどうかがとても重要です。知らずに履歴を書き換えてリモートと整合性が崩れたり、不要なコンフリクトを大量に生んでしまったりするトラブルを未然に防ぐことができるからです。</p>



<p>もしあなたが「Gitを使い始めたけど、まだブランチやコミットが腹落ちしていない」という状況なら、ぜひここで紹介した4つのポイントを意識しながらもう一度基本コマンドを試してみてください。クローンを作って、新しいブランチを切って、適当にファイルを編集してコミットし、履歴がどう変わったのかを<code>git log</code>や<code>git reflog</code>、<code>git cat-file</code>などで覗き込んでみると、「ああ、本当にGitはオブジェクトとポインタなんだな」という気づきに出会えるはずです。</p>



<h2 class="wp-block-heading"><span id="toc6"></span></h2>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gitのデータモデルとオブジェクトを3分で徹底解説</title>
		<link>https://it-biz.online/it-skills/git-datamodel/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Thu, 28 Nov 2024 12:00:00 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9483</guid>

					<description><![CDATA[Gitは、内部でオブジェクト指向のデータモデルを持つバージョン管理システムです。この構造は、データの一貫性と効率的な管理を可能にする基盤となっています。この記事では、Gitの4つの主要オブジェクトを中心に、その設計思想と [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Gitは、<strong>内部でオブジェクト指向のデータモデルを持つバージョン管理システム</strong>です。この構造は、データの一貫性と効率的な管理を可能にする基盤となっています。この記事では、Gitの4つの主要オブジェクトを中心に、その設計思想と具体的な動作を深掘りしていきます。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p><a href="https://it-biz.online/it-skills/github/">GitHub</a>を利用していると、マージやコミットといった用語に出会いますよね。何となく利用しているこの用語、裏ではどんな動作をしているのか？って案外知らないと思います。</p>
</div></div>



<p>このページでは、Gitの裏側を理解し、Gitを使いこなすために必要なシステム知識に焦点を当てて解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-11" checked><label class="toc-title" for="toc-checkbox-11">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">1. Gitのデータ構造の全体像</a><ol><li><a href="#toc2" tabindex="0">用語：スナップショット</a></li></ol></li><li><a href="#toc3" tabindex="0">2. Blobオブジェクト：Gitの基礎となるファイル単位のデータ</a><ol><li><a href="#toc4" tabindex="0">Blobオブジェクトの特徴</a></li></ol></li><li><a href="#toc5" tabindex="0">3. Treeオブジェクト：ディレクトリ構造を表現する要</a><ol><li><a href="#toc6" tabindex="0">Treeオブジェクトの役割</a></li></ol></li><li><a href="#toc7" tabindex="0">4. Commitオブジェクト：履歴管理の中核</a><ol><li><a href="#toc8" tabindex="0">Commitオブジェクトの役割</a></li><li><a href="#toc9" tabindex="0">Blob / Tree / Commitの関連を整理</a></li></ol></li><li><a href="#toc10" tabindex="0">5. Tagオブジェクト：重要なポイントへのラベル付け</a><ol><li><a href="#toc11" tabindex="0">Tagオブジェクトの役割</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">1. Gitのデータ構造の全体像</span></h2>



<p>Gitは、変更履歴を単に「ファイルの差分」で記録するのではなく、プロジェクト全体の「スナップショット」を保存する仕組みを採用しています。まずは「スナップショット」という用語について学習しましょう。結論、<strong>プロジェクトの特定時点におけるすべてのファイルの状態を記録したもの</strong>をスナップショットと呼びます。</p>



<h3 class="wp-block-heading"><span id="toc2">用語：スナップショット</span></h3>



<ol class="wp-block-list">
<li><strong>完全な記録</strong>
<ul class="wp-block-list">
<li>スナップショットは、プロジェクト全体のディレクトリ構造とすべてのファイルの内容を記録します。</li>



<li>Gitは変更がなかったファイルについて、過去のスナップショットのデータを再利用するため、効率的に管理することができます。（ですが、差分ではありません。）</li>
</ul>
</li>



<li><strong>ファイル差分ではない</strong>
<ul class="wp-block-list">
<li>多くのバージョン管理システム（例: Subversion）はファイルの「差分」を記録しますが、Gitは「完全なスナップショット」を保存します。</li>



<li>実際には、<span class="marker-under"><strong>内容が変化していないファイルのデータは過去のスナップショットを参照する形で保存する</strong></span>ため、ストレージを節約します。</li>
</ul>
</li>



<li><strong>履歴の基盤</strong>
<ul class="wp-block-list">
<li>スナップショットを連続して保存することで、プロジェクトの履歴が形成されます。</li>



<li>これにより、過去の状態に戻ったり、変更の原因を追跡したりすることが容易になります。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Gitのスナップショットは、プロジェクトの完全な状態を記録する仕組みで、差分を記録するのではなく効率的に全体のスナップショットを管理します。この仕組みにより、高速な操作、簡単な履歴管理、信頼性の高いデータ保存が可能になっています。</p>
</div></div>



<p>そしてこのスナップショットの仕組みの核となるのが以下の4つのオブジェクトです。</p>



<ul class="wp-block-list">
<li><strong>Blob</strong>: ファイルそのものを保持。</li>



<li><strong>Tree</strong>: ファイルやディレクトリの構造を表現。</li>



<li><strong>Commit</strong>: プロジェクトのスナップショットを記録。</li>



<li><strong>Tag</strong>: 特定のコミットに名前を付ける。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc3">2. Blobオブジェクト：Gitの基礎となるファイル単位のデータ</span></h2>



<p>Blobは、<span class="marker-under">ファイルの内容そのものを保持するオブジェクト</span>です。このオブジェクトには<strong>ファイル名やパーミッション情報は含まれず</strong>、純粋にファイルの中身だけが保存されます。ですが、簡単に考えたいのであれば、Blobはファイルそのもののデータと考えてOKです。</p>



<h3 class="wp-block-heading"><span id="toc4">Blobオブジェクトの特徴</span></h3>



<ol class="wp-block-list">
<li><strong>ファイル内容を保存</strong>
<ul class="wp-block-list">
<li>Blobオブジェクトには、テキストファイルやバイナリファイルの内容そのものが保存されます。</li>



<li>ファイル名やそのファイルがどのディレクトリに所属しているかなどの情報は後述する<strong>Treeオブジェクト</strong>が管理します。</li>
</ul>
</li>



<li><strong>SHA-1ハッシュによる一意性</strong>
<ul class="wp-block-list">
<li>Blobオブジェクトは、その内容に基づくSHA-1ハッシュ値で一意に識別されます。</li>



<li>同じ内容のファイルであれば、異なるブランチやリポジトリ内でも同じBlobとして扱われます。</li>
</ul>
</li>



<li><strong>変更があった場合は新しいBlobが作成される</strong>
<ul class="wp-block-list">
<li>ファイルの内容が変更されると、新しいBlobオブジェクトが作成され、古いBlobはそのまま保持されます。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Blobが、もしファイルそのものだとしたら、変更が加えられると、Blobは内部的に2つに分かれる＝リポジトリ全体の容量が増える理解でよいか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>Gitにおいて、<strong>Blobはファイル内容そのものを保持するオブジェクト</strong>でありファイルが変更されるたびに新しいBlobオブジェクトが作成されるため、その理解はおおむね正しい。しかし、Gitは内部的に効率的な方法でデータを管理するため、リポジトリの容量が単純に増え続けるわけではない。</p>
</div></dd></dl></div>



<p><span class="badge">参考</span>　<strong>リポジトリ全体の容量に与える影響</strong></p>



<ol class="wp-block-list">
<li><strong>短期的には容量が増える</strong>
<ul class="wp-block-list">
<li>変更ごとに新しいBlobが作成されるため、短期的にはリポジトリ全体の容量が増加します。</li>
</ul>
</li>



<li><strong>長期的には圧縮（パックファイル）が適用される</strong>
<ul class="wp-block-list">
<li>Gitはリポジトリを効率的に管理するために、<strong>パックファイル</strong>という仕組みで不要なデータを圧縮します。</li>



<li>複数のBlob間の<strong>デルタ圧縮</strong>を行い、差分のみを保存する形に変換します。</li>



<li>これにより、容量の増加は最小限に抑えられます。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading"><span id="toc5">3. Treeオブジェクト：ディレクトリ構造を表現する要</span></h2>



<p><strong>Treeオブジェクト</strong>は、Gitでディレクトリ構造を表現するオブジェクトです。ディレクトリ内のファイルやサブディレクトリを管理し、それらがどのBlobオブジェクトや他のTreeオブジェクトに対応しているかを記録します。</p>



<h3 class="wp-block-heading"><span id="toc6">Treeオブジェクトの役割</span></h3>



<ol class="wp-block-list">
<li><strong>ディレクトリの表現</strong>
<ul class="wp-block-list">
<li>Treeオブジェクトは、ディレクトリ内に含まれるファイルやサブディレクトリの一覧を保持します。</li>
</ul>
</li>



<li><strong>ファイル名やパーミッションの管理</strong>
<ul class="wp-block-list">
<li>各エントリには、ファイル名、ファイルの種類（BlobまたはTree）、ファイルのパーミッション情報が含まれます。</li>
</ul>
</li>



<li><strong>Blobや他のTreeへの参照</strong>
<ul class="wp-block-list">
<li>Treeオブジェクトは、ファイルそのもの（Blob）やサブディレクトリ（別のTree）へのSHA-1ハッシュ値で参照を持っています。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>１つのディレクトリ：１つのTreeオブジェクトとなり、これらが階層関係を保持することで<a href="https://it-biz.online/it-skills/github-repository/">リポジトリ</a>全体のディレクトリ構造を表現します。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">/
├── file1.txt
├── dir1/
│   ├── file2.txt
│   └── file3.txt
└── dir2/
    └── file4.txt</pre>



<p>仮に上記のようなディレクトリ構造があるとすると、root(/)ディレクトリのTreeオブジェクトは以下のようなデータを保持します。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">100644 blob &lt;ハッシュ値1>    file1.txt
040000 tree &lt;ハッシュ値2>    dir1
040000 tree &lt;ハッシュ値3>    dir2</pre>



<p><span class="badge">参考</span>　<strong>変更があった場合のBlobとTreeの関係</strong></p>



<ol class="wp-block-list">
<li><strong>Blobの生成</strong>
<ul class="wp-block-list">
<li>ファイルの内容が変更されると、その新しい内容に基づいて新しいBlobオブジェクトが作成されます。</li>



<li>元のBlobオブジェクト（古い内容）は<span class="marker-under">そのままリポジトリ内に保持</span>され、<strong>新しいBlobが既存のTreeやCommitから参照されるようになります。</strong></li>
</ul>
</li>



<li><strong>Treeの更新</strong>
<ul class="wp-block-list">
<li>ファイルが属するディレクトリを表すTreeオブジェクトが更新されます。</li>



<li>具体的には、変更されたファイルに対応するBlobのSHA-1ハッシュがTreeオブジェクト内で置き換えられます。</li>



<li>他のファイルやディレクトリに変更がない場合、それらに対応する参照は再利用されます。</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading"><span id="toc7">4. Commitオブジェクト：履歴管理の中核</span></h2>



<p><strong>Commitオブジェクト</strong>は、履歴を管理する中核的な存在で、プロジェクトの特定時点における状態（スナップショット）を記録します。各コミットには、その時点のディレクトリ構造や変更内容に関する重要な情報が含まれています。</p>



<h3 class="wp-block-heading"><span id="toc8">Commitオブジェクトの役割</span></h3>



<ol class="wp-block-list">
<li><strong>スナップショットの記録</strong>
<ul class="wp-block-list">
<li>Commitオブジェクトは、特定時点のプロジェクト全体を表す<strong>Treeオブジェクト</strong>を指します。</li>
</ul>
</li>



<li><strong>履歴の管理</strong>
<ul class="wp-block-list">
<li>各Commitオブジェクトは親コミット（または複数の親コミット）への参照を持ち、これによって履歴が連続的に追跡されます。</li>
</ul>
</li>



<li><strong>メタデータの保存</strong>
<ul class="wp-block-list">
<li>コミット作成者、日時、コミットメッセージといったメタ情報を記録します。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以下は、Commitオブジェクトの内部構造を示したものです。</p>
</div></div>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">tree &lt;TreeオブジェクトのSHA-1ハッシュ>
parent &lt;親コミットのSHA-1ハッシュ>  # 初回コミットには存在しない
author &lt;作者名> &lt;メールアドレス> &lt;タイムスタンプ> &lt;タイムゾーン>
committer &lt;コミッター名> &lt;メールアドレス> &lt;タイムスタンプ> &lt;タイムゾーン>
&lt;空行>
&lt;コミットメッセージ></pre>



<p><span class="badge">参考</span>　<strong>上記Commitオブジェクトの各要素の説明</strong></p>



<ol class="wp-block-list">
<li><strong>tree</strong>
<ul class="wp-block-list">
<li><strong>Treeオブジェクトへの参照</strong>を持ち、その時点のプロジェクトのディレクトリ構造を表します。</li>



<li>変更があった場合、この参照が新しいTreeオブジェクトを指します。</li>
</ul>
</li>



<li><strong>parent</strong>
<ul class="wp-block-list">
<li>親コミットへの参照です。これにより、コミット履歴が連続してつながります。</li>



<li>マージコミットでは、複数の親を持つことがあります。</li>



<li>初回コミットには<code>parent</code>はありません。</li>
</ul>
</li>



<li><strong>author</strong>
<ul class="wp-block-list">
<li>コミットを最初に作成した人（通常は実際にコードを書いた人）。</li>



<li>名前、メールアドレス、日時が記録されます。</li>
</ul>
</li>



<li><strong>committer</strong>
<ul class="wp-block-list">
<li>実際にコミットをリポジトリに登録した人（通常はauthorと同じですが、リベースなどの操作では異なる場合があります）。</li>
</ul>
</li>



<li><strong>コミットメッセージ</strong>
<ul class="wp-block-list">
<li>このコミットで行われた変更内容や意図を説明するメッセージ。</li>



<li>チーム開発では、わかりやすく簡潔なメッセージを書くことが推奨されます。</li>
</ul>
</li>
</ol>



<h3 class="wp-block-heading"><span id="toc9">Blob / Tree / Commitの関連を整理</span></h3>



<ol class="wp-block-list">
<li><strong>Blob</strong>
<ul class="wp-block-list">
<li><strong>ファイルそのものの内容</strong>を表すオブジェクト。</li>



<li>ファイル名やパーミッションは含まず、純粋に内容だけが記録されます。</li>
</ul>
</li>



<li><strong>Tree</strong>
<ul class="wp-block-list">
<li>ディレクトリを表すオブジェクト。</li>



<li>ディレクトリ内のファイルやサブディレクトリへの参照（BlobまたはTree）を持ち、ファイル名やパーミッションも記録します。</li>
</ul>
</li>



<li><strong>Commit</strong>
<ul class="wp-block-list">
<li><strong>Treeオブジェクトへの参照を持つ</strong>ことで、その時点のディレクトリ構造を記録します。</li>



<li>親コミットへの参照、作者情報、コミットメッセージを含み、変更履歴を管理します。</li>
</ul>
</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">Commitオブジェクト
└── Treeオブジェクト（ルートディレクトリ）
    ├── Blobオブジェクト（ファイル1の内容）
    ├── Treeオブジェクト（サブディレクトリ1）
    │   ├── Blobオブジェクト（ファイル2の内容）
    │   └── Blobオブジェクト（ファイル3の内容）
    └── Treeオブジェクト（サブディレクトリ2）
        └── Blobオブジェクト（ファイル4の内容）</pre>



<p>これらのオブジェクトを必要最小限の変更を加えることで、最小限の容量で資源のバージョン管理を可能にしているというわけです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>次に説明するTagオブジェクトも重要ですが、Tagオブジェクトはあくまでも補助的な役割です。基本的には、<strong>Blob</strong>、<strong>Tree</strong>、<strong>Commit</strong>の3つのオブジェクトこそ、<span class="marker-under">Gitの基本的なデータ構造を構成する中核</span>であり、これらの仕組みを理解することがGit全体の動作を理解するための基礎となります。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc10">5. Tagオブジェクト：重要なポイントへのラベル付け</span></h2>



<p><strong>Tagオブジェクト</strong>は、Gitで特定のコミット（または他のオブジェクト）に対してラベルを付けるためのオブジェクトです。主にバージョン管理や重要なマイルストーンに名前を付けるために使用されます。</p>



<h3 class="wp-block-heading"><span id="toc11">Tagオブジェクトの役割</span></h3>



<ol class="wp-block-list">
<li><strong>特定のコミットへのラベル付け</strong>
<ul class="wp-block-list">
<li>バージョン番号（例: <code>v1.0.0</code>）やリリース名（例: <code>release-2023-Q4</code>）として使用されます。</li>



<li>チーム開発において、特定の状態を分かりやすく示すために役立ちます。</li>
</ul>
</li>



<li><strong>Git履歴の可読性向上</strong>
<ul class="wp-block-list">
<li>長いSHA-1ハッシュ値の代わりに、人間が理解しやすい名前でコミットを参照できます。</li>
</ul>
</li>



<li><strong>安定版の指標</strong>
<ul class="wp-block-list">
<li>たとえば、製品のリリース時点のコミットにタグを付けておけば、後からその状態を簡単に復元できます。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">Tagオブジェクトは単に、コミットにしるしをつけるだけ、その関連性を管理しているだけでよいか？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>結論として、<strong>Tagオブジェクトは特定のオブジェクト（通常はCommitオブジェクト）に対する「目印」を提供するためのもの</strong>であり、その理解で正しい。Gitの履歴やデータ構造そのものに変更を加えるわけではなく、<strong>関連性（どのコミットがどのタグに対応するか）を管理する補助的な役割</strong>を担っています。</p>
</div></dd></dl></div>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>タグについては以下の記事で詳しく解説しておりますので併せてご覧ください。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/github-tag/" title="Github：タグ(tag)とは何か？使い方を１分でわかりやすく解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/06/image-13-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/06/image-13-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/06/image-13-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/06/image-13-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Github：タグ(tag)とは何か？使い方を１分でわかりやすく解説</div><div class="blogcard-snippet internal-blogcard-snippet">GitHubのタグ機能を簡単にマスター！タグの基本から使い方まで、初心者でも1分で理解できるガイド。プロジェクトのバージョン管理が劇的に楽になるコツを解説します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.06.18</div></div></div></div></a>
</div></figure>
</div></div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Gitのコミットとは何か？その本質を3分でわかりやすく解説</title>
		<link>https://it-biz.online/it-skills/git-commit/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Thu, 12 Dec 2024 09:01:37 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9513</guid>

					<description><![CDATA[Gitを初めて触れると、コミットは「変更を記録する行為」として説明されることが多いかもしれません。しかし、コミットは単なる「上書き保存」や「変更点の記録」以上の意味を持っています。Gitがコミットで扱うのは「差分」ではな [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Gitを初めて触れると、コミットは「変更を記録する行為」として説明されることが多いかもしれません。しかし、コミットは単なる「上書き保存」や「変更点の記録」以上の意味を持っています。Gitがコミットで扱うのは「差分」ではなく、<strong><span class="marker-under">プロジェクト全体の状態を切り取ったスナップショット</span></strong>です。</p>



<p>この違いを理解することが、Gitを本当に使いこなすための第一歩となります。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-13" checked><label class="toc-title" for="toc-checkbox-13">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">なぜ「スナップショット方式」が重要なのか？</a></li><li><a href="#toc2" tabindex="0">コミットは「プロジェクト全体」を瞬間的に写し取るカメラ</a></li><li><a href="#toc3" tabindex="0">コミットオブジェクトが持つ情報：履歴形成のカギ</a></li><li><a href="#toc4" tabindex="0">コミットメッセージはチームのコミュニケーションツール</a></li><li><a href="#toc5" tabindex="0">まとめ：コミットを「状態の記録装置」として捉えよう</a></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">なぜ「スナップショット方式」が重要なのか？</span></h2>



<p>昔ながらのバージョン管理システム（SubversionやCVSなど）は、ファイルの変更差分を積み重ねる形で履歴を管理していました。これは、１つ前の状態と比べて「どこが変わったか」を追いかけ続ける仕組みです。</p>



<p>一方、Gitはコミットを行うたびに、今その瞬間の「全ファイルの状態」をまるごと記録します（ただし、実際には重複データは効率的に共有し、ストレージを節約する工夫が施されています）。</p>



<p>この「スナップショット方式」によって、Gitは以下のメリットをもたらします。</p>



<ol class="wp-block-list">
<li><strong>履歴のわかりやすさ</strong>：<br>各コミットは、その時点のプロジェクトがどういう状態だったかをはっきり示す。<br>→ 後で過去に戻るとき、状態を正確に再現しやすくなります。</li>



<li><strong>データの信頼性</strong>：<br>コミットはSHA-1ハッシュで一意に識別され、内容が変わればハッシュ値も変わる。<br>→ 改ざん防止や誤操作からの復旧が容易になります。</li>



<li><strong>柔軟な操作性</strong>：<br>コミット同士をつなぎ合わせた履歴は、有向非循環グラフ（DAG）として表現され、ブランチやマージといった操作が自然でスムーズに行えます。</li>
</ol>



<p><span class="badge">参考</span>　<strong>有向非循環グラフ（DAG）</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">  A → B → D
      ↓   ↑
      C → E</pre>



<ul class="wp-block-list is-style-icon-list-check has-list-style">
<li><strong>定義</strong>：DAG（有向非循環グラフ）とは、<strong>辺に方向性があるグラフのうち、任意の頂点から出発して辺の方向に沿ってたどったとき、同じ頂点に戻るような閉路（サイクル）が存在しない</strong>グラフを指す。</li>



<li><strong>特徴的性質</strong>：DAGはトポロジカルソートが可能であり、依存関係の解析や手順の順序付けに適している。</li>



<li><strong>代表的な応用分野</strong>：タスクスケジューリング、コンパイラの依存解決、ビルドシステムにおける依存関係管理、分散バージョン管理（Gitのコミット履歴構造）、ワークフロー管理、データフローフレームワーク（SparkやTensorFlowの内部モデル）などがある。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc2">コミットは「プロジェクト全体」を瞬間的に写し取るカメラ</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>コミットはカメラでの撮影に例えるとわかりやすくなります。</p>
</div></div>



<p>たとえば、あなたがあるWebアプリを開発しているとします。</p>



<ul class="wp-block-list">
<li><strong>初回コミット</strong>：まだ何もない状態を「パシャッ」と撮影。ここから開発が始まります。</li>



<li><strong>2回目のコミット</strong>：ログイン画面を追加した状態で「パシャッ」。最初の状態がベースにあり、新しいファイルや変更点が追加されます。</li>



<li><strong>3回目のコミット</strong>：ログイン後のダッシュボードを作成して再度撮影。</li>
</ul>



<p>このように、コミットごとに「その時点で存在する全ファイルやフォルダの構成」を記録していきます。過去にさかのぼれば、「あの時点はどんなファイルがあって、どんなコードが書かれていたか」を丸ごと再生できます。これは、差分を一枚一枚積み重ねる方法では得られない直感的な操作感と信頼性を生み出します。</p>



<h2 class="wp-block-heading"><span id="toc3">コミットオブジェクトが持つ情報：履歴形成のカギ</span></h2>



<p>コミットは「スナップショット」と言いましたが、その正体はGit内部における「コミットオブジェクト」という特別なデータ構造です。このオブジェクトには以下の要素が含まれます。</p>



<ol class="wp-block-list">
<li><strong>Treeへの参照</strong><br>そのコミットが持つフォルダ構造・ファイルを示すツリー情報。<br>→ 「どのファイルがどこに存在し、どの内容だったか」を指し示します。</li>



<li><strong>親コミットへの参照</strong><br>直前の状態を示すコミットID（通常は1つ、マージ時には2つ以上）。<br>→ コミット同士がつながって「履歴」を形成します。</li>



<li><strong>コミットメッセージとメタデータ</strong><br>このコミットの意図や変更内容を開発者が記述するメッセージ、および日時や作成者情報。<br>→ 誰がいつ何をなぜしたのか後から理解できます。</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Git内部のデータ構造については↓をご覧ください。</p>
</div></div>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/git-datamodel" title="Gitのデータモデルとオブジェクトを3分で徹底解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/11/image-1-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/11/image-1-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/11/image-1-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/11/image-1-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">Gitのデータモデルとオブジェクトを3分で徹底解説</div><div class="blogcard-snippet internal-blogcard-snippet">Gitの基本データモデルであるBlob、Tree、Commitの仕組みとそれらの関連性について徹底解説。さらに、補助的な役割を果たすTagオブジェクトの概要と実用性を具体例を交えてわかりやすく説明します。Git内部の動作を理解し、効率的なバージョン管理を実現するための基礎知識を提供します。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.12.25</div></div></div></div></a>
</div></figure>



<h2 class="wp-block-heading"><span id="toc4">コミットメッセージはチームのコミュニケーションツール</span></h2>



<p>コミットは技術的なデータ構造ですが、同時に開発者間のコミュニケーションにも欠かせません。良質なコミットメッセージは、将来「なぜこの変更が行われたのか」を理解する手掛かりとなります。これにより、チーム全体の理解や生産性が向上します。</p>



<p><strong>良いコミットメッセージとは？</strong></p>



<ul class="wp-block-list">
<li>何を変えたのか、なぜ必要だったのかを明確にする。</li>



<li>シンプルでわかりやすい文章にする。</li>



<li>将来の自分や他者が読んだときにも意図が伝わるように心掛ける。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc5">まとめ：コミットを「状態の記録装置」として捉えよう</span></h2>



<p>コミットは、単なる変更履歴ではなく、プロジェクトの状態を逐次撮影し、独立したスナップショットとして残す仕組みです。この理解があれば、次のような利点が得られます。</p>



<ul class="wp-block-list">
<li><strong>履歴管理が直感的</strong>：どの時点の状態にも正確に戻れる。</li>



<li><strong>コードの信頼性が向上</strong>：改ざん防止や復元が容易。</li>



<li><strong>チームワークが円滑化</strong>：明確なメッセージでコミュニケーションがスムーズ。</li>
</ul>



<p>次回（「3. ブランチの仕組み」）では、これらのコミットを指し示す「参照ポイント」としてのブランチを深く掘り下げ、Git特有の高速で柔軟な開発フローの秘密に迫ります。</p>



<figure class="wp-block-embed is-type-wp-embed"><div class="wp-block-embed__wrapper">

<a href="https://it-biz.online/it-skills/branch/" title="GitHub：ブランチとは？（branchとは）３分で初心者向けに解説" class="blogcard-wrap internal-blogcard-wrap a-wrap cf" target="_blank"><div class="blogcard internal-blogcard ib-left cf"><div class="blogcard-label internal-blogcard-label"><span class="fa"></span></div><figure class="blogcard-thumbnail internal-blogcard-thumbnail"><img loading="lazy" decoding="async" width="320" height="180" src="https://it-biz.online/wp-content/uploads/2024/06/image-5-320x180.png" class="blogcard-thumb-image internal-blogcard-thumb-image wp-post-image" alt="" srcset="https://it-biz.online/wp-content/uploads/2024/06/image-5-320x180.png 320w, https://it-biz.online/wp-content/uploads/2024/06/image-5-240x135.png 240w, https://it-biz.online/wp-content/uploads/2024/06/image-5-640x360.png 640w" sizes="(max-width: 320px) 100vw, 320px" /></figure><div class="blogcard-content internal-blogcard-content"><div class="blogcard-title internal-blogcard-title">GitHub：ブランチとは？（branchとは）３分で初心者向けに解説</div><div class="blogcard-snippet internal-blogcard-snippet">【初心者向け】GitHubのブランチ、プルリクエスト、マージについて詳しく解説。各概念の役割やプロセスを理解し、効率的なプロジェクト管理を実現するための基本知識。</div></div><div class="blogcard-footer internal-blogcard-footer cf"><div class="blogcard-site internal-blogcard-site"><div class="blogcard-favicon internal-blogcard-favicon"><img loading="lazy" decoding="async" src="https://www.google.com/s2/favicons?domain=https://it-biz.online" alt="" class="blogcard-favicon-image internal-blogcard-favicon-image" width="16" height="16" /></div><div class="blogcard-domain internal-blogcard-domain">it-biz.online</div></div><div class="blogcard-date internal-blogcard-date"><div class="blogcard-post-date internal-blogcard-post-date">2024.12.13</div></div></div></div></a>
</div></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GitHub：ブランチとは？（branchとは）３分で初心者向けに解説</title>
		<link>https://it-biz.online/it-skills/branch/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Thu, 06 Jun 2024 07:25:39 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9281</guid>

					<description><![CDATA[GitHubのブランチはプロジェクト内で複数の作業を同時に行うための機能。ブランチを使うことで、メインのコードベースに影響を与えることなく新しい機能を開発したり、バグを修正したりすることができます。 関連　【初心者向け】 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>GitHubのブランチはプロジェクト内で複数の作業を同時に行うための機能。ブランチを使うことで、メインのコードベースに影響を与えることなく新しい機能を開発したり、バグを修正したりすることができます。</p>



<p class="has-text-align-center"><span class="badge-green">関連</span>　<a href="https://it-biz.online/it-skills/github/">【初心者向け】GitHubとは？使い方を１からわかりやすく解説</a></p>



<p>より具体的にざっくり説明すると、ブランチは<strong><a href="https://it-biz.online/it-skills/github-repository/">リポジトリ</a>内に複製される別の作業フォルダのようなもの</strong>です。別に言い方をするとプログラムに改修をする際に一時的に生み出される別の世界線のようなもので、この世界線で作業することで現実の世界線には影響を与えずに作業することを可能にする仕組み。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>このページではブランチの基本的な仕組みや、<strong>マージ</strong>や<strong>プルリクエスト</strong>といったブランチにまつわる基本知識をご説明します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-15" checked><label class="toc-title" for="toc-checkbox-15">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">ブランチとは？</a></li><li><a href="#toc2" tabindex="0">プルリクエストとは？（PR）</a><ol><li><a href="#toc3" tabindex="0">GitHub上でのプルリクエストのリクエスト先</a></li></ol></li><li><a href="#toc4" tabindex="0">マージとは？（Merge）</a><ol><li><a href="#toc5" tabindex="0">コンフリクト（conflict）</a></li><li><a href="#toc6" tabindex="0">自動マージの設定方法</a></li></ol></li><li><a href="#toc7" tabindex="0">【実はここからが重要？】ブランチの本質を探る</a><ol><li><a href="#toc8" tabindex="0">ブランチをファイルシステム的な発想で捉えない</a></li><li><a href="#toc9" tabindex="0">ブランチは「履歴上の位置」を表すマーカー</a></li></ol></li><li><a href="#toc10" tabindex="0">HEAD— ブランチを追跡する特別なポインタ</a><ol><li><a href="#toc11" tabindex="0">HEADは「いま自分が立っている地点」を表す</a></li><li><a href="#toc12" tabindex="0">デタッチドHEAD状態とは</a></li></ol></li><li><a href="#toc13" tabindex="0">ブランチ操作の実体とその軽さをイメージする</a><ol><li><a href="#toc14" tabindex="0">ブランチ作成（git branch）</a></li><li><a href="#toc15" tabindex="0">ブランチ切り替え（git checkout や git switch）</a></li><li><a href="#toc16" tabindex="0">ブランチ削除（git branch -d ブランチ名）</a></li></ol></li><li><a href="#toc17" tabindex="0">ブランチが軽量だからこそ可能なワークフロー</a><ol><li><a href="#toc18" tabindex="0">小まめなブランチ運用</a></li><li><a href="#toc19" tabindex="0">一時的な実験と破棄が容易</a></li></ol></li><li><a href="#toc20" tabindex="0">ブランチとコミット履歴の関係</a><ol><li><a href="#toc21" tabindex="0">ブランチはコミット履歴を指し示す「道標」</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">ブランチとは？</span></h2>



<p>ブランチはプロジェクトの中で独立して作業を進めるための「作業場」や「実験場」のようなものです。「実験場」で作業することで、メインのコードベースに影響を与えずに新しい機能の開発やバグ修正を行うことができます。</p>



<p>例えば、プロジェクトのメインブランチ（通常は「main」や「master」と呼ばれます）は、安定したバージョンを保管しています。これが「完成された場所」だと考えてください。しかし、新しい機能を追加したり、バグを修正したりする場合、直接この「完成された場所」で作業するのはリスクがあります。そこで別の「実験場」（ブランチ）を作成して、その中で自由に作業を進めるということ。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>以下がそのイメージ図。リポジトリ内に複製される別の作業場だと理解しましょう。</p>
</div></div>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="800" height="434" src="https://it-biz.online/wp-content/uploads/2024/06/image-6-800x434.png" alt="ブランチとは" class="wp-image-9284" srcset="https://it-biz.online/wp-content/uploads/2024/06/image-6-800x434.png 800w, https://it-biz.online/wp-content/uploads/2024/06/image-6-500x271.png 500w, https://it-biz.online/wp-content/uploads/2024/06/image-6-300x163.png 300w, https://it-biz.online/wp-content/uploads/2024/06/image-6-768x417.png 768w, https://it-biz.online/wp-content/uploads/2024/06/image-6.png 1317w" sizes="(max-width: 800px) 100vw, 800px" /><figcaption class="wp-element-caption">図1：ブランチとは？</figcaption></figure>



<p>もし、新たに作成した「実験場」（ブランチ）での改修が成功したら、その資源をメインブランチに合体させます。こうすることで、大事な資源には影響を与えずにプログラムの改修やテストが可能になる、という仕組みです。</p>



<div class="wp-block-cocoon-blocks-timeline timeline-box cf block-box not-nested-style cocoon-block-timeline"><div class="timeline-title">実際の流れ</div><ul class="timeline">
<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ１</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>ブランチの作成</strong></div><div class="timeline-item-snippet">
<p>メインブランチから新しいブランチを作成。これで新しい「実験場」が誕生。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ２</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>ブランチでの作業</strong></div><div class="timeline-item-snippet">
<p>新しいブランチでコードの変更や新機能の開発、バグ修正を実施。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ３</div><div class="timeline-item-content cf"><div class="timeline-item-title">テスト/検証</div><div class="timeline-item-snippet">
<p>ブランチ内での変更が正しく動作するかを確認。問題がなければ次のステップに進む。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ４</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>プルリクエストの作成</strong></div><div class="timeline-item-snippet">
<p>変更が完了しテストに合格したら、メインブランチに統合するための<strong><span class="marker-under">プルリクエスト</span></strong>を作成。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ５</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>統合（マージ）</strong></div><div class="timeline-item-snippet">
<p>プルリクエストが承認されるとブランチの変更がメインブランチに統合される。これで「実験場」での成果が正式にプロジェクトの一部となる。</p>
</div></div></li>
</ul></div>



<p>このように、ブランチを使うことで安全かつ効率的にプロジェクトを進めることができます。ブランチは、メインのコードベースを保護しつつ、新しいアイデアや変更を試すための「別の場所」や「実験場」としての役割を果たします。</p>



<h2 class="wp-block-heading"><span id="toc2">プルリクエストとは？（PR）</span></h2>



<p><strong>プルリクエスト（Pull Request/PR）</strong>は、作業ブランチ（実験場）での作業をメインのブランチに取り込むための「リクエスト（要求）」のこと。ブランチで行った変更が他のチームメンバーによって確認され、承認された後にメインのコードベースに統合されていくための、レビュー機能のようなものです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>プルリクエストは、変更内容をレビューし問題がないか確認するための重要な手続きです。</p>
</div></div>



<div class="wp-block-cocoon-blocks-timeline timeline-box cf block-box not-nested-style cocoon-block-timeline"><div class="timeline-title">プルリクエストの流れ</div><ul class="timeline">
<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ１</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>作業完了後にプルリクエストを作成</strong></div><div class="timeline-item-snippet">
<p>ブランチでの作業が完了しすべての変更をコミットした後、そのブランチをメインブランチに統合したい場合にプルリクエストを作成。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ２</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>GitHubでの操作</strong></div><div class="timeline-item-snippet">
<p>GitHub上のリポジトリページにアクセスし「Pull requests」タブをクリック。その後「New pull request」ボタンをクリックして、新しいプルリクエストを作成。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ３</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>変更内容の確認と説明</strong></div><div class="timeline-item-snippet">
<p>プルリクエストを作成する際にはどのブランチからどのブランチに変更を統合するのかを選択します（例えば「feature-branch」から「main」へ）。続いて、プルリクエストのタイトルと説明を書きますが、ここでは、どのような変更を行ったのか、その変更の目的や理由を明確に記載します。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ４</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>レビューとコメント</strong></div><div class="timeline-item-snippet">
<p>プルリクエストを他のチームメンバーがその変更内容をレビュー。レビューアは、コードを確認し、問題がないかチェック。改善点や修正が必要な部分についてコメントを残すこともあります。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ５</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>修正と更新</strong></div><div class="timeline-item-snippet">
<p>レビューアのコメントを受けて、必要に応じて変更を修正。修正後は再度プルリクエストを更新し、再レビューを依頼。</p>
</div></div></li>



<li class="wp-block-cocoon-blocks-timeline-item timeline-item cf"><div class="timeline-item-label">ステップ５</div><div class="timeline-item-content cf"><div class="timeline-item-title"><strong>承認とマージ</strong></div><div class="timeline-item-snippet">
<p>レビューアが変更を承認すると、プルリクエストをメインブランチにマージすることができます。これで、ブランチで行った変更がメインのコードベースに統合され、プロジェクトに反映されます。</p>
</div></div></li>
</ul></div>



<h3 class="wp-block-heading"><span id="toc3">GitHub上でのプルリクエストのリクエスト先</span></h3>



<p>GitHub上でのプルリクエストのリクエスト先（レビューア）は、主に以下の2つの方法で決まります。</p>



<h4 class="wp-block-heading">1. GitHub上での選択</h4>



<p>プルリクエストを作成する際に作成者が特定のレビューアを選択することができます。この方法では、以下の手順でレビューアを指定します。</p>



<ol class="wp-block-list">
<li><strong>プルリクエストの作成</strong>
<ul class="wp-block-list">
<li>ブランチでの作業が完了し、GitHub上でプルリクエストを作成。</li>
</ul>
</li>



<li><strong>レビューアの選択</strong>
<ul class="wp-block-list">
<li>プルリクエストの作成ページで、「<span class="bold-blue">Reviewers</span>」セクションがあります。このセクションでレビューを依頼したいチームメンバーを選択することができます。選択されたレビューアに通知が送られ、レビューを行う流れ。</li>
</ul>
</li>
</ol>



<h4 class="wp-block-heading">2. 事前定義</h4>



<p>プロジェクトの設定やリポジトリの管理者によって、特定のファイルやディレクトリに対するコードオーナーを事前に定義することができます。これにより特定の部分に変更があった場合、自動的にレビューアが割り当てるようにすることもできます。</p>



<ol class="wp-block-list">
<li><strong>CODEOWNERSファイルの作成</strong>
<ul class="wp-block-list">
<li>リポジトリ内に<code><span class="bold-blue">.github</span></code>ディレクトリを作成し、その中に<code><span class="bold-blue">CODEOWNERS</span></code>というファイルを置きます。</li>
</ul>
</li>



<li><strong>コードオーナーの定義</strong>
<ul class="wp-block-list">
<li><code><span class="bold-blue">CODEOWNERS</span></code>ファイル内で、特定のファイルやディレクトリに対して、レビューア（コードオーナー）を指定。例えば、以下のように記述します。</li>
</ul>
</li>
</ol>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group=""># 全てのファイルに対するコードオーナー
*       @team-member1 @team-member2

# 特定のディレクトリに対するコードオーナー
/src/   @specific-owner

# 特定のファイルに対するコードオーナー
/README.md   @documentation-owner</pre>



<p>GitHub上でのプルリクエストのリクエスト先は、作成時に手動で選択するか、事前に<code>CODEOWNERS</code>ファイルで定義する方法の２つが存在します。手動で選択する方法は柔軟性があり、その都度レビューアを決めることができます。事前定義する方法は、プロジェクトの規模が大きい場合や、特定の部分に対して常に同じ人がレビューを行う必要がある場合に便利です。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>どちらの方法も、プロジェクトのレビュー体制を整えるために有効です。</p>
</div></div>



<h2 class="wp-block-heading"><span id="toc4">マージとは？（Merge）</span></h2>



<p>プルリクエストはあくまでもレビュー機能。レビュー完了したら自動で「実験場」の資源が本番資源に統合されるわけではありません。（事前に自動でマージされる仕組みを構築することもできますが、これは後述。）</p>



<p>ここで必要となるのが<strong>マージ</strong>です。マージを正式に説明すると、<strong>異なるブランチで行われた変更を１つに統合する操作</strong>のことです。GitHubでは、この操作をGUI上から簡単に行うことができます。</p>



<figure class="wp-block-image aligncenter size-large"><img loading="lazy" decoding="async" width="800" height="434" src="https://it-biz.online/wp-content/uploads/2024/06/image-6-800x434.png" alt="" class="wp-image-9284" srcset="https://it-biz.online/wp-content/uploads/2024/06/image-6-800x434.png 800w, https://it-biz.online/wp-content/uploads/2024/06/image-6-500x271.png 500w, https://it-biz.online/wp-content/uploads/2024/06/image-6-300x163.png 300w, https://it-biz.online/wp-content/uploads/2024/06/image-6-768x417.png 768w, https://it-biz.online/wp-content/uploads/2024/06/image-6.png 1317w" sizes="(max-width: 800px) 100vw, 800px" /></figure>



<h3 class="wp-block-heading"><span id="toc5">コンフリクト（conflict）</span></h3>



<p>マージする際の注意点が<strong>コンフリクト（conflict）</strong>です。コンフリクトは異なるブランチで行われた変更が<strong>競合</strong>し、マージが自動的に行えない状態のことを指します。これは、同じファイルの同じ部分が異なる方法で変更されたときに発生します。コンフリクトは、手動で解決する必要があります。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>コンフリクトは以下のような状況で発生します。</p>
</div></div>



<ol class="wp-block-list">
<li><strong>同じファイルの同じ行を変更</strong>: 異なるブランチで同じファイルの同じ行を異なる内容に変更した場合。
<ul class="wp-block-list">
<li><code>main</code>ブランチで<code>README.md</code>の1行目を「Welcome to our project」に変更。</li>



<li><code>feature-branch</code>で同じ行を「Welcome to the best project」に変更。</li>
</ul>
</li>



<li><strong>ファイルの削除と変更</strong>: 一方のブランチでファイルが削除され、他方のブランチで同じファイルが変更された場合。</li>
</ol>



<h3 class="wp-block-heading"><span id="toc6">自動マージの設定方法</span></h3>



<p>GitHubには、<strong>特定の条件が満たされた場合にプルリクエストを自動的にマージする機能</strong>があります。以下の設定を行うことで自動マージの仕組みを実現することができます。</p>



<ol class="wp-block-list">
<li><strong>保護されたブランチの設定</strong>: リポジトリの設定で、メインブランチに対して保護されたブランチルールを設定します。これにより、特定の条件が満たされるまでマージがブロックされます。
<ul class="wp-block-list">
<li>リポジトリの「<span class="bold-blue">Settings</span>」タブを開く。</li>



<li>左側のメニューから「<span class="bold-blue">Branches</span>」を選択し、「<span class="blue">Branch protection rules</span>」セクションで「<span class="blue">Add rule</span>」をクリック。</li>



<li>保護したいブランチ（例：<code>main</code>）を選択し、マージ条件（例：ステータスチェックの合格、レビューの完了）を設定。</li>
</ul>
</li>



<li><strong>自動マージの有効化</strong>: プルリクエストのページで「<span class="bold-blue">Allow auto-merge</span>」オプションを有効にします。このオプションは、保護されたブランチのルールが満たされた場合にプルリクエストを自動的にマージします。
<ul class="wp-block-list">
<li>プルリクエストを作成または開いた状態で、「<span class="blue">Allow auto-merge</span>」ボタンをクリック。</li>
</ul>
</li>
</ol>



<div class="wp-block-cocoon-blocks-icon-box common-icon-box block-box memo-box">
<p class="has-text-align-center"><span class="badge-green">まとめ</span>　<strong>ブランチ、プルリクエスト、マージ</strong></p>



<figure class="wp-block-table"><div class="scrollable-table stfc-sticky"><table><thead><tr><th>概念</th><th>説明</th><th>主な役割</th></tr></thead><tbody><tr><td>ブランチ</td><td>プロジェクト内で独立した作業を行うための「別の場所」や「実験場」。新しい機能開発やバグ修正に使用。</td><td>メインのコードベースに影響を与えずに、独立した変更や追加作業を行うためのスペースを提供。</td></tr><tr><td>プルリクエスト</td><td>作業ブランチでの変更をメインブランチに取り込むための「リクエスト（要求）」。レビューを依頼する。</td><td>変更内容をレビューし、問題がないか確認してからメインブランチに統合するためのプロセス。</td></tr><tr><td>マージ</td><td>異なるブランチの変更を１つに統合する操作。</td><td>ブランチでの変更をメインブランチに取り込み、プロジェクト全体に反映させる。</td></tr><tr><td>コンフリクト</td><td>異なるブランチの変更が競合し、マージが自動的に行えない状態。</td><td>手動で競合する変更内容を調整し、修正を行う必要がある。</td></tr><tr><td>自動マージ</td><td>特定の条件が満たされた場合にプルリクエストを自動的にマージする設定。</td><td>プロジェクトの管理が効率化されるが、十分なレビューが行われていることが前提。</td></tr></tbody></table></div></figure>
</div>



<h2 class="wp-block-heading"><span id="toc7">【実はここからが重要？】ブランチの本質を探る</span></h2>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>最後にブランチについて１歩上の解説をしておきます。</p>
</div></div>



<p>今までの説明を少し否定しまうようですが、ブランチは「フォルダ」や「作業コピー」のイメージで理解すると本質的には誤りです。ブランチは「参照（ポインタ）」のようなものだとイメージするのが正しい理解です。</p>



<h3 class="wp-block-heading"><span id="toc8">ブランチをファイルシステム的な発想で捉えない</span></h3>



<p>Git初心者が陥りがちな誤解は「ブランチ＝独立したコードの複製」と考えることです。CVSやSubversionのような集中型バージョン管理システム（中央集権型VCS）では、ブランチを作ることはサーバー上のリポジトリに複製的な構造を用意するという意味で大げさでコストのかかる操作でした。結果的にブランチは「重い」ものという感覚をもってしまいがちです。</p>



<p>しかし、Gitではブランチは実は単なる「参照（reference）」であり、中身は<strong>「あるコミットを指し示す軽量なポインタ」</strong>にすぎません。</p>



<p><span class="badge-green">サンプル</span>　<strong>ブランチの実態</strong></p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">e4d1a3f9c03e7dfaf4e18453e8b6d6b5ad5d9263
</pre>



<ul class="wp-block-list">
<li>「master」や「main」といったブランチ名は内部的には「<code><span class="bold-blue">.git/refs/heads/main</span></code>」といったファイル名に現れる</li>



<li>中身は最新コミットのハッシュ値（SHA-1）を記述しただけの存在。</li>



<li>このファイルはテキスト数十バイト程度で超軽量なので、結果としてリポジトリの容量が倍になるようなことはない。</li>
</ul>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>Gitでブランチを1本作るというのは、「テキストファイル1枚を新たに用意して、そこにコミットIDを書き込む」程度の負荷なのです。</p>
</div></div>



<p>これがGitブランチが「軽い（lightweight）」と言われる所以です。</p>



<h3 class="wp-block-heading"><span id="toc9">ブランチは「履歴上の位置」を表すマーカー</span></h3>



<p>ブランチは特定のコミットを指しているだけなので、そのコミットから辿っていくと、そのブランチ上の過去の履歴が「一本道」になっています。コミット同士（<span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/git-commit/">コミットの本質を理解する</a>）は親子関係でつながっており、ブランチはその先端（tip）を記録する「札（タグ）」のようなものだと考えてください。</p>



<ul class="wp-block-list is-style-icon-list-check has-list-style">
<li><code>main</code>ブランチが、現時点での最新コミットを<code>abc123...</code>というハッシュで示しているとします。</li>



<li>新しいコミットが行われると、<code>main</code>ブランチは自動的にその新しいコミットのハッシュを参照先として更新します。</li>



<li>こうして、ブランチはつねに「そのブランチ上で最も新しいコミット」を指し示す存在となり、コミット履歴上の道筋を私たちに示してくれます。</li>
</ul>



<h2 class="wp-block-heading"><span id="toc10">HEAD— ブランチを追跡する特別なポインタ</span></h2>



<h3 class="wp-block-heading"><span id="toc11">HEADは「いま自分が立っている地点」を表す</span></h3>



<p>Gitを使っていると頻繁に目にする<code>HEAD</code>という単語。これは「今まさに自分が操作しているブランチ、またはコミットを指す特別なポインタ」です。HEADはGit操作の基準点と言える重要な存在です。</p>



<ul class="wp-block-list">
<li>通常、HEADは現在チェックアウトしているブランチ名を指します。</li>



<li>たとえば<code>main</code>ブランチをチェックアウトしているとき、HEADは<code>main</code>というブランチを指します。</li>



<li>この状態で新たにコミットすれば、そのコミットは<code>main</code>ブランチに追加され、HEADは新しいコミットを指す<code>main</code>ブランチの先端へと「動く」わけです。</li>
</ul>



<h3 class="wp-block-heading"><span id="toc12">デタッチドHEAD状態とは</span></h3>



<p>HEADは通常ブランチを指しますが、特定のコミットIDを直接チェックアウトした場合、HEADはブランチではなく純粋なコミットハッシュを指す「デタッチドHEAD」状態になります。この状態では新たにコミットしても既存のブランチには追加されず、「浮遊した孤立コミット」を生んでしまいます。</p>



<p>デタッチドHEADは初めて見ると混乱しがちですが、「ブランチという名札を経ず、コミットそのものを直に触っている」と考えるとわかりやすいでしょう。後でこのコミットに対してブランチを張れば、その履歴を正式なライン（ブランチ）として再利用できます。</p>



<h2 class="wp-block-heading"><span id="toc13">ブランチ操作の実体とその軽さをイメージする</span></h2>



<h3 class="wp-block-heading"><span id="toc14">ブランチ作成（git branch）</span></h3>



<p><code><span class="blue">git branch 新ブランチ名</span></code>とすれば、現在のHEADが指すコミットを参照する新しいブランチが作成されます。内部的な処理は極めてシンプルで、「<code><span class="green">.git/refs/heads/新ブランチ名</span></code>というファイルを作って、そこに今指しているコミットのハッシュを書き込む」だけです。大掛かりなコピー操作や複製は行われません。</p>



<h3 class="wp-block-heading"><span id="toc15">ブランチ切り替え（git checkout や git switch）</span></h3>



<p><code><span class="blue">git switch ブランチ名</span></code>や<code><span class="blue">git checkout ブランチ名</span></code>でブランチを切り替えると、HEADがそのブランチを指すようになります。同時に、ワーキングディレクトリ（実際のファイル群）は、ブランチが指すコミット内容に応じた状態へと同期されます。</p>



<p>ここで行われる主な処理は以下の通りです。</p>



<ol class="wp-block-list">
<li>HEADを指定ブランチに変更（テキストファイルの中身を書き換える程度）</li>



<li>新しいブランチが指すコミットのスナップショットをワーキングディレクトリに展開（必要なファイルの更新や削除）</li>
</ol>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>これらはGitが内部で行うことで、開発者にとっては「簡単に別作業ラインに切り替わった」ように感じられます。</p>
</div></div>



<h3 class="wp-block-heading"><span id="toc16">ブランチ削除（git branch -d ブランチ名）</span></h3>



<p>不要になったブランチを削除する場合、Gitは単に対応する参照ファイル(<code><span class="green">.git/refs/heads/ブランチ名</span></code>)を消すだけです。</p>



<p>もともとブランチは「参照」なので、それを消したからといって、そこに紐づくコミットオブジェクトが即座に消えるわけではありません。コミットはGit内部のオブジェクトとして保持され続け、ほかのリファレンス（タグや別ブランチ、リフログ）が何らかの形で参照している限りは残ります。</p>



<h2 class="wp-block-heading"><span id="toc17">ブランチが軽量だからこそ可能なワークフロー</span></h2>



<h3 class="wp-block-heading"><span id="toc18">小まめなブランチ運用</span></h3>



<p>Gitがブランチを軽量で簡易なものとしているおかげで、開発者は「小さな実験や短いタスクごとにブランチを作成する」というやり方が容易にできます。</p>



<ul class="wp-block-list">
<li>新機能を試すために<code><span class="blue">feature/新機能</span></code>というブランチを作る</li>



<li>バグ修正用に<code><span class="blue">hotfix/重大バグ</span></code>というブランチを分ける</li>



<li><code>main</code>や<code>develop</code>などの安定ブランチと、実験的ブランチを並行して持つ</li>
</ul>



<p>これらすべては「テキストファイルをちょっと書き換える」程度のコストしかないため、ブランチ戦略は非常に柔軟かつ高速です。</p>



<h3 class="wp-block-heading"><span id="toc19">一時的な実験と破棄が容易</span></h3>



<p>何かを試したいときに新ブランチを作り、思いきりコードをいじってみて、結果的にうまくいかなかったらブランチごと削除するというワークフローが可能です。サーバーを巻き込んだり、履歴を複雑化したりする必要がありません。</p>



<h2 class="wp-block-heading"><span id="toc20">ブランチとコミット履歴の関係</span></h2>



<h3 class="wp-block-heading"><span id="toc21">ブランチはコミット履歴を指し示す「道標」</span></h3>



<p>ブランチは常に「どのコミットが先頭なのか」を指すことで、そのブランチ上のコミット列（履歴）を定義しています。<br>異なるブランチは、同じ祖先コミットを共有しつつ、そこから分岐した異なるストーリーラインを紡ぎます。</p>



<ul class="wp-block-list">
<li><code>main</code>ブランチは安定した製品版の流れを表す</li>



<li><code>feature/〇〇</code>ブランチは新機能開発の流れを表す</li>



<li><code>bugfix/〇〇</code>ブランチは特定バグ修正の道筋を示す</li>
</ul>



<p>こうして、ブランチが「異なる未来・過去の系譜」を記録することで、Gitリポジトリ内の変更は有向非巡回グラフ（DAG）という構造をもち、開発履歴をわかりやすく表現できます。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>GitHub Actionsとは？仕組みや使い方を３分でわかりやすく</title>
		<link>https://it-biz.online/it-skills/github-actions/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Mon, 01 Jul 2024 05:03:57 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9334</guid>

					<description><![CDATA[GitHub Actionsは、GitHub上でリポジトリ内のコードの変更を自動的にチェックしたり、テストしたり、デプロイ（公開）したりする仕組みのこと。 ポイント　GitHub Actionsの仕組み【概要】 自動化： [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>GitHub Actions</strong>は、<a href="https://it-biz.online/it-skills/github/">GitHub</a>上で<a href="https://it-biz.online/it-skills/github-repository/">リポジトリ</a>内のコードの変更を自動的にチェックしたり、テストしたり、デプロイ（公開）したりする仕組みのこと。</p>



<p class="has-text-align-center"><span class="badge-green">ポイント</span>　<strong>GitHub Actionsの仕組み</strong>【概要】</p>



<p><strong>自動化</strong>：GitHub Actionsは特定の<strong>イベント</strong>が起こったときに自動で何かを実行する仕組み。コードをリポジトリにプッシュ（アップロード）したり、プルリクエストを作成したりする「イベント」を定義し、そのイベントを契機に動作する。</p>



<p><strong>ワークフロー</strong>：ワークフローとは、どのようなイベントが発生したときに何をするかを定義したもの。例えば、「コードをプッシュしたときにテストを実行する」など。</p>



<p><strong>ジョブ</strong>：ワークフローの中で行われる一連の作業をジョブと呼ぶ。ジョブはさらに細かいステップに分けられ、それぞれ具体的な作業内容を定義する。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>この基本知識をベースに、具体的にGitHub Actionsを定義・実行する方法をご説明します。</p>
</div></div>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-17" checked><label class="toc-title" for="toc-checkbox-17">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">GitHub Actionsの使い方：ワークフロー</a><ol><li><a href="#toc2" tabindex="0">ステップ1：workflowファイルの作成</a></li><li><a href="#toc3" tabindex="0">ステップ２：workflowの定義（yaml）</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">GitHub Actionsの使い方：ワークフロー</span></h2>



<p>GitHub Actionsを理解するための最も重要なポイントは、ワークフローファイル（workflowファイル）。このファイルが、どのようなイベントでどのようなアクションを実行するかを定義しており、逆に言えばこのファイルを作成することができれば、GitHub Actionsを利用することができるようになります。</p>



<h3 class="wp-block-heading"><span id="toc2">ステップ1：workflowファイルの作成</span></h3>



<p>リポジトリのトップページに移動。「<span class="blue">Add file</span>」ボタン→「<span class="blue">Create new file</span>」で、ファイル名<code><span class="blue">.github/workflows/main.yml</span></code>と入力。このディレクトリとファイルがワークフローファイルの標準的な場所です。</p>



<p>ファイル名はなんでもOK。ディレクトリは固定ですが、目的に応じてファイル名は使い分けOKです。</p>



<p><code>.github/workflows/ci.yml</code></p>



<p><code>.github/workflows/deploy.yml</code></p>



<p><code>.github/workflows/test-workflow.yml</code></p>



<h3 class="wp-block-heading"><span id="toc3">ステップ２：workflowの定義（yaml）</span></h3>



<p>GitHub Actionsのworkflowファイルは<strong>YAML形式</strong>で記述され、インデントによる階層構造やキーと値のペア、リストの表現が特徴です。このYAMLファイルを正しく記述することで、さまざまな自動化タスクを簡単に設定できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">name: Java CI

on: [push, pull_request]

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
    - name: Check out repository code
      uses: actions/checkout@v2

    - name: Set up JDK 11
      uses: actions/setup-java@v2
      with:
        java-version: '11'

    - name: Build with Maven
      run: mvn -B package --file pom.xml

    - name: Run tests
      run: mvn test</pre>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>ポイントとなる部分をピックアップして解説します。</p>
</div></div>



<h4 class="wp-block-heading">１．ワークフローの名前</h4>



<p><strong>name</strong>: ワークフローの名前を指定します。この名前はGitHubの「Actions」タブで表示されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">name: Java CI</pre>



<h4 class="wp-block-heading">２．イベントのトリガー</h4>



<p><strong>on</strong>: ワークフローが実行される<strong>イベント</strong>を指定します。この例では、<code><span class="blue">push</span></code>（コードがプッシュされたとき）と<code><span class="blue">pull_request</span></code>（プルリクエストが作成されたとき）にワークフローがトリガーされます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">on: [push, pull_request]</pre>



<h4 class="wp-block-heading">３．ジョブの定義</h4>



<p><strong>jobs</strong>: 実行するジョブを定義します。</p>



<ul class="wp-block-list">
<li><strong>build</strong>: ジョブの名前。この名前は任意。ここでは他のジョブと区別するためにbuildとしています。</li>



<li><strong>runs-on</strong>: ジョブが実行される環境を指定します。この例では<code><span class="blue">ubuntu-latest</span></code>を使用しています。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">jobs:
  build:
    runs-on: ubuntu-latest</pre>



<h4 class="wp-block-heading">４．ステップの定義</h4>



<p><strong>steps</strong>: ジョブ内の各ステップを定義します。各ステップは順番に実行されます。</p>



<ul class="wp-block-list">
<li><strong>name</strong>: ステップの名前を任意で指定。ステップが何をするかを説明することが一般的。</li>



<li><strong>uses</strong>: 既存のアクションを利用する場合に使用します。ここでは、リポジトリのコードをチェックアウトする<code><span class="blue">actions/checkout@v2</span></code>アクションを使用しています。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">steps:
  - name: Check out repository code
    uses: actions/checkout@v2</pre>



<ul class="wp-block-list">
<li><strong>with</strong>: アクションに渡すパラメータを指定します。ここでは、<code><span class="blue">actions/setup-java@v2</span></code>アクションを使用して、Javaバージョン11をセットアップしています。</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">  - name: Set up JDK 11
    uses: actions/setup-java@v2
    with:
      java-version: '11'</pre>



<ul class="wp-block-list">
<li><strong>run</strong>: シェルコマンドを直接実行する場合に使用します。この例では、Mavenを使ってプロジェクトをビルドしています。（<span class="badge-green">関連</span>　<a href="https://it-biz.online/java/maven/">Mavenとは？</a>）</li>
</ul>



<pre class="EnlighterJSRAW" data-enlighter-language="yaml" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">  - name: Build with Maven
    run: mvn -B package --file pom.xml</pre>



<p>このワークフローファイルをリポジトリに追加することで、コードがプッシュされたりプルリクエストが作成されたときに自動的にJavaプロジェクトがビルドされ、テストが実行されます。<strong>特別な設定は不要で、ファイルを所定のディレクトリに格納することで自動的にワークフローが実行されます。</strong></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Github：タグ(tag)とは何か？使い方を１分でわかりやすく解説</title>
		<link>https://it-biz.online/it-skills/github-tag/</link>
		
		<dc:creator><![CDATA[ビズドットオンライン]]></dc:creator>
		<pubDate>Tue, 18 Jun 2024 08:55:37 +0000</pubDate>
				<category><![CDATA[IT-Skills]]></category>
		<category><![CDATA[GitHub]]></category>
		<category><![CDATA[プログラミング]]></category>
		<guid isPermaLink="false">https://it-biz.online/?p=9319</guid>

					<description><![CDATA[タグ（tag）は、リポジトリの特定の時点の状態を保持しておくための「しるし」や「マーカー」のようなものです。この「しるし」を付けておくことで、重要なバージョンの管理や、必要に応じてそのバージョンに戻ることを可能にしてくれ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p><strong>タグ（tag）</strong>は、リポジトリの特定の時点の状態を保持しておくための「しるし」や「マーカー」のようなものです。この「しるし」を付けておくことで、重要なバージョンの管理や、必要に応じてそのバージョンに戻ることを可能にしてくれる便利な仕組みです。</p>



<p class="has-text-align-center"><span class="badge">参考</span>　<a href="https://it-biz.online/it-skills/github-repository/">Githubの「リポジトリ」とは？</a></p>



<p>具体的に説明すると、タグは特定のコミット（変更履歴）に名前を付ける機能で、主に本番リリース時などの重要な節目に使われることが一般的。このページではタグの基本理解と使い方を１からわかりやすく１分で解説します。</p>




  <div id="toc" class="toc tnt-number toc-center tnt-number border-element"><input type="checkbox" class="toc-checkbox" id="toc-checkbox-19" checked><label class="toc-title" for="toc-checkbox-19">目次</label>
    <div class="toc-content">
    <ol class="toc-list open"><li><a href="#toc1" tabindex="0">Github：タグとは？</a></li><li><a href="#toc2" tabindex="0">Github：タグの使い方</a><ol><li><a href="#toc3" tabindex="0">ステップ１：タグを付けたいコミットに移動</a></li><li><a href="#toc4" tabindex="0">ステップ２：タグを作成</a></li><li><a href="#toc5" tabindex="0">ステップ３：タグをリモートリポジトリにプッシュ</a></li><li><a href="#toc6" tabindex="0">ステップ４：タグの確認</a></li><li><a href="#toc7" tabindex="0">ステップ５：タグの削除</a></li></ol></li></ol>
    </div>
  </div>

<h2 class="wp-block-heading"><span id="toc1">Github：タグとは？</span></h2>



<p>Githubのタグは、<strong>リポジトリの特定の時点の状態を保存しておくための「しるし」や「マーカー」</strong>のようなものです。タグを適切に使うことで、その時点のプロジェクトの状態を簡単に見つけたり、戻ったりすることができるようになる便利な仕組みの１つ。</p>



<p>例えば毎日その日にあった出来事や感じたことを書き留めている日記があるとします。日々なんてことのない日常を書ている場合もあるかもしれませんが、たまに大切な日やイベントについて書くこともあるでしょう（例えば、誕生日や旅行した日とか）。このようなタイミングで日記に貼る「<strong>付箋</strong>」のような役割をするのがタグです。</p>



<div class="wp-block-cocoon-blocks-balloon-ex-box-1 speech-wrap sb-id-1 sbs-stn sbp-l sbis-cb cf block-box not-nested-style cocoon-block-balloon"><div class="speech-person"><figure class="speech-icon"><img decoding="async" src="https://it-biz.online/wp-content/uploads/2023/06/man.png" alt="" class="speech-icon-image"/></figure><div class="speech-name"></div></div><div class="speech-balloon">
<p>後で日記を読み返すときにこの「付箋」が貼ってあるページをめくれば、すぐにその大切な日のページを見つけることができますよね。</p>
</div></div>



<p>これと同じでGithubのタグも同じような役割を果たします。プロジェクトが進行する中で、重要な節目やリリースのタイミングに「タグ」というしるしをつけるものだと理解できればOK。</p>



<h2 class="wp-block-heading"><span id="toc2">Github：タグの使い方</span></h2>



<p>Github上でタグを使う方法を順を追って説明します。タグの作成、確認、削除の手順について詳しく見ていきましょう。</p>



<h3 class="wp-block-heading"><span id="toc3">ステップ１：タグを付けたいコミットに移動</span></h3>



<p>タグは特定の<strong>コミット</strong>に対して付与します</p>



<p>まず、プロジェクト内の特定の変更（コミット）にタグを付けたい場合はそのコミットに移動（<span class="blue">git checkout &lt;コミットID></span>）。コミットIDは、特定の変更を一意に識別するためのコードで、例えば「<span class="blue">git checkout abc1234</span>」と入力すると、そのコミットに切り替わります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git checkout &lt;コミットID></pre>



<h3 class="wp-block-heading"><span id="toc4">ステップ２：タグを作成</span></h3>



<p>次にタグを作成します。これも簡単に「<span class="blue">git tag v1.0.0</span>」と入力すればOKで、これにより「v1.0.0」という名前のタグが現在のコミットに付与されます。<span class="blue">v1.0.0</span> の部分は好きな名前でOKですが、後から見て何のタグなのか？をわかるようにしておきます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git tag v1.0.0</pre>



<p>アノテーション付きのタグを作成する場合は「<span class="blue">git tag -a v1.0.0 -m "リリースバージョン1.0.0"</span>」と入力します。これにより、タグにメッセージを追加できます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git tag -a v1.0.0 -m "リリースバージョン1.0.0"</pre>



<div class="wp-block-cocoon-blocks-faq faq-wrap blank-box block-box not-nested-style cocoon-block-faq"><dl class="faq"><dt class="faq-question faq-item"><div class="faq-question-label faq-item-label">Q</div><div class="faq-question-content faq-item-content">アノテーションとは？</div></dt><dd class="faq-answer faq-item"><div class="faq-answer-label faq-item-label">A</div><div class="faq-answer-content faq-item-content">
<p>タグに付与できる追加の情報。作成者、日付、メッセージなどが具体例。アノテーション付きタグは、単なるラベルではなく、より詳細な説明をタグに含めることができるため、頻繁に利用されます。</p>
</div></dd></dl></div>



<h3 class="wp-block-heading"><span id="toc5">ステップ３：タグをリモートリポジトリにプッシュ</span></h3>



<p>作成したタグを他の人と共有するためには通常のソースコードと同様、<strong>リモートリポジトリにプッシュ</strong>すればOK。「<span class="blue">git push origin v1.0.0</span>」というコマンドを実行すると、タグがリモートリポジトリに送信されます。これで、他のチームメンバーもこのタグを参照することが可能になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git push origin v1.0.0</pre>



<h3 class="wp-block-heading"><span id="toc6">ステップ４：タグの確認</span></h3>



<p>タグが正しく作成されプッシュされたかどうかを確認するために、リモートリポジトリのGitHubページにアクセスします。リポジトリのページで「<span class="blue">Releases</span>」タブをクリックすると作成したタグの一覧が表示されます。ローカルでタグを確認する場合は、ターミナルで「<span class="blue">git tag</span>」と入力すると、作成されたタグの一覧が表示されます。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git tag</pre>



<h3 class="wp-block-heading"><span id="toc7">ステップ５：タグの削除</span></h3>



<p>不要になったタグを削除する場合、まずはローカルリポジトリからタグを削除します。これは「<span class="blue">git tag -<span class="bold-red">d</span> v1.0.0</span>」とコマンドを打つだけ。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git tag -d v1.0.0</pre>



<p>次に、リモートリポジトリからタグを削除します。リモートリポジトリからタグを削除するには、以下コマンドを実行します。※プレフィックス「<span class="blue">refs/tags/</span>」を使用することで、Gitは特定のタグ参照を正確に識別することが可能になります。</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">git push origin :refs/tags/v1.0.0</pre>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
