WinFormsで2人開発|Git共有の基本を体験する
Gitチーム開発シリーズ:なぜGitを使うのか|WinFormsで2人開発を体験する(今ここ)|コンフリクトを体験して解消する|ブランチを体験する|Pull Requestを体験する|よくある失敗とFAQ|4人チームでクイズアプリを作る|[目次へ]
プログラミング学習では、最初は一人でコードを書くことが多いです。 しかし実際の開発現場では、複数人でプログラムを作るのが普通です。
そのため授業でも
- Git
- チーム開発
- 役割分担
を体験してもらうことがあります。
この記事は、2人で同じGitリポジトリを共有し、Pull・Commit・Pushの基本を体験する第1段階です。今回はWinFormsアプリを2人で開発します。共同作業の基本を体験するため、あえて作業用のブランチを分けず、2人とも main 上で順番に作業します。ブランチ運用は後の記事で扱います。ブランチやPull Request、レビューを使う4人開発は、次の発展編で扱います。

チーム開発の基本
チーム開発では、次の3つが重要になります。
①役割分担:誰がどこを作るか決める
②履歴管理:変更を記録する
③統合:別々に作ったコードをまとめる
このために使うツールが Git です。
今回作るアプリ
シンプルな例として 電話帳アプリ を作ります。
機能
- 名前一覧表示
- 名前クリック
- 電話番号表示
データは 名前,電話番号 形式のファイルから読み込みます。
前提:電話帳アプリの作り方を知っているとスムーズです。一人で作る手順は「WinFormsで作る電話帳アプリ(Listで管理する版)」を参照してください。
補足:この記事では Aさんがプロジェクトを作成し、2人で役割分担してゼロから作る手順です。電話帳の記事を事前に一人で完了している場合は、そのプロジェクトを GitHub に公開して Bさんと共有する形でも進められます。その場合もプロジェクト名は PhoneBook に揃えると、第2回以降の Clone 先(PhoneBook_Conflict など)と区別しやすくなります。
準備(事前に1人でやる作業)
2人で開発を始める前に、Aさんが次の準備を行います。
① プロジェクト作成とGit初期化
- Visual Studio で Windows Forms アプリ(現在のサポート中の.NET版)のプロジェクトを作成(プロジェクト名:PhoneBook)。実行フォルダやファイルパスは、後述の説明を確認します。
- プロジェクトフォルダを GitHub Desktop にドラッグ
- 「Create a repository here」でリポジトリを作成
- ダイアログで 「Git ignore」を「Visual Studio」に設定(
bin、obj、.vsを除外)
- ダイアログで 「Git ignore」を「Visual Studio」に設定(
- 「Publish repository」で GitHub に公開
② Bさんを Collaborator に追加
- GitHub のリポジトリページを開く
- 「Settings」→「Collaborators」→「Add people」
- Bさんの GitHub ユーザー名を入力して招待
③ Bさんが参加する
- Bさんは招待メールのリンクからリポジトリにアクセスし、Aさんが共有したGitHubのPhoneBookリポジトリページを開く
- 緑色のCodeボタンを押し、Open with GitHub Desktopを選ぶ。確認が表示されたら、GitHub Desktopを開くことを許可する
- GitHub Desktopでリポジトリと Local path(自分のPCの保存先)を確認し、Clone を押す
- Clone したフォルダを Visual Studio で開く
補足:ブラウザーからGitHub Desktopが開かない場合は、DesktopのFile → Clone repositoryで該当リポジトリを選んでも同じようにクローンできます。一覧に見つからない場合は、URLタブにAさんが共有したリポジトリのURLを入力します。
これで2人とも同じプロジェクトを編集できる状態になります。
作業の順番(タイムライン)
同時に同じファイルを編集しないことが重要です。今回は共同作業をスムーズに進める体験をするため、作業順と担当を分けます。コンフリクトを起こして解消する実習は後の記事で扱います。次の順番で進めます。
① Aさん:PhoneData と data.txt を作成
やること
PhoneData.csを追加し、クラスを定義する- ソリューション エクスプローラーで PhoneBook プロジェクトを右クリックし、「追加」→「新しい項目」からテキストファイル
data.txtを追加する。プロジェクト直下に置き、名前,電話番号形式でサンプルデータを書き、UTF-8 で保存する data.txtを選び、プロパティ(F4)の「出力ディレクトリにコピー」を「新しい場合はコピーする」に設定する。ビルド時に実行フォルダへコピーされ、④で読み込めるようになる
PhoneData.cs
class PhoneData
{
public string Name { get; set; } = "";
public string PhoneNumber { get; set; } = "";
}
data.txt
田中,090-1111-1111
佐藤,090-2222-2222
鈴木,090-3333-3333
※1行目に「名前,電話番号」などのヘッダ行は入れない。空行も入れない。④のコードでは、誤って入った空行は読み飛ばします。(電話帳の記事を参照する場合も、data.txt はこの形式で作成してください)
この実習では、上記の3件のサンプルデータを使います。各行は半角カンマで区切った「名前,電話番号」の2項目にしてください。④のコードはカンマのない行ではエラーになり、同じ名前が複数ある場合は最初に見つかった電話番号を表示します。
GitHub Desktop では PhoneData.cs、元の data.txt、コピー設定が保存された .csproj の変更を確認し、まとめて Commit します。bin 内のコピーは共有しません。Bさんの環境でもビルド時に作成されます。
Commit:「PhoneDataクラスとdata.txt追加」→ Push
② Bさん:Pull → フォームにコントロールを配置
作業前:Pull で Aさんの変更を取得
やること
- Form1 に ListBox(名前:
nameList)を配置 - Form1 に TextBox または Label(名前:
phoneNumber)を配置
| コントロール | 名前 |
|---|---|
| ListBox | nameList |
| TextBox または Label | phoneNumber |
Commit:「ListBoxとphoneNumberを配置」→ Push
③ Bさん:ListBox の選択変更イベントを追加
やること
- フォームデザイナー上の
nameListをダブルクリックして、選択変更イベント(SelectedIndexChanged)の空メソッドを作成する - Visual Studio では
nameList_SelectedIndexChangedという名前で自動作成される。中身は Aさんが後で担当するので、ここでは空のまま Commit する
private void nameList_SelectedIndexChanged(object sender, EventArgs e)
{
// 中身は Aさんが後で書く
}
Commit:「ListBoxの選択変更イベント追加」→ Push
④ Aさん:Pull → ファイル読み込みと表示処理を追加

作業前:Pull で Bさんの変更を取得
やること
Form1.csにphoneBook、ReadFromFile()、コンストラクタの処理、nameList_SelectedIndexChangedの中身を書く- ①で設定した
data.txtを、Path.Combine(Application.StartupPath, "data.txt")で読み込む
Application.StartupPath はアプリの実行ファイルがあるフォルダ、Path.Combine はフォルダとファイル名をつなぐメソッドです。これで .NET のバージョンや Debug/Release によるフォルダ階層の違いを数える必要がなくなります。データを変更するときはプロジェクト内の元の data.txt を編集し、再ビルドします。
ファイルが見つからない場合は、プロジェクト直下の data.txt のプロパティで「出力ディレクトリにコピー」が「新しい場合はコピーする」になっているか確認し、プロジェクトを再ビルドしてください。
Form1.cs の先頭(namespace より前)に using System.IO; を追加します。List<T> には using System.Collections.Generic;、WinForms には using System.Windows.Forms; を使います。既にある場合や暗黙的に読み込まれている場合は重複追加しなくて構いません。
Form1.cs の Form1 クラス内に書くコード
以下はファイル全体ではなく、public partial class Form1 : Form の内側に書くコードです。既存のコンストラクタと③のイベントメソッドを置き換え、同じメソッドを二重に追加しないでください。namespace やクラスの外枠、InitializeComponent(); は残します。
List<PhoneData> phoneBook;
public Form1()
{
InitializeComponent();
phoneBook = new List<PhoneData>();
ReadFromFile();
foreach (PhoneData data in phoneBook)
{
nameList.Items.Add(data.Name);
}
}
private void ReadFromFile()
{
string filePath = Path.Combine(Application.StartupPath, "data.txt");
using (StreamReader file = new StreamReader(filePath))
{
while (!file.EndOfStream)
{
string? line = file.ReadLine();
if (string.IsNullOrWhiteSpace(line))
{
continue;
}
string[] data = line.Split(',');
PhoneData phone = new PhoneData();
phone.Name = data[0];
phone.PhoneNumber = data[1];
phoneBook.Add(phone);
}
}
}
private void nameList_SelectedIndexChanged(object sender, EventArgs e)
{
string name = nameList.Text;
foreach (PhoneData data in phoneBook)
{
if (data.Name == name)
{
phoneNumber.Text = data.PhoneNumber;
break;
}
}
}
Commit:「ファイル読み込みと検索処理追加」→ Push
⑤ 完成・動作確認
Bさんが Pull して、アプリを実行。名前をクリックすると電話番号が表示されれば完成です。
Gitの役割
Gitは 変更履歴を管理するツール です。
例えば
- 誰が変更したか
- いつ変更したか
- 前の状態に戻す
などができます。
また 複数人で同じプロジェクトを編集する ことも可能になります。
2人開発の役割分担

WinFormsの場合、役割分担が重要です。
WinForms の Designer 生成コードは競合解消が難しいため、Git入門では同じフォームのデザイナー上の編集担当を1人に限定するのが安全です。この実習では Bさんが画面配置とイベントの接続を担当し、Aさんは Bさんの変更を Pull した後で Form1.cs に処理を書きます。
そのため次のように分けます。
Aさん(ロジック担当)
担当
- クラス作成
- List管理
- 検索処理
- ファイル読み込み
例
class PhoneData
{
public string Name { get; set; } = "";
public string PhoneNumber { get; set; } = "";
}
Bさん(画面担当)
担当
- ListBox
- TextBox または Label
- 選択変更イベントの作成と接続
- 画面レイアウト
Gitでの作業の流れ

基本の順番は Pull → 作業 → Commit → Push です。GitHub Desktop では「Fetch origin」で確認し、変更があれば「Pull origin」で取り込みます。
作業前:Pull — 他の人の変更を取得します。
作業後:Commit → Push — Commit で自分のPCに履歴を記録し、Push で GitHub に送って共有します。
Commitの書き方
Commitメッセージは簡潔に書きます。
例
- PhoneDataクラス追加
- 検索処理追加
- ListBox表示処理追加
小さくCommitする
1つの変更ごとにCommitするのが基本です。
悪い例:全部作った
良い例
- PhoneDataクラス追加
- ファイル読み込み処理追加
- 検索処理追加
チーム開発で起きやすい問題
初めてのチーム開発では、次の問題がよく起きます。
Pull忘れ
Pullをせずに作業すると 古いコードを編集してしまう ことがあります。
そのため 作業前はPull を習慣にします。
同じファイル編集
2人が同じファイルの同じ箇所などを別々に変更し、Git が自動で統合できない場合に競合(コンフリクト)が起きます。同じファイルを編集しただけで必ず競合するわけではありません。
対策
- 担当を分ける
- 同時編集しない
Designer生成コードの競合
WinFormsでは Form1.Designer.cs が自動生成されます。
同じフォームの配置やイベントの接続を別々に変更すると、この生成コードに競合が起きることがあります。手書きの処理より変更の対応関係を読み取りにくく、初心者には競合解消が難しい部分です。
そのため、この Git入門では同じフォームのデザイナー操作は Bさん1人に限定します。Aさんは Form1.Designer.cs を直接編集せず、順番を守って Form1.cs の処理を追加します。
チーム開発の価値
チーム開発を経験すると、次のことが分かります。
- 他人のコードを読む力
- 役割分担
- コード統合
- バージョン管理
これは 実際の開発現場で必須のスキル です。
授業でよく伝えること
チーム開発の授業では、次のことを伝えています。
今日の目的はプログラムを作ることではありません
チームで開発する体験をすることです
完成度よりも
- 役割分担
- コミュニケーション
- Git操作
の体験が重要です。
まとめ
WinFormsのチーム開発では、次の3つを意識します。
- 役割分担
- Gitで履歴管理
- 統合
この経験は 一人で作る学習とは違う視点 を与えてくれます。
そして多くの学習者が 「プログラムはチームで作るもの」 ということを実感します。
発展編:4人でブランチ・Pull Request・レビューまで体験するなら、「4人で作るPR・レビュー付きチーム開発」をご覧ください。









ディスカッション
コメント一覧
まだ、コメントがありません