php 如何实现 git diff

Posted 李照耀

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php 如何实现 git diff相关的知识,希望对你有一定的参考价值。

无意间想到这个问题,如何用php来实现git diff,如果实现了这个功能,岂不是能够使用php对在线编辑文件的功能做更进一步的优化和提升?

查了一下还真有这样的库,话不多说,开始执行

composer require --dev sebastian/diff

得到结果

Info from https://repo.packagist.org: #StandWithUkraine
Using version ^5.0 for sebastian/diff
./composer.json has been created
Running composer update sebastian/diff
Loading composer repositories with package information
Updating dependencies
Lock file operations: 1 install, 0 updates, 0 removals
  - Locking sebastian/diff (5.0.1)
Writing lock file
Installing dependencies from lock file (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Downloading sebastian/diff (5.0.1)
  - Installing sebastian/diff (5.0.1): Extracting archive
Generating autoload files
1 package you are using is looking for funding.
Use the `composer fund` command to find out more!

好,安装成功,创建index.php如下

<?php
include("./vendor/autoload.php");

use SebastianBergmann\\Diff\\Differ;
use SebastianBergmann\\Diff\\Output\\UnifiedDiffOutputBuilder;

$builder = new UnifiedDiffOutputBuilder(
    "--- Original\\n+++ New\\n", // custom header
    true                      // do not add line numbers to the diff 
);

$differ = new Differ($builder);
$before_string = ("functions.php");
$after_string = ("functions.php-new");
$diff_value = $differ->diff($before_string, $after_string);
echo $diff_value;

好,然后创建两个文件用来代表我们修改过文件的内容,修改之前的文件叫 functions.php 内容是

<?php


function get_rand_id ($id = 0) 
    static $id;
    if ($id) 
        return $id;
    
    $id = (1, 1000);
    $id += 1000;
    return $id;

修改之后的文件叫 functions.php-new 内容是

<?php


function get_random_id (int $id = 0) 
    static $id;
    if (!$id) 
        $id = (1, 1000);
        $id = $id * $id;
    
    return $id;

执行一下看看

php index.php &> diff.patch

得到结果

--- Original
+++ New
@@ -1,12 +1,11 @@
 <?php
 
 
-function get_rand_id ($id = 0) 
+function get_random_id (int $id = 0) 
     static $id;
-    if ($id) 
-        return $id;
+    if (!$id) 
+        $id = rand(1, 1000);
+        $id = $id * $id;
     
-    $id = rand(1, 1000);
-    $id += 1000;
     return $id;
 

那这样的结果呢也能作为patch查看,要怎么有更好的查看方式呢?

我们可以在vscode编辑器里面安装一个叫做 Diff Viewer 的插件 点击这里

 

 

 安装完毕, 打开这个 diff.patch 文件后是这样的

 怎么样,是不是很不错,有点像 git 的感觉了,哈哈哈

 

如何使用 vimdiff 来 git diff /svn diff

#git 如何实现vimdiff
git config --global diff.tool vimdiff git config --global difftool.prompt false git config --global alias.d difftool

然后使用 git d 打开对比代码,然后用 :wq 继续比较下一个文件。

 

svn 如何实现vimdiff

vim ~/.subversion/config

diff-cmd = /usr/local/bin/svndiff

#!/bin/sh
#配置你喜欢的diff程序路径 svndiff
 DIFF="vimdiff"
#SVN diff命令会传入两个文件的参数 
 LEFT=${6}
 RIGHT=${7}
# 拼接成diff命令所需要的命令格式
 $DIFF $LEFT $RIGHT

 

以上是关于php 如何实现 git diff的主要内容,如果未能解决你的问题,请参考以下文章

如何提交两个分支的“git diff”?

想要从“git diff”中排除文件

如何让 diff 像 git-diff 一样工作?

如何从 git diff 读取输出?

如何从 git diff 读取输出?

执行“git diff”时如何获得并排差异?