プログラミング学習 Day 13:Git

ソフトウエア開発はグループ、チームのプロジェクトであり、開発内容とその進捗をどのように共有するかが重要なテーマです。そのために必須なのがプログラムのバージョン管理ツールであり、その代表的なOSSのGitを紹介します。

■Git

UCLAの教授、卒業生たちといっしょに89年に米国で設立したソフトウエア開発のベンチャー企業(TwinSun)は、日本の大手企業から出資を受けて様々なソフトウエアを長年にわたって開発してきました。その中で特別に思い出があるのは、今やOSSの中心的な存在で、プログラマにとって必須のものであるGitがあります。Linus(Linuxの創始者)が始めたOSSプロジェクトのGitのメンテナーとして活躍したのが、当時の会社のメンバだった濱野氏です。週1日をGitに専念することに会社が合意して彼はGitのメンテナーを続けることができました。数年後、彼はGoogleに移籍して、メンテナーを続けています。
ソフトウエア開発はグループ、チームのプロジェクトであり、開発内容とその進捗をどのように共有するかが重要なテーマです。毎日のようにプログラマたちが開発を進めるプログラムそのものをほぼリアルタイムにメンバーが閲覧でき、コメントを入れたり、修正を加えたり、修正前のプログラムに戻ってみたり、誤った変更を戻したりすることができることが望まれます。それを可能にするのがプログラムのバージョン管理です。Linusは当時すでに広く普及しかけていたLinux(OS)の改良を公開するために新しい分散型バージョン管理システムを設計し、開発したいと考えていました。その基本部分を開発してくれるチームを探していました。企業内のプロジェクトではないので、広くインターネットで開発チームを募集していたのです。メンテナーというのはプロジェクトリーダで設計・プログラムの採用、変更の最終的な決定権をもち、技術的にも開発の中心的な役割をもちます。Python やPHPなどのプログラミング言語も同様にOSSですので、それぞれメンテナーが存在しています。企業内の活動とは独立して、個人が自由に開発を担当するという新しい形態のソフトウエア開発手法であるOSSによって、現在のAIの発展があると考えています。
LLMの開発の中心的なソフトウエアのTransformersも世界中の誰でもが自由に利用できるOSSです。
ところで、そのGitとは何であるかをこの回で説明します。ところでそのGitを使って新しいビジネスモデルを事業にしたのがGithubです。クラウドにサーバを立てて、誰でも自由に無償でプログラムのソースコードを管理するという画期的なアイディアでした。現在では、そのGithubはMSグループに入って、OpenAIのChatGPTを使ったCopilotを組み込んでプログラムの自動作成を支援する方向をめざしています。

Gitの概要

Git は分散型バージョン管理システム(Distributed Version Control System)で、プログラムのソースコードの変更履歴を記録・管理し、プログラマたちの共同開発の強力な支援ツールとなっています。
複数のサーバにリポジトリRP(プログラムの集合体)の完全な履歴があり、オフラインでも履歴閲覧やコミット(書き込み)が可能です。
すべての履歴は差分が記録されているため、履歴閲覧や更新がいつでもどこにいても可能になっています。

Gitの主要な概念

リポジトリ(repository): プロジェクトの履歴とメタデータを保持する単位。ローカルリポジトリとリモート(例: GitHub)がある。
コミット(commit): プログラムのある時点でのスナップショット(変更の単位)であり、履歴の基本単位。
ブランチ(branch): 変更の流れを分けるポインタの設定。機能開発や修正ごとにブランチを切る。
マージ(merge): ブランチの変更を別ブランチに統合する操作。
リベース(rebase): あるブランチのベースを別のコミットに付け替えることで履歴を書き換える。
リモート(remote): origin など、別のホストサーバ上のリポジトリ。push/pull/fetch で同期する。
タグ(tag): 特定コミットにつける名前(リリース等に使用)。
スタッシュ(stash): 一時的に作業内容を退避する。

基本的なコマンド

- 初期化 / クローン
- git init
- git clone <repo-url>

- 変更を記録する
- git status
- git add <file>
- git commit -m "メッセージ"

- ブランチ操作
- git branch # ブランチ一覧
- git checkout -b feature/x # 新しいブランチを作って切り替え
- git switch feature/x # 切り替え(最近の推奨コマンド)

- リモート連携
- git fetch origin
- git pull # fetch + merge(設定により rebase も可)
- git push origin <branch>

- 統合
- git merge feature/x
- git rebase origin/main # ローカルコミットを最新の main の上に移す

- 履歴確認・差分
- git log --oneline --graph
- git diff
- git show <commit>

- 一時退避・復元
- git stash
- git stash pop

- 履歴修正(注意)
- git commit --amend # 最新コミットを修正
- git rebase -i HEAD~3 # インタラクティブリベースで履歴編集

典型的なワークフロー(例: feature ブランチでファイル名をfoo

1. git checkout -b feature/foo
2. 変更 -> git add -> git commit
3. git fetch origin && git rebase origin/main # ローカルを最新版に合わせる(コンフリクト解決)
4. git push origin feature/foo
5. Pull Request を作成してレビュー→マージ
6. git checkout main && git pull && git branch -d feature/foo

良い使い方

- 小さく意味のあるコミットを心がける(メッセージは説明的に)。
- main を常に安定させる。機能はブランチで作る。
- 他人と共有する前に rebase や force push は十分注意(公開済みコミットはなるべく書き換えない)。
- 強制的な push が必要なときは --force-with-lease を使う(安全性向上)。
- .gitignore を使い不要なファイルや秘密情報をコミットしない。
- レビューと CI を使って品質を担保する。

主なブランチ運用モデル

- GitHub Flow: main は常にデプロイ可能。短い feature ブランチを PR でマージ。
- Git Flow: release・develop 等の役割分けがある運用(大規模プロジェクト向け)。
- Trunk-based Development: 短命のブランチ/直接 trunk に統合し、フィーチャフラグで管理。継続的デリバリ向け。

トラブル時のコマンド

- 未コミットの変更を一時保存: git stash
- 誤って削除したブランチを復元: git reflog でコミット id を探して git checkout -b recovered <id>
- マージコンフリクト発生時: 該当ファイルを編集 → git add ファイル → git merge --continue または git rebase --continue

簡単なGit・Githubの使った例

ローカルマシン(wsl)にGitを導入し、bs-demoのディレクトリに2つのプログラムを配置。

(.venv) (base) matsuo@DESKTOP-1295BP3:~/bs-demo$ git init
(.venv) (base) matsuo@DESKTOP-1295BP3:~/bs-demo$ git add .
(.venv) (base) matsuo@DESKTOP-1295BP3:~/bs-demo$ git commit -a
[main (root-commit) e4c9ea4] Initial commit new file: bsearch.pas new file: bublesort.py
2 files changed, 166 insertions(+)
create mode 100755 bsearch.pas
create mode 100644 bublesort.py

上記のディレクトリからGithubにUPする例

(.venv) (base) matsuo@DESKTOP-1295BP3:~/bs-demo$ git remote add origin git@github.com:higenobu/bs-demo.git
(.venv) (base) matsuo@DESKTOP-1295BP3:~/bs-demo$ git branch -M main
(.venv) (base) matsuo@DESKTOP-1295BP3:~/bs-demo$ git push -u origin main
Enter passphrase for key '/home/matsuo/.ssh/id_ed25519':
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Delta compression using up to 16 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 1.62 KiB | 829.00 KiB/s, done.
Total 4 (delta 0), reused 0 (delta 0), pack-reused 0
To github.com:higenobu/bs-demo.git
* [new branch] main -> main
branch 'main' set up to track 'origin/main'.

Githubの画面

参考

  • 入門 Git 著者 濱野純 秀和システム 2009年




テキスト

著者:松尾正信
株式会社京都テキストラボ代表取締役