텍스트 개정판을 작업할 때 동일한 원본 텍스트를 기반으로 여러 개정판이 있다는 문제에 직면하는 경우가 있습니다. 하나를 선택하고 다른 하나를 버리는 대신 두 개정판을 병합하려고 합니다.
Git은 이미 그 일을 훌륭하게 수행하고 있습니다. PHP 애플리케이션에서는 동일한 작업을 수행하는 간단한 도구가 필요합니다. xdiff_string_merge3 기능이 있는 xdiff PECL 확장이 있습니다. 그러나 xdiff_string_merge3
git과 동일한 방식으로 작동하지 않으며 시스템에서 xdiff를 사용하지 못할 수 있습니다.
PhpMerge는 이 문제를 해결하는 작은 라이브러리입니다. merge
메소드만 있는 PhpMergePhpMergeInterface
를 구현하는 PhpMergePhpMerge
및 PhpMergeGitMerge
두 가지 클래스가 있습니다.
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.
}
git 명령줄을 사용하여 병합을 수행합니다.
use PhpMerge GitMerge ;
$ merger = new GitMerge ();
// Use as the previous example.
PhpMerge는 Composer.json 파일에 종속성으로 라이브러리를 추가하여 Composer와 함께 설치할 수 있습니다.
{
"require" : {
"bircher/php-merge" : " ~4.0 "
}
}
GitMerge
와 함께 git 명령줄을 사용하려면 다음을 수행하세요.
{
"require" : {
"bircher/php-merge" : " ~4.0 " ,
"symplify/git-wrapper" : " ^9.1|^10.0 "
}
}
설치 및 사용 지침은 Composer 설명서를 참조하세요.
~4.0 버전에서는 cpliakas/git-wrapper
에서 symplify/git-wrapper
로 전환합니다. 이번 업데이트는 PhpMergePhpMerge
만 사용할 때 변경 사항이 없음을 의미합니다.