2005年春、LinuxカーネルコミュニティはBitKeeperを失いました。そしてわずか数週間で、世界中のプログラマーの習慣を変えるものが登場しました。Gitがなぜ勝ったのか、Gitの内部構造はどのようなものなのか、そして初心者がGitから何を得ることができるのかを見ていきましょう。
TL; DR:Gitはスナップショット、グラフ(DAG)、および安価なブランチです。その結果、オフラインでの作業のスピード、信頼性、自由が得られます。
Git へ:中央集中型バージョン管理とその制限 🧯
CVS/SVN 中央サーバーに依存していました。ネットワークがなければ、コミットはありません。
ブランチは「高価」で、マージは痛みを伴いました。チームはしばしば実験を引き延ばしました。
「プロジェクトの状態のスナップショット」ではなく、「すべてのファイルに差分」という考え方は、ストーリーを複雑にしました。
毎月数千のパッチが適用されるLinuxカーネルでは、これはボトルネックになりました。
Gitが登場した理由と、どのようなものであるべきか ⚙️
📦 分散性:誰もが履歴の完全なコピーを持っている。コミットとブランチはオフライン。
⚡ 速度:膨大な履歴に対するインスタントローカル操作。
🧪 信頼性:ハッシュを介した履歴の暗号化された完全性。
🌿 安い枝:作成、切り替え、マージはイベントではなくルーチンです。
すべてを変えたGitの重要なアイデア 💡
差分ではなくスナップショット:コミットは、パッチのセットではなく、プロジェクトの状態のスナップショットです。
メルクルの木:オブジェクト(
blob,tree,commit,tag)はハッシュで関連付けられています—履歴は完全です。ブランチ — ポインタ:これはコミットへのリンクにすぎません。操作は瞬時に行われます。
DAGの歴史:合併は通常の安価な操作であり、「ヒーロイズム」ではありません。
ローカル作業:コミット、ログ、比較—ネットワークなし。同期—
push/pull。
# メンタルイメージ
(main)─A─B─C
╲
(feature) D─E ← ветка — это указатель; merge/rebase двигают ссылкиボンネットの下:Gitオブジェクトモデル🧬
オブジェクト | 保存内容 | なぜ |
|---|---|---|
| ファイルの内容 | コンテンツのターゲティングと重複排除 |
| ファイルとフォルダへのリンク | コミット時のディレクトリ構造 |
|
| 写真+歴史上の場所 |
| 署名付きオブジェクトリンク | リリースと「マイルストーン」 |
歴史的にSHA-1。最新のアセンブリはSHA-256をサポートしています。いずれにせよ、ハッシュは履歴を「まとめる」ものです。
30分間のミニワークショップ🛠️
リポジトリを作成します。
git init、2つのファイルを追加し、2〜3つの小さなコミットを作成します。ブランチ:
git switch -c feature、ファイルを変更し、コミットします。mainにgit switch main && git merge featureを注ぎます。履歴をご覧ください:
git log --graph --oneline --decorate。探偵ごっこをしましょう:
git bisectは人工バグです。ローカルで履歴を編集します:
git rebase -i HEAD~3(スクワッシュ/名前変更)。同意なしにプッシュしないでください!
# コマンドのヒント
git init
git add .
git commit -m "init"
git switch -c feature
# ...編集...
git commit -m "feature: add X"
git switch main
git merge feature
git log --graph --oneline --decorate初心者がよくするミスと、素早い解決策 🧭
🔗 Detached HEAD — 実験の前に常にブランチを作成してください:
git switch -c exp。♻️ Rebase vs merge - rebaseは履歴を上書きします。一般的に、repoではmergeを使用することが多いです。
📦 大きなファイル — Git LFSまたは外部ストアを介してアーティファクトを保存します。
↩️ キックバック —
reset --hardではなく、git revert(新しいコミット) の方が安全です。
B コディケ 私たちはプログラミングの学習を楽しくわかりやすくします。ステップバイステップでスキルを磨くのに役立つ課題を伴う興味深いコースを用意しています。
また、アクティブな テレグラムチャンネル、ここでは素晴らしいアイデアについて話し合い、経験を共有し、課題を一緒に分析します。学習は有益であるだけでなく、楽しいものになります。
まとめ:Gitの歴史から学ぶこと🧰
Gitは、Linuxカーネルの大規模な開発という苦労から生まれたものなので、ブランチとマージが得意です。
スナップショットとDAGは「魔法の」ベールを取り除きます。差分パッチではなく、ストーリーで考え始めましょう。
短いブランチと頻繁なコミットを行う。Gitはこのプロセスで展開されます。
Git での最初の「トラブル」は、detached HEAD、rebase コンフリクト、または「失われた」コミットのどれですか?
