戦国IT - 情報処理技術者試験の過去問対策サイト
お知らせお問い合わせ料金プラン

応用情報技術者 2023年 春期 午後08


バージョン管理ツールの運用に関する次の記述を読んで、設問に答えよ。

 A社は、業務システムの開発を行う企業で、システムの新規開発のほか、リリース後のシステムの運用保守や機能追加の案件も請け負っている。A社では、ソースコードの管理のために、バージョン管理ツールを利用している。  バージョン管理ツールには、1人の開発者がファイルの編集を開始するときにロックを獲得し、他者による編集を禁止する方式(以下、ロック方式という)と、編集は複数の開発者が任意のタイミングで行い、編集終了後に他者による編集内容をマージする方式(以下、コピー・マージ方式という)がある。また、バージョン管理ツールには、ある時点以降のソースコードの変更内容の履歴を分岐させて管理する機能がある。以降、分岐元、及び分岐して管理された、変更内容の履歴をブランチと呼ぶ。  ロック方式では、編集開始時にロックを獲得し、他者による編集を禁止する。編集終了時には変更内容をリポジトリに反映し、ロックを解除する。ロック方式では、一つのファイルを同時に1人しか編集できないので、複数の開発者で開発する際に変更箇所の競合が発生しない一方、①開発者間で作業の待ちが発生してしまう場合がある。  A社では、規模の大きな改修を複数人で取り組むことも多いので、コピー・マージ方式のバージョン管理ツールを採用している。A社で採用しているバージョン管理ツールでは、開発者は、社内に設置されているバージョン管理ツールのサーバ(以下、サーバという)のリポジトリの複製を、開発者のPC上のローカル環境のリポジトリとして取り込んで開発作業を行う。編集時にソースコードに施した変更内容は、ローカル環境のリポジトリに反映される。ローカル環境のリポジトリに反映された変更内容は、編集完了時にサーバのリポジトリに反映させる。サーバのリポジトリに反映された変更内容を、別の開発者が自分のローカル環境のリポジトリに取り込むことで、変更内容の開発者間での共有が可能となる。  コピー・マージ方式では、開発者間で作業の待ちが発生することはないが、他者の変更箇所に同一箇所に変更を加えた場合には競合が発生する。その場合には、ソースコードの変更内容をサーバのリポジトリに反映させる際に、競合を解決する必要がある。競合の解決とは、同一箇所が変更されたソースコードについて、それぞれの変更内容を確認し、必要に応じてソースコードを修正することである。  A社で使うバージョン管理ツールの主な機能を表1に示す。
応用情報技術者試験(令和5年度 午後 問08 表01)
〔ブランチ運用ルール〕  開発案件を担当するプロジェクトマネージャのM氏は、ブランチの運用ルールを決めてバージョン管理を行っている。取り扱うブランチの種類を表2に、ブランチの運用ルールを図1に、ブランチの樹形図を図2に示す。
応用情報技術者試験(令和5年度 午後 問08 表02)
応用情報技術者試験(令和5年度 午後 問08 図01)
応用情報技術者試験(令和5年度 午後 問08 図02)
〔開発案件と開発の流れ〕  A社が請け負ったある開発案件では、A、B、C の三つの機能を既存のリリース済のシステムに追加することになった。  A, B, C の三つの追加機能の開発を開始するに当たり、開発者2名がアサインされた。機能 A と C は I 氏が、機能 B は K 氏が開発を担当する。開発の流れを図3に示す。
応用情報技術者試験(令和5年度 午後 問08 図03)
 I 氏は、機能 A の開発のために、ローカル環境で a ブランチから feature-A ブランチを作成し開発を開始した。I 氏は、機能 A について (ア)、(ウ)、(オ) の 3 回のコミットを行ったところで、(ウ) でコミットした変更内容では問題があることに気が付いた。そこで I 氏は、(α) のタイミングで、②(ア)のコミットの直後の状態に滞りなく戻すための作業を行い、編集をやり直すことにした。プログラムに必要な修正を加えたで c した後、③テストを実施し、問題がないことを確認した。その後、レビューを実施し、a ブランチにマージした。  機能 B は機能 A と同時に開発を開始したが、規模が大きく、開発の完了は機能 A、C の開発完了後になった。K 氏は、機能 B についてのテストとレビューの後、ローカル環境上の a ブランチにマージし、サーバのリポジトリにプッシュしようとしたところ、競合が発生した。サーバのリポジトリから a ブランチをプルし、其の内容を確認して競合を解決した。その後、ローカル環境上の a ブランチを、サーバのリポジトリにプッシュしてからテストを実施し、問題がないことを確認した。  全ての変更内容を develop ブランチに反映後、release ブランチを develop ブランチから作成して④テストを実施した。テストで検出された不具合を修正し、release ブランチにコミットした後、再度テストを実施し、問題がないことを確認した。修正内容を a ブランチと b ブランチにマージし、b ブランチの内容でシステムの運用環境を更新した。   〔運用ルールについての考察〕  feature-B ブランチのように、ブランチ作成からマージまでが長いと、サーバのリポジトリ上の develop ブランチとの差が広がり、競合が発生しやすくなる。そこで、レビュー完了後のマージで競合が発生しにくくするために、随時、サーバのリポジトリから develop ブランチをプルした上で、⑤ある操作を行うことを運用ルールに追加した。

設問1

本文中の下線①について、他の開発者による何の操作を待つ必要が発生するのか。10字以内で答えよ。

模範解答

ロックの解除

解説

解答の論理構成

  1. 問題文はロック方式の説明として
    「ロック方式では、編集開始時にロックを獲得し、他者による編集を禁止する。編集終了時には変更内容をリポジトリに反映し、ロックを解除する。」
    と記述しています。
  2. 同じ段落の最後で
    「ロック方式では、一つのファイルを同時に1人しか編集できないので、複数の開発者で開発する際に変更箇所の競合が発生しない一方、①開発者間で作業の待ちが発生してしまう場合がある。」
    と下線①に言及しています。
  3. 待ちが発生する直接の原因は、先にロックを「獲得」している開発者がまだ作業を終えていないため、他の開発者はそのファイルを編集できないことです。
  4. 編集を再開できるタイミングは、先行開発者が「ロックを解除」した瞬間であるため、待つ対象は「ロックの解除」に帰着します。
  5. 以上より、下線①で問われている「他の開発者による何の操作を待つか」の答えは「ロックの解除」となります。

誤りやすいポイント

  • 「コミット」や「プッシュ」を待つと考えがちですが、ロック方式では編集禁止を解除する操作こそが根本原因であり、コミットは必ずしも必須ではありません。
  • コピー・マージ方式と混同し、「マージ待ち」と誤答するケースがあります。
  • 「ロック解除」を単に「解除」や「ロックを外す」などと書き換えてしまうと、原文の固有表現を守れていない点で減点対象になる恐れがあります。

FAQ

Q: ロック方式はどのような場面で有効ですか?
A: バイナリファイルなど、内容の自動マージが難しいファイルを複数人で扱う場合に、安全に競合を回避できます。
Q: コピー・マージ方式でも待ちが発生しますか?
A: 原則発生しませんが、同一箇所を編集すると競合が起こり、マージ時に手動解決が必要になります。
Q: ブランチを細かく分けるメリットは何ですか?
A: 機能単位で履歴を独立させられるため、レビューやテストの範囲を限定でき、リリース時のリスクを抑制できます。

関連キーワード: バージョン管理, ロック方式, 競合解決, ブランチ, マージ

設問2

図1及び本文中のacに入れる適切な字句を答えよ。

模範解答

a:develop b:main c:コミット

解説

解答の論理構成

  1. a に入る語
    • 本文に「レビューを実施し、a ブランチにマージした。」とあります。図1の運用ルールでも「feature ブランチで機能の開発が終了したら … develop ブランチにマージ」と記載されています。従って feature からマージ先となるのは「develop」です。
    • さらに「修正内容を a ブランチと b ブランチにマージし」と二つ並列で書かれ、release からのマージ先が develop と main の2本であることも運用ルールと一致します。
      a =「develop」
  2. b に入る語
    • 上述の通り release ブランチからは「main ブランチ」にもマージします。表2には「main ブランチはシステムの運用環境にリリースする際に用いる」と明記されており、本文にも「b ブランチの内容でシステムの運用環境を更新した。」とあるため運用環境用ブランチは「main」です。
      b =「main」
  3. c に入る語
    • 本文には「プログラムに必要な修正を加えたで c した後、③テストを実施」とあります。修正を反映する最初の操作はローカルリポジトリへの反映=「コミット」です。
    • 表1でも「コミット:ソースコードの変更内容を、ローカル環境のリポジトリに反映させる。」と定義されています。
      c =「コミット」

誤りやすいポイント

  • feature ブランチのマージ先を「main」と勘違いする
    本文では release ブランチ経由で初めて「main」にマージするため、直接 main にマージする運用は行わない点に注意が必要です。
  • 「プッシュ」と「コミット」の混同
    修正直後に行うのはローカル反映の「コミット」であり、サーバ反映の「プッシュ」は運用上自動で併せて行うだけです。設問 c はローカル操作を問うています。
  • main と develop の役割取り違え
    main は運用環境用、develop は開発集約用であるという表2の記述を正確に読み取ることが重要です。

FAQ

Q: なぜ feature ブランチから直接 main にマージしないのですか?
A: 表2に「develop ブランチが開発の主軸」とある通り、機能統合は全て develop で行い、一括テスト後に release→main へ流すことで運用環境の品質を保証するためです。
Q: 「コミット」と「リバート」を混同しそうです。リバートは今回不要ですか?
A: はい。I 氏は(ア)の状態に戻す際、打ち消し用の「リバート」を使う可能性はありますが、設問 c が求めるのは戻した後の通常操作=「コミット」です。
Q: develop と main の差分が大きくなるのを防ぐには?
A: 本文最後の考察にある通り、随時 develop をプルし、さらに「マージ」を行って取り込むことで競合を早期に解決できます。

関連キーワード: ブランチ, マージ, コミット, プッシュ, 競合解決

設問3

本文中の下線②で行った作業の内容について、表1中のコマンド名と図3中の字句を用いて40字以内で具体的に答えよ。

模範解答

(オ)のコミットをリバートし、次に(ウ)のコミットをリバートする。

解説

解答の論理構成

  1. 原因把握
    問題文には「(ウ)でコミットした変更内容では問題があることに気が付いた。そこで I 氏は、(α) のタイミングで、②(ア)のコミットの直後の状態に滞りなく戻すための作業を行い」とあります。つまり (ア) 以降の変更を打ち消す必要があります。
  2. 方法の選定
    表1の「リバート」には「指定したコミットで対象となった変更内容を打ち消す変更内容を生成し、ローカル環境のリポジトリにコミットして反映させる。」と定義されています。リバートは履歴を残したまま変更を元に戻す操作であり、本件の“滞りなく”に合致します。
  3. 対象コミットの特定
    図3より、(ア)→(ウ)→(オ) の順にコミットし問題箇所は (ウ) と (オ) に含まれます。したがって両方を打ち消せば (ア) 直後の状態に戻ります。
  4. 実行順序
    リバートは“最新コミットから順に”行うのがセオリーです。先に (オ) をリバートし、次に (ウ) をリバートすれば整合性の取れた履歴が得られます。
  5. 結論
    よって解答は「(オ)のコミットをリバートし、次に(ウ)のコミットをリバートする。」となります。

誤りやすいポイント

  • 「リセット」や「強制プッシュ」を選ぶと履歴が改変され、共同開発に支障が出るため不適切です。
  • リバートの順序を逆にすると (ウ) の内容が再出現し、完全には戻れません。
  • ②の指示は“ローカル”操作です。サーバへプッシュするのはリバート後である点を取り違えないよう注意が必要です。

FAQ

Q: リバートとリセットの違いは何ですか?
A: リバートは「打ち消すコミットを追加」して履歴を保ちます。リセットは履歴自体を巻き戻し、共同開発中に使うと他者との整合が崩れやすくなります。
Q: なぜ (オ) → (ウ) の順でリバートするのですか?
A: 最新コミットから順に取り消すことで依存関係が壊れず、衝突なく履歴を生成できるためです。
Q: リバート後に再度テストは必要ですか?
A: はい。問題文でも「テストを実施し、問題がないことを確認」と指示があり、戻し漏れや新たな不具合がないか確認することが必須です。

関連キーワード: リバート, コミット, 競合解決, マージ, ブランチ戦略

設問4

本文中の下線③、④について、実施するテストの種類を、それぞれ解答群から選び記号で答えよ。
解答群  ア:開発機能と関連する別の機能とのインタフェースを確認する結合テスト  イ:開発機能の範囲に関する、ユーザーによる受け入れテスト  ウ:プログラムの変更箇所が意図どおりに動作するかを確認する単体テスト  エ:変更箇所以外も含めたシステム全体のリグレッションテスト

模範解答

下線③:ウ 下線④:エ

解説

解答の論理構成

  1. ③のテストはどの段階で行われたか
    ─ 原文では「I 氏は、…c した後、③テストを実施し、問題がないことを確認した。」とあります。
    ─ 直前の作業は「(α) のタイミングで、②(ア)のコミットの直後の状態に滞りなく戻すための作業」を行い、機能Aの“変更箇所”だけを修正したフェーズです。
    ─ まだ feature-A ブランチ内であり、他機能や他ブランチとの結合は行っていません。
    ─ よって確認対象は「プログラムの変更箇所が意図どおりに動作するか」。解答群の「ウ:プログラムの変更箇所が意図どおりに動作するかを確認する単体テスト」が一致します。
  2. ④のテストはどの段階で行われたか
    ─ 原文では「release ブランチを develop ブランチから作成して④テストを実施した。テストで検出された不具合を修正し…b ブランチの内容でシステムの運用環境を更新した。」とあります。
    ─ release ブランチは「全ての変更内容を develop ブランチに反映後」に作成される運用直前のブランチで、最終品質確認が目的です。
    ─ 不具合修正後に「再度テストを実施」してから main へマージしリリースしているため、変更箇所だけでなく「システム全体」が対象となります。
    ─ 解答群では「エ:変更箇所以外も含めたシステム全体のリグレッションテスト」が該当します。
  3. 以上より
    ③=ウ(単体テスト)、④=エ(リグレッションテスト)となります。

誤りやすいポイント

  • 「release ブランチだから受け入れテスト」と早合点する
    → 原文は“ユーザー”の参加を示しておらず、リリース担当者による総合検証を示唆しています。
  • ③を結合テストと勘違いする
    → feature ブランチ内で他機能とのインタフェース確認はまだ行われていないため単体レベルです。
  • 「リグレッションテスト=変更前後比較だけ」と思い込む
    → ここではシステム全体へ波及した影響を確かめる目的で行う回帰試験です。

FAQ

Q: 単体テストと結合テストの境目はどこで判断すれば良いですか?
A: 原文の作業範囲を確認しましょう。ブランチが個別機能用(feature ブランチ)で、他機能とまだマージしていなければ単体テストと見るのが自然です。
Q: release ブランチでのテストは必ずリグレッションテストになるのですか?
A: 本問の運用ルールでは、全機能を統合した後に release ブランチで最終検証を行うためリグレッションテストが適切ですが、プロジェクトによっては受け入れテストや運用テストを合わせて行うケースもあります。
Q: リグレッションテストとシステムテストの違いは?
A: システムテストは機能・性能など要求仕様全体を検証する工程、リグレッションテストは変更による影響がないかを確認する回帰試験です。release ブランチで行う最終確認は両者を兼ねることがありますが、本問では“変更箇所以外も含めた”という文言がリグレッションテストを強調しています。

関連キーワード: 単体テスト, リグレッションテスト, ブランチ運用, バージョン管理, 回帰試験

設問5

本文中の下線⑤について、追加した運用ルールで行う操作は何か。表2の種類を用いて、40字以内で答えよ。

模範解答

developブランチの内容をfeatureブランチにマージする。

解説

解答の論理構成

  1. 【問題文】では、長期間マージされない feature ブランチが原因で「サーバのリポジトリ上の develop ブランチとの差が広がり、競合が発生しやすくなる」ことを指摘しています。
  2. これを避けるために「サーバのリポジトリから develop ブランチをプルした上で、⑤ある操作を行う」運用ルールを追加すると記載されています。
  3. 競合を早期に発見するには、最新の develop ブランチを feature ブランチ側に取り込む 必要があります。
  4. 表1の「マージ」は「あるブランチでの変更内容を、他のブランチに併合する」と説明されており、この操作が該当します。
  5. したがって、⑤で行う操作は「develop ブランチの内容を feature ブランチにマージする」と導けます。

誤りやすいポイント

  • 「プルしたら自動的に競合が解消される」と思い込み、feature 側へのマージを忘れる。
  • rebase と混同し「履歴を書き換える操作」だと勘違いする。
  • マージ先・マージ元を逆にして develop に未完成コードを流し込んでしまう。
  • プル後に即プッシュしてしまい、サーバ側に不要なブランチを増やすミス。

FAQ

Q: プルとマージは何が違いますか?
A: プルは「サーバ → ローカル」への取得、マージは「ブランチA → ブランチB」への併合です。プルしてもブランチ間の差分は残るため、手動でマージが必要です。
Q: rebase では駄目なのですか?
A: rebase でも競合を早期検出できますが、履歴を書き換えるためチーム合意が必須です。本運用ルールは安全性の高いマージを採用しています。
Q: 競合が起きたらどのタイミングで解決すべきですか?
A: まずローカルで develop をプルし、feature にマージした直後に解決します。レビュー前に解決しておくとレビュワーの負担が減ります。

関連キーワード: ブランチ, マージ, プル, コンフリクト, リポジトリ
戦国ITクイズ機能

\ せっかくなら /

応用情報技術者
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてプライバシーポリシー利用規約特商法表記開発者について