.node__content ol {
list-style-type: auto;
}
.hljs-ln-n {
display: none;
}
.page-node-type-blog-post p {
color: #60696d;
font-size: initial;
line-height: 1.6em;
margin: auto;
}
■概要
Composerを利用してパッケージを管理しているプロジェクトで、チームメンバが別々のブランチでがパッケージを追加・削除・更新した時、それらのブランチをマージしようとすると高い確率で競合が起きます。
この時、差分ファイルを直接編集して両方のブランチの変更をいっぺんに取り込もうとすると、取り返しのつかない問題が起きることがあります。
*そもそもcomposer.lockファイルを手作業でマージするは困難です。
この記事では下記の参考文献に基づいて、上記のような競合を解消する手順を簡潔に紹介します。
>参考文献
■環境情報
- OS:MacOS 12.5.1
- PHP:7.4.30
- Composer:2.3.10
- Git:2.36.1
■問題設定
ブランチ | 変更点 |
---|---|
A | パッケージAを追加、パッケージBを削除 |
B | パッケージCを追加 |
■手順
- マージしたいブランチの変更点を確認する。
- 変更が多い方のブランチを採用し、競合を解決状態にする。
- 今回はブランチAの内容を採用して、ブランチBはここでは無視する。
- 対象ファイルはcomposer.json、composer.lock、vendorディレクトリ
- *vendorディレクトリはGitで管理されている場合のみ。
ブランチBの変更を手作業で再度実施する。
composer require パッケージC
composer.json、composer.lockに不備がないか以下のコマンドで確認します。
--dry-ran
はinstallコマンドを実行した結果を表示するオプションです、実際にinstallはされません。
composer validate composer install --dry-ran
■【付録】実際に上記の手順を検証する
>準備
以下のようなプロジェクトを用意します。
- 用意の手順は割愛します。
- *
rmccue/requests
というパッケージは、上記手順のパッケージBに相当します。
tree -L 1 -a
. ├── .git ├── composer.json ├── composer.lock └── vendor
cat composer.json
{ "name": "vendor_name/conflict_test", "type": "project", "require": { "rmccue/requests": "^2.0" } }
git log --name-status
commit d268e79b22d2f2a58dc6af43a1b3adc8f5d9986b (HEAD -> master) Author: *著者は消しています。 Date: Wed Jan 25 11:30:16 2023 +0900 Initial commit. A composer.json A composer.lock A vendor/autoload.php A vendor/composer/ClassLoader.php A vendor/composer/InstalledVersions.php A vendor/composer/LICENSE A vendor/composer/autoload_classmap.php A vendor/composer/autoload_files.php A vendor/composer/autoload_namespaces.php A vendor/composer/autoload_psr4.php A vendor/composer/autoload_real.php A vendor/composer/autoload_static.php A vendor/composer/installed.json A vendor/composer/installed.php A vendor/composer/platform_check.php A vendor/rmccue/requests/.editorconfig A vendor/rmccue/requests/CHANGELOG.md
>検証開始!
ブランチAを作成してswitchします。
git checkout -b branchA
パッケージA(
kriswallsmith/assetic
)を追加します。composer require kriswallsmith/assetic
パッケージB(
rmccue/requests
)を削除します。composer remove rmccue/requests
差分をすべてステージングしてコミットします。
git add . git commit -m "パッケージAを追加してパッケージBを削除."
masterブランチに切り替えて、ブランチBを作成・switchします。
git switch master git checkout -b branchB
パッケージC(
briannesbitt/Carbon
)を追加します。composer require nesbot/carbon
差分をすべてステージングしてコミットします。
git add . git commit -m "パッケージCを追加."
git log
で状況を確認します。git log --all --graph * commit 533bad32fd88ce0b456996b13c79d0555ed61775 (HEAD -> branchB) | Author: ipride-komai <ipride-tako@macbook.local> | Date: Wed Jan 25 11:56:53 2023 +0900 | | パッケージCを追加. | | * commit d2b5c567e290a8f6466a269db66e964eb79b6376 (branchA) |/ Author: ipride-komai <ipride-tako@macbook.local> | Date: Wed Jan 25 11:51:17 2023 +0900 | | パッケージAを追加して、パッケージBを削除. | * commit d268e79b22d2f2a58dc6af43a1b3adc8f5d9986b (master)
ブランチAとブランチCをマージします。
git switch branchA git marge branchB
- 競合が起きました!
Auto-merging composer.json CONFLICT (content): Merge conflict in composer.json Auto-merging composer.lock CONFLICT (content): Merge conflict in composer.lock Auto-merging vendor/composer/autoload_classmap.php CONFLICT (content): Merge conflict in vendor/composer/autoload_classmap.php Auto-merging vendor/composer/autoload_files.php CONFLICT (content): Merge conflict in vendor/composer/autoload_files.php Auto-merging vendor/composer/autoload_psr4.php CONFLICT (content): Merge conflict in vendor/composer/autoload_psr4.php Auto-merging vendor/composer/autoload_static.php CONFLICT (content): Merge conflict in vendor/composer/autoload_static.php Auto-merging vendor/composer/installed.json CONFLICT (content): Merge conflict in vendor/composer/installed.json Auto-merging vendor/composer/installed.php CONFLICT (content): Merge conflict in vendor/composer/installed.php Auto-merging vendor/composer/platform_check.php CONFLICT (content): Merge conflict in vendor/composer/platform_check.php Automatic merge failed; fix conflicts and then commit the result.
変更が多いブランチAの変更を採用して競合を解決します。
git checkout --ours composer.json composer.lock vendor/ git add composer.json composer.lock vendor/
ブランチBの操作を実施します。
composer require nesbot/carbon
composer.json、composer.lockに不備がないか確認します。
composer validate
- *今回作成した、
composer.json
ファイルにdescription
とlicense
の記載がないためエラーが出ますが、本稿とは関係ないので無視します。
./composer.json is valid for simple usage with Composer but has strict errors that make it unable to be published as a package See https://getcomposer.org/doc/04-schema.md for details on the schema # Publish errors - description : The property description is required # General warnings - No license specified, it is recommended to do so. For closed-source software you may use "proprietary" as license.
composer install --dry-run
- 以下のメッセージが出力されました。
composer.lock
ファイルに問題はないことがわかります。
Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Nothing to install, update or remove 7 packages you are using are looking for funding. Use the `composer fund` command to find out more!
- *今回作成した、
差分をすべてステージングしてコミットし、マージ作業を終了します。
- マージメッセージはいじらずそのままコミットします。
git add . git commit
完了!
>最終結果
git log
commit 4b1a0eef65ac9fec3c311078be605e069613a567 (HEAD -> branchA)
Merge: d2b5c56 533bad3
Author: 著者
Date: Wed Jan 25 12:11:51 2023 +0900
Merge branch 'branchB' into branchA
commit 533bad32fd88ce0b456996b13c79d0555ed61775 (branchB)
Author: 著者
Date: Wed Jan 25 11:56:53 2023 +0900
パッケージCを追加.
commit d2b5c567e290a8f6466a269db66e964eb79b6376
Author: 著者
Date: Wed Jan 25 11:51:17 2023 +0900
パッケージAを追加して、パッケージBを削除.
commit d268e79b22d2f2a58dc6af43a1b3adc8f5d9986b (master)
cat composer.json
{
"name": "vendor_name/conflict_test",
"type": "project",
"require": {
"kriswallsmith/assetic": "^1.4",
"nesbot/carbon": "^2.65"
}
}
- 閲覧数 1465
コメントを追加