当前位置: 首页 > article >正文

Git 冲突解决技巧与实践

引言

在当今的软件开发领域,团队协作开发已经成为主流模式。而 Git,作为一款分布式版本控制系统,凭借其强大的功能和便捷的操作,被广泛应用于各种项目中。它不仅能够有效地管理代码的版本,还能方便团队成员之间的协作。然而,在多人协作的过程中,Git 冲突是一个无法回避的问题。

想象一下,当多个团队成员同时对同一个文件进行修改,然后尝试将这些修改合并到一起时,冲突就可能会发生。这种冲突可能会导致代码无法正常合并,甚至会影响整个项目的进度。比如,在一个大型的 Web 开发项目中,前端开发人员和后端开发人员同时对一个配置文件进行了修改,前端人员为了适配新的页面样式修改了部分配置,而后端人员则为了优化接口性能对同一配置文件的另一部分进行了调整。当他们尝试将各自的修改合并到主分支时,Git 冲突就出现了。如果不能及时有效地解决这些冲突,就可能会导致项目无法按时上线,给团队带来巨大的损失。

所以,掌握 Git 冲突解决技巧对于每一位开发者来说都至关重要。它不仅能够提高我们的开发效率,减少因冲突导致的时间浪费,还能保证项目的顺利进行,提升团队的协作效率。在接下来的内容中,我将详细介绍 Git 冲突的常见场景、解决方法以及一些实践经验,希望能帮助大家更好地应对 Git 冲突。

一、Git 冲突的产生机制

(一)多人协作场景下的冲突根源

在多人协作开发中,当多个开发者同时对同一个文件的同一部分进行修改时,就极有可能产生 Git 冲突。比如在一个团队开发的电商项目中,开发者 A 负责商品展示页面的功能优化,开发者 B 负责该页面的样式调整 ,两人同时对productDisplay.js文件中的商品信息展示模块进行修改。开发者 A 为了提高数据加载速度,优化了数据请求逻辑;而开发者 B 为了适配新的设计稿,修改了同一模块的 DOM 结构。当他们尝试将各自的修改合并到主分支时,Git 就无法自动判断应该保留哪一个修改,从而引发冲突。

另外,不同分支修改同一文件也是常见的冲突场景。假设一个项目有master主分支和feature功能分支,在feature分支上开发新功能时,对config.js配置文件进行了修改以满足新功能的需求。而与此同时,master分支上也对config.js进行了一些稳定性相关的调整。当完成feature分支的开发,试图将其合并回master分支时,就可能因为两个分支对config.js的不同修改而产生冲突。

(二)深入理解 Git 的合并与变基

  1. 合并(Merge)
    • 原理:Git 的合并操作是将两个或多个分支的修改集成到一个新的提交中。在合并时,Git 会首先找到两个分支的共同祖先(Common Ancestor),这是一个基准点,用于确定要合并的变更。然后,Git 使用三方合并算法来将两个分支的修改合并到一个新的提交中。该算法比较共同祖先和要合并的两个分支之间的差异,然后尝试自动合并这些差异。如果两个分支对同一个文件的不同部分进行了修改,Git 通常能够自动合并这些修改;但如果两个分支对同一文件的同一部分进行了不兼容的修改,就会产生冲突,需要手动解决。
    • 冲突发生场景:比如在一个前后端分离的项目中,前端分支frontend和后端分支backend都对package.json文件进行了修改。前端分支为了安装新的 UI 库修改了依赖项,后端分支为了更新接口测试工具也修改了依赖项。当尝试将frontend分支合并到backend分支时,由于对package.json文件中依赖项部分的修改冲突,就会触发合并冲突。
  1. 变基(Rebase)
    • 原理:变基是将一系列提交按照原有次序依次应用到另一分支上,它的目的是使提交历史更加整洁、线性。变基的过程中,Git 会首先找到当前分支和目标基底分支的最近共同祖先,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,接着将当前分支指向目标基底,最后将之前另存为临时文件的修改依序应用到目标基底上。
    • 冲突发生场景:例如在一个开源项目的开发中,开发者基于develop分支创建了自己的feature分支进行功能开发。在开发过程中,develop分支不断有新的提交。当开发者想要将feature分支的修改合并回develop分支时,选择使用变基操作。但由于feature分支和develop分支都对某些文件进行了修改,在变基过程中,当应用feature分支的提交到develop分支时,就可能因为这些文件的修改冲突而导致变基失败,需要手动解决冲突后才能继续变基。

二、Git 冲突解决的基础流程

(一)识别冲突信号

当执行git merge(合并)或git rebase(变基)操作时,如果存在冲突,Git 会在命令行中给出明确的提示。例如,当执行git merge feature命令尝试将feature分支合并到当前分支时,如果发生冲突,你会看到类似以下的输出:

 

Auto-merging file.txt

CONFLICT (content): Merge conflict in file.txt

Automatic merge failed; fix conflicts and then commit the result.

这表明在合并过程中,file.txt文件出现了冲突,Git 无法自动完成合并,需要手动解决冲突后才能继续。

(二)查看冲突文件

一旦识别到冲突,接下来就需要查看哪些文件发生了冲突。使用git status命令可以查看冲突文件的列表,它会显示所有处于未合并状态的文件。例如:

 

$ git status

On branch master

You have unmerged paths.

(fix conflicts and run "git commit")

Unmerged paths:

(use "git add <file>..." to mark resolution)

both modified: file.txt

no changes added to commit (use "git add" and/or "git commit -a")

从输出中可以看到,file.txt文件被标记为both modified,表示该文件在当前分支和要合并的分支中都被修改,从而导致了冲突。

当打开冲突文件时,会看到一些特殊的冲突标记,这些标记用于区分不同分支的修改内容。以常见的标记形式为例:

 

<<<<<<< HEAD

// 当前分支的代码内容

=======

// 要合并分支的代码内容

>>>>>>> feature

其中,<<<<<<< HEAD表示当前分支(HEAD 指向的分支)修改内容的开始;=======是分隔线,用于区分两个分支的修改;>>>>>>> feature表示要合并的feature分支修改内容的结束,这里的feature是分支名称,具体会根据实际情况而变化 。通过这些标记,我们可以清晰地看到两个分支对同一文件的不同修改部分,从而有针对性地进行冲突解决。

(三)手动解决冲突

手动解决冲突的核心就是打开冲突文件,根据实际需求编辑代码,选择保留正确的代码部分。这可能涉及合并双方的修改,或者只保留一方的修改。

例如,假设冲突文件example.js中的冲突部分如下:

 

<<<<<<< HEAD

function calculateSum(a, b) {

return a + b;

}

=======

function calculateSum(a, b) {

return a * b;

}

>>>>>>> feature

这里HEAD分支中calculateSum函数的功能是计算两个数的和,而feature分支中该函数的功能是计算两个数的乘积。如果经过分析,你认为应该保留加法功能,那么可以将冲突部分修改为:

 

function calculateSum(a, b) {

return a + b;

}

如果需要同时保留两种功能,可以将代码修改为:

 

function calculateSum(a, b, operation) {

if (operation ==='sum') {

return a + b;

} else if (operation === 'product') {

return a * b;

}

}

修改完成后,保存文件,此时冲突标记<<<<<<< HEAD、=======、>>>>>>> feature都应该被删除,文件内容变为正确的、合并后的代码。

(四)标记冲突已解决

当手动解决完冲突文件中的冲突后,需要告诉 Git 该文件的冲突已解决。使用git add命令将解决后的文件添加到暂存区,这就相当于告诉 Git 该文件已经处理好,可以继续后续的合并或变基操作。例如:

 

$ git add example.js

执行该命令后,example.js文件就会被标记为已解决冲突,不再显示在git status命令输出的未合并文件列表中。

(五)完成合并或变基

  1. 合并(Merge):当所有冲突文件都被解决并添加到暂存区后,执行git commit命令来完成合并操作。执行git commit后,Git 会打开默认的文本编辑器(通常是 Vim 或其他配置的编辑器),让你输入合并提交的消息。输入合适的提交消息,如 “Merge branch 'feature' into master - resolve conflicts”,然后保存并关闭编辑器,合并操作就完成了。此时,合并后的代码会包含两个分支的修改内容,并且在提交历史中会生成一个新的合并提交。
  1. 变基(Rebase):如果是在变基过程中解决了冲突,那么在将解决冲突后的文件添加到暂存区后,执行git rebase --continue命令继续变基操作。如果在后续的变基过程中还有其他冲突,会重复上述识别冲突、查看冲突文件、手动解决冲突、标记冲突已解决的步骤,直到所有冲突都解决并且变基完成。如果在变基过程中想要放弃变基操作,可以执行git rebase --abort命令,它会将仓库状态恢复到变基之前的状态。

三、基于工具的 Git 冲突解决技巧

(一)图形化工具的优势

在解决 Git 冲突时,图形化工具相较于传统的命令行方式具有显著的优势。命令行操作虽然强大且灵活,但对于一些开发者,尤其是初学者来说,理解和操作的门槛较高。例如,在命令行中解决冲突,需要牢记一系列复杂的命令,如git status查看冲突状态、git diff查看冲突详情、git add和git commit标记并提交冲突解决结果等 ,操作过程较为繁琐,容易出错。

而图形化工具则提供了直观的可视化界面,让开发者能够更轻松地理解和处理冲突。以常见的图形化工具界面为例,它会以直观的方式展示冲突文件的不同版本,通过不同的颜色或标识来区分当前分支和要合并分支的代码差异,使开发者一眼就能看出冲突所在。比如,在一个 Java 项目中,使用图形化工具解决冲突时,冲突的代码部分会被清晰地标记出来,开发者可以直接在界面上进行选择、合并等操作,无需记忆复杂的命令,大大提高了解决冲突的效率和准确性。

(二)常见图形化工具介绍

  1. GitKraken:这是一款功能强大的跨平台 Git 客户端,它提供了直观的用户界面,使开发者能够轻松地可视化和管理 Git 仓库。在解决冲突方面,GitKraken 的合并工具非常出色,它能以图形化的方式展示冲突的代码块,开发者可以通过简单的勾选操作来选择保留哪个版本的代码,或者手动编辑合并代码,操作简单便捷。同时,它还支持可视化的提交历史查看、分支管理等功能,让开发者对项目的版本历史和分支情况一目了然。
  1. SourceTree:是一款免费的 Git 和 Hg 客户端管理工具,适用于 Windows 和 Mac OS X 系统。它拥有简洁美观的界面,简化了开发者与 Git 仓库的交互方式。在处理冲突时,SourceTree 提供了清晰的冲突文件标记和合并界面,开发者可以方便地查看冲突的具体内容,并进行相应的处理。此外,它还支持创建、克隆、提交、推送、拉取和合并等常见的 Git 操作,并且内置了对 GitHub、BitBucket 和 Stash 等远程仓库的支持,方便开发者管理远程项目。
  1. Beyond Compare:虽然它并非专门的 Git 客户端,但它强大的文件对比和合并功能使其成为解决 Git 冲突的有力工具。当 Git 冲突发生时,可以使用 Beyond Compare 打开冲突文件,它会以直观的方式展示文件的不同版本之间的差异,通过其独特的界面布局,开发者可以清晰地看到两个版本中哪些部分发生了变化,从而更准确地进行合并操作。它支持多种文件类型的对比和合并,不仅适用于代码文件,还可以用于文本文件、图像文件等。
  1. Araxis Merge:这是一款专业的文件合并和比较工具,与 Git 集成后,能为开发者提供高效的冲突解决方案。它的界面设计简洁明了,在解决 Git 冲突时,能够清晰地展示冲突文件的各个版本,并且提供了丰富的合并操作选项,如自动合并、手动合并、根据规则合并等。开发者可以根据具体的冲突情况选择合适的合并方式,确保冲突得到妥善解决。同时,Araxis Merge 还支持版本控制集成,能够与多种版本控制系统协同工作。

(三)使用 Idea 工具解决冲突实例

以 IntelliJ IDEA 为例,它是一款功能强大的 Java 集成开发环境,也提供了便捷的 Git 冲突解决功能。假设在一个 Java 项目中,feature分支和master分支对UserService.java文件进行了不同的修改,当尝试将feature分支合并到master分支时发生了冲突,以下是使用 Idea 解决冲突的具体步骤:

  1. 当执行合并操作后,Idea 会检测到冲突,并在编辑器中标记出冲突的文件,UserService.java文件会在项目导航栏中显示特殊的冲突标记。
  1. 打开UserService.java文件,Idea 会在冲突的代码部分显示冲突标记,用不同的颜色区分当前分支(master)和要合并分支(feature)的代码。
  1. 选择有冲突的UserService.java文件,在编辑器的右侧点击 “Merge” 按钮,Idea 会弹出冲突合并窗口。
  1. 在冲突合并窗口中,左侧显示当前分支(master)的代码,右侧显示要合并分支(feature)的代码,中间部分是合并后的结果(Result)。
  1. 仔细查看左右两侧的代码差异,根据实际需求选择保留哪部分代码到中间的结果区域。例如,如果feature分支中对用户登录逻辑的优化是正确的,而master分支中对用户信息获取部分的修改也是必要的,那么可以手动将这两部分正确的代码合并到中间的结果区域。可以通过点击代码行前的箭头按钮,将左侧或右侧的代码合并到结果区域,也可以直接在结果区域手动编辑代码。
  1. 当完成所有冲突代码的合并后,点击窗口右下角的 “Apply” 按钮,应用合并结果。此时,冲突标记会消失,表示冲突已解决。
  1. 最后,将解决冲突后的文件进行提交,在 Idea 的 Git 操作面板中,输入提交信息,如 “Resolve conflicts in UserService.java when merging feature branch”,然后点击 “Commit” 按钮完成提交,将合并后的代码提交到本地仓库。如果需要,还可以点击 “Push” 按钮将代码推送到远程仓库。

四、实战案例分析

(一)简单文件冲突案例

假设在一个小型的 JavaScript 项目中,有一个index.js文件,用于实现一个简单的数学计算功能。开发者 A 和开发者 B 同时对这个文件进行了修改。

开发者 A 在本地的feature/A分支上,为了添加一个新的计算功能,对index.js中的calculate函数进行了修改:

 

function calculate(a, b) {

return a + b; // 原本的功能是加法

// 新增乘法功能

// return a * b;

}

而开发者 B 在本地的feature/B分支上,为了优化代码结构,也对calculate函数进行了修改:

 

function calculate(a, b) {

// 优化代码结构,使用更简洁的写法

return a + b + 1;

}

当开发者 A 完成了自己的开发任务,尝试将feature/A分支合并到主分支master时,就发生了冲突。

  1. 发现冲突:执行git merge feature/A命令后,Git 提示冲突:
 

Auto-merging index.js

CONFLICT (content): Merge conflict in index.js

Automatic merge failed; fix conflicts and then commit the result.

  1. 查看冲突文件:使用git status命令查看冲突文件:
 

$ git status

On branch master

You have unmerged paths.

(fix conflicts and run "git commit")

Unmerged paths:

(use "git add <file>..." to mark resolution)

both modified: index.js

no changes added to commit (use "git add" and/or "git commit -a")

打开index.js文件,可以看到冲突标记:

 

<<<<<<< HEAD

function calculate(a, b) {

// 优化代码结构,使用更简洁的写法

return a + b + 1;

}

=======

function calculate(a, b) {

return a + b; // 原本的功能是加法

// 新增乘法功能

// return a * b;

}

>>>>>>> feature/A

  1. 解决冲突:经过与开发者 B 沟通,开发者 A 决定保留自己新增的乘法功能,同时采用开发者 B 优化后的简洁写法。于是将冲突部分修改为:
 

function calculate(a, b, operation) {

if (operation ==='sum') {

return a + b + 1;

} else if (operation === 'product') {

return a * b;

}

}

  1. 标记冲突已解决:修改完成后,执行git add index.js命令,标记冲突已解决。
  1. 完成合并:执行git commit命令,输入提交信息 “Merge feature/A into master - resolve conflict in index.js”,完成合并操作。

(二)复杂项目冲突案例

以一个大型的电商项目为例,该项目采用前后端分离架构,前端使用 Vue.js 框架,后端使用 Spring Boot 框架,并且使用微服务架构进行服务拆分。在开发过程中,多个团队并行开发不同的功能模块,这就导致了在合并分支时容易出现复杂的 Git 冲突。

假设在项目的开发过程中,order-service微服务团队负责订单相关功能的开发,product-service微服务团队负责商品相关功能的开发。两个团队都对公共的配置文件application.yml进行了修改。order-service团队为了配置订单服务的新接口地址,修改了application.yml中的相关配置:

 

order-service:

base-url: http://new-order-service-url:8080

timeout: 5000

而product-service团队为了配置商品服务的缓存策略,也对application.yml进行了修改:

 

product-service:

cache:

enabled: true

type: redis

config:

host: 127.0.0.1

port: 6379

当两个团队完成各自的开发任务,尝试将分支合并到develop分支时,就出现了冲突。

  1. 发现冲突:执行git merge order-service-branch命令后,Git 提示冲突:
 

Auto-merging application.yml

CONFLICT (content): Merge conflict in application.yml

Automatic merge failed; fix conflicts and then commit the result.

  1. 查看冲突文件:使用git status命令查看冲突文件,确认是application.yml文件发生冲突。打开application.yml文件,看到冲突标记:
 

<<<<<<< HEAD

product-service:

cache:

enabled: true

type: redis

config:

host: 127.0.0.1

port: 6379

=======

order-service:

base-url: http://new-order-service-url:8080

timeout: 5000

>>>>>>> order-service-branch

  1. 团队沟通:由于这是一个涉及多个微服务的复杂项目,两个团队的修改都非常重要,不能简单地保留一方的修改。于是order-service团队和product-service团队通过线上会议进行沟通,明确各自修改的目的和影响范围。
  1. 解决冲突:根据沟通结果,两个团队共同协商解决方案。最终决定将两个团队的修改都保留,并按照微服务的配置规范进行整理,将冲突部分修改为:
 

order-service:

base-url: http://new-order-service-url:8080

timeout: 5000

product-service:

cache:

enabled: true

type: redis

config:

host: 127.0.0.1

port: 6379

  1. 标记冲突已解决:修改完成后,执行git add application.yml命令,标记冲突已解决。
  1. 完成合并:执行git commit命令,输入详细的提交信息 “Merge order-service-branch into develop - resolve conflict in application.yml after communication with product-service team”,完成合并操作。

在这个复杂项目冲突案例中,通过团队之间的有效沟通,结合对项目整体架构和业务逻辑的理解,以及遵循基础的 Git 冲突解决流程,成功解决了冲突,确保了项目的顺利进行。这也体现了在大型项目中,团队协作和沟通在解决 Git 冲突中的重要性。

五、避免 Git 冲突的最佳实践

(一)保持代码库的最新状态

在开始一天的开发工作之前,务必执行git fetch origin和git pull origin main(假设主分支是main)等操作。git fetch origin会从远程仓库获取最新的分支和提交信息,但不会自动合并到本地分支;git pull origin main则是在git fetch的基础上,将远程main分支的最新更改合并到本地的main分支。这样做可以确保本地代码库始终与远程仓库保持同步,减少因代码差异过大而产生冲突的可能性。例如,在一个持续迭代的移动应用开发项目中,每天都会有新的功能提交到远程仓库,如果开发者不及时更新本地代码,在自己的分支上进行长时间开发后再尝试合并到主分支,就很容易出现大量冲突,增加解决冲突的难度和时间成本。

(二)良好的分支管理策略

  1. 合理创建分支:在项目开发中,应该根据不同的功能或任务创建独立的分支,如feature分支用于开发新功能,bugfix分支用于修复线上问题。以一个电商项目为例,当开发新的商品推荐功能时,创建feature/recommendation分支,团队成员在这个分支上独立进行开发,避免对主分支和其他功能分支造成干扰。这样,不同的开发工作相互隔离,即使在开发过程中出现问题或修改,也只会影响到当前分支,不会影响整个项目的稳定性。
  1. 正确使用分支:每个分支都有其明确的用途。master分支通常作为稳定版本的代码库,只接受经过充分测试和审核的代码合并,不应该在master分支上直接进行开发工作;develop分支是日常开发的集成分支,新功能和代码迭代都在这个分支上进行,当feature分支开发完成并通过测试后,再合并到develop分支进行集成测试。
  1. 及时合并分支:当一个功能在feature分支上开发完成并经过测试后,应及时将其合并到develop分支或master分支。长时间不合并分支会导致分支之间的差异越来越大,增加合并时冲突的可能性和解决冲突的难度。例如,在一个在线教育平台项目中,feature/course-video-playback分支完成了课程视频播放功能的开发,如果不及时合并到develop分支,随着develop分支的不断更新,当最终尝试合并时,可能会因为两个分支对视频播放相关代码的大量不同修改而产生复杂的冲突。

(三)团队协作规范

  1. 代码提交规范:制定统一的代码提交规范,确保每个提交都有清晰、准确的提交信息。提交信息应包括简短的标题,概括本次提交的主要内容,以及详细的描述,解释提交的原因和变更细节。例如,提交信息 “fix: 解决用户注册时验证码无法显示的问题,修改了验证码生成和前端显示的相关代码”,这样的规范可以让团队成员在查看提交历史时,快速了解每次代码变更的目的和内容,便于后续的代码审查和问题排查。
  1. 沟通机制:建立有效的沟通机制,当团队成员在开发过程中发现可能会影响到其他成员的代码修改时,及时进行沟通。例如,在一个大型企业级项目中,后端开发人员计划对某个核心接口进行重构,这个接口前端也在频繁使用,此时后端开发人员就需要提前与前端开发人员沟通,告知重构计划和可能的影响,前端开发人员可以根据情况调整自己的开发计划,避免在接口重构期间进行与该接口相关的开发工作,从而减少冲突的发生。另外,在合并分支前,先拉取最新代码,确保本地代码是最新状态,减少因代码不同步而产生的冲突。如果在拉取代码后发现有冲突,及时与相关人员沟通,共同解决冲突后再进行合并操作。

六、总结与展望

(一)回顾重点内容

在团队开发中,Git 冲突是一个常见且不可忽视的问题。通过本文的介绍,我们深入了解了 Git 冲突的产生机制,包括多人协作场景下对同一文件的不同修改,以及合并与变基操作过程中因代码差异导致的冲突。掌握了 Git 冲突解决的基础流程,从识别冲突信号,到查看冲突文件、手动解决冲突、标记冲突已解决,再到完成合并或变基,每一步都至关重要。同时,我们还探讨了基于工具的 Git 冲突解决技巧,图形化工具如 GitKraken、SourceTree 等以其直观的界面和便捷的操作,为我们解决冲突提供了更高效的方式;以 Idea 工具为例的实战演示,让我们进一步熟悉了在集成开发环境中解决冲突的具体步骤。

在实战案例分析中,简单文件冲突案例和复杂项目冲突案例展示了不同场景下冲突的产生和解决方法,强调了团队沟通在解决复杂冲突中的关键作用。此外,我们还总结了避免 Git 冲突的最佳实践,保持代码库的最新状态、采用良好的分支管理策略以及建立有效的团队协作规范,这些措施能够在很大程度上减少冲突的发生,提高团队开发效率。

(二)未来学习方向

Git 作为一款强大的版本控制系统,还有许多高级特性值得我们深入探索。例如,cherry-pick 命令可以将一个分支上的单个提交应用到另一个分支上,这在某些特定场景下非常有用,比如在修复线上问题时,可以将测试环境中修复的提交直接应用到生产分支,而无需合并整个分支。交互式rebase(git rebase -i)允许我们重新整理提交历史,删除、编辑或合并提交,这对于优化项目的提交历史,使其更加清晰和有条理非常有帮助。还有git bisect命令,它可以帮助我们通过二分查找的方式定位到引入问题的提交,在排查代码问题时能大大提高效率。

在未来的学习中,我们可以通过实际项目的实践,不断尝试和运用这些高级特性,提升自己对 Git 的掌握程度。同时,随着团队规模的扩大和项目复杂度的增加,我们还需要进一步学习如何更好地管理和维护大型的 Git 仓库,包括优化仓库结构、设置合理的权限等,以更好地应对复杂的开发场景,确保项目的顺利进行。


http://www.kler.cn/a/538468.html

相关文章:

  • [笔记] 汇编杂记(持续更新)
  • IDEA编写SpringBoot项目时使用Lombok报错“找不到符号”的原因和解决
  • 计算机网络应用层:模型、系统与协议全解析!!!
  • Stability AI 联合 UIUC 提出单视图 3D 重建方法SPAR3D,可0.7秒完成重建并支持交互式用户编辑。
  • zzcms接口index.php id参数存在SQL注入漏洞
  • redis高级数据结构布隆过滤器
  • FPGA高端项目:图像采集+UltraScale GTH光编码+UDP图传架构,高速接口转网络视频传输,提供工程源码和技术支持
  • 支持多种网络数据库格式的自动化转换工具——VisualXML
  • 25/2/7 <机器人基础>雅可比矩阵计算 雅可比伪逆
  • 协议-WebRTC-HLS
  • 08vue3实战-----在vue3项目中集成Element-Plus组件库
  • 保姆级教程--DeepSeek部署
  • snort的学习记录
  • 【自学笔记】文言一心的基础知识点总览-持续更新
  • Ollama下载安装教程
  • 从零开始玩转Docker:轻松开启容器化之旅
  • 关于32位和64位程序的传参方法及虚拟机调试工具总结
  • Linux提供给我们的定时器
  • 【k8s集群应用】kubenetes-YAML
  • QT实现多线程的方法
  • 谷歌浏览器多开指南:如何完成独立IP隔离?
  • 在线免费 HTML 预览导出为图片,并且支持水平切割
  • 基于Flask的汽车质量投诉可视化分析系统的设计与实现
  • 手写一个C++ Android Binder服务及源码分析
  • Java模块化 - 基本介绍
  • 0 CAD开源内核 Truck