เมื่อทำงานกับการแก้ไขข้อความ บางครั้งอาจประสบปัญหาว่ามีการแก้ไขหลายครั้งโดยอิงจากข้อความต้นฉบับเดียวกัน แทนที่จะเลือกอย่างใดอย่างหนึ่งแล้วทิ้งอีกรายการหนึ่ง เราต้องการรวมการแก้ไขทั้งสองเข้าด้วยกัน
Git ทำสิ่งนั้นได้อย่างยอดเยี่ยมอยู่แล้ว ในแอปพลิเคชัน PHP เราต้องการเครื่องมือง่ายๆ ที่ทำเช่นเดียวกัน มีส่วนขยาย xdiff PECL ซึ่งมีฟังก์ชัน xdiff_string_merge3 แต่ xdiff_string_merge3
ไม่ทำงานในลักษณะเดียวกับ git และ xdiff อาจไม่พร้อมใช้งานในระบบของคุณ
PhpMerge เป็นไลบรารี่ขนาดเล็กที่ช่วยแก้ปัญหานี้ได้ มีสองคลาส: PhpMergePhpMerge
และ PhpMergeGitMerge
ที่ใช้ PhpMergePhpMergeInterface
ซึ่งมีเพียงวิธี merge
PhpMerge
ใช้ SebastianBergmannDiffDiffer
เพื่อรับความแตกต่างระหว่างเวอร์ชันต่างๆ และคำนวณข้อความที่ผสานจากนั้น GitMerge
ใช้ SymplifyGitWrapperGitWrapper
เขียนข้อความลงในไฟล์ชั่วคราว และใช้บรรทัดคำสั่ง git เพื่อรวมข้อความ
ตัวอย่างง่ายๆ:
use PhpMerge PhpMerge ;
// Create a merger instance.
$ merger = new PhpMerge ();
// Get the texts to merge.
$ original = <<<'EOD'
unchanged
replaced
unchanged
normal
unchanged
unchanged
removed
EOD;
$ version1 = <<<'EOD'
added
unchanged
replacement
unchanged
normal
unchanged
unchanged
EOD;
$ version2 = <<<'EOD'
unchanged
replaced
unchanged
normal??
unchanged
unchanged
EOD;
$ expected = <<<'EOD'
added
unchanged
replacement
unchanged
normal??
unchanged
unchanged
EOD;
$ result = $ merger -> merge ( $ original , $ version1 , $ version2 );
// $result === $expected;
ด้วยข้อขัดแย้งในการผสาน:
// Continuing from before with:
use Phpmerge MergeException ;
use PhpMerge MergeConflict ;
$ conflicting = <<<'EOD'
unchanged
replaced
unchanged
normal!!
unchanged
unchanged
EOD;
try {
$ merger -> merge ( $ original , $ version2 , $ conflicting );
} catch ( MergeException $ exception ) {
/** @var MergeConflict[] $conflicts */
$ conflicts = $ exception -> getConflicts ();
$ original_lines = $ conflicts [ 0 ]-> getBase ();
// $original_lines === ["normaln"];
$ version2_lines = $ conflicts [ 0 ]-> getRemote ();
// $version2_lines === ["normal??n"];
$ conflicting_lines = $ conflicts [ 0 ]-> getLocal ();
// $conflicting_lines === ["normal!!n"];
$ line_numer_of_conflict = $ conflicts [ 0 ]-> getBaseLine ();
// $line_numer_of_conflict === 3; // Count starts with 0.
// It is also possible to get the merged version using the first version
// to resolve conflicts.
$ merged = $ exception -> getMerged ();
// $merged === $version2;
// In this case, but in general there could be non-conflicting changes.
$ line_in_merged = $ conflicts [ 0 ]-> getMergedLine ();
// $line_in_merged === 3; // Count starts with 0.
}
การใช้คอมไพล์บรรทัดคำสั่งเพื่อดำเนินการผสาน:
use PhpMerge GitMerge ;
$ merger = new GitMerge ();
// Use as the previous example.
PhpMerge สามารถติดตั้งกับ Composer ได้โดยการเพิ่มไลบรารีเป็นการพึ่งพาไฟล์ composer.json ของคุณ
{
"require" : {
"bircher/php-merge" : " ~4.0 "
}
}
หากต้องการใช้บรรทัดคำสั่ง git กับ GitMerge
:
{
"require" : {
"bircher/php-merge" : " ~4.0 " ,
"symplify/git-wrapper" : " ^9.1|^10.0 "
}
}
โปรดดูเอกสารประกอบของผู้แต่งสำหรับคำแนะนำในการติดตั้งและการใช้งาน
ในเวอร์ชัน ~ 4.0 เราเปลี่ยนจาก cpliakas/git-wrapper
เป็น symplify/git-wrapper
เนื่องจากเวอร์ชันแรกเลิกใช้แล้ว การอัปเดตนี้หมายความว่าไม่มีการเปลี่ยนแปลงเมื่อใช้ PhpMergePhpMerge
เท่านั้น