<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Github on Wuyukwi's Notebook</title><link>https://wuyukwi.duckdns.org/tags/github/</link><description>Recent content in Github on Wuyukwi's Notebook</description><generator>Hugo</generator><language>ja</language><lastBuildDate>Wed, 25 Feb 2026 17:25:36 +0900</lastBuildDate><atom:link href="https://wuyukwi.duckdns.org/tags/github/index.xml" rel="self" type="application/rss+xml"/><item><title>🎉 Git を「完全に理解」するためのデータ構造の話</title><link>https://wuyukwi.duckdns.org/posts/zenn-12736c19b679d6/</link><pubDate>Wed, 25 Feb 2026 17:25:36 +0900</pubDate><guid>https://wuyukwi.duckdns.org/posts/zenn-12736c19b679d6/</guid><description>&lt;blockquote&gt;
&lt;p&gt;📌 &lt;em&gt;この記事は &lt;a href="https://zenn.dev/wuyukwi/articles/12736c19b679d6"&gt;Zenn&lt;/a&gt; に投稿した内容のアーカイブです。&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id="はじめに"&gt;はじめに&lt;/h1&gt;
&lt;p&gt;Git を使っていて、こんな感覚になったことはありませんか？&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;コマンドは打てるけど、何が起きているか分からない&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;merge と rebase の違いを、説明しろと言われると詰まる&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;conflict が出ると、なぜ衝突したのか理解できない&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多くの Git 解説記事は、&lt;br&gt;
&lt;strong&gt;「何を打つか」&lt;/strong&gt; は丁寧に教えてくれますが、&lt;br&gt;
&lt;strong&gt;「なぜそうなるか」&lt;/strong&gt; までは踏み込んでくれません。&lt;/p&gt;
&lt;p&gt;その結果、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;なんとなく使えているが、仕組みはよく分からない&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;という状態に陥りがちです。&lt;/p&gt;
&lt;p&gt;この記事では、コマンドの説明はほぼ行いません。&lt;br&gt;
代わりに、&lt;strong&gt;Git の内部構造をデータ構造として捉え直す&lt;/strong&gt; ことで、&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;「あ、そういうことだったのか」&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;と腑に落ちる理解を目指します。&lt;/p&gt;
&lt;p&gt;少しだけ &lt;strong&gt;グラフ理論&lt;/strong&gt; と &lt;strong&gt;ポインタの概念（C 言語）&lt;/strong&gt; の素養があると、&lt;br&gt;
かなりスムーズに理解できると思います。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="git-の正体木構造ではなく-dag有向非巡回グラフ"&gt;Git の正体：木構造ではなく DAG（有向非巡回グラフ）&lt;/h2&gt;
&lt;p&gt;多くの人は、Git の履歴を「木構造」としてイメージしています。&lt;/p&gt;
&lt;p&gt;しかし、これは正確ではありません。&lt;/p&gt;
&lt;p&gt;Git の本質は &lt;a href="https://ja.wikipedia.org/wiki/%E6%9C%89%E5%90%91%E9%9D%9E%E5%B7%A1%E5%9B%9E%E3%82%B0%E3%83%A9%E3%83%95"&gt;有向非巡回グラフ&lt;/a&gt;です。&lt;/p&gt;
&lt;h3 id="commit-はノード"&gt;Commit は「ノード」&lt;/h3&gt;
&lt;p&gt;すべての commit は、グラフ上の &lt;strong&gt;ノード&lt;/strong&gt; です。&lt;/p&gt;
&lt;p&gt;各 commit は、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ファイルのスナップショット&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;親 commit への参照（1 個または 2 個）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;を持っています。&lt;/p&gt;
&lt;h3 id="親が-2-個になる瞬間--merge"&gt;親が 2 個になる瞬間 = merge&lt;/h3&gt;
&lt;p&gt;通常の commit は親が 1 つですが、&lt;br&gt;
merge commit は &lt;strong&gt;親を 2 つ&lt;/strong&gt; 持ちます。&lt;/p&gt;</description></item></channel></rss>