版本管理|Git -目前最好的版本管理工具

文章目录

  • 什么是版本
  • 为什么需要版本管理
  • Git -目前最好的版本管理工具
    • Git的关键特点和概念
    • 初始化Git
    • 保存代码改变
      • git add
      • git commit -m ""
      • git status
      • git log
    • branch分支管理
      • git branch & git chekout
      • HEAD的本质
      • git merge 合并
      • fast forward merge
    • 本地与远程
    • 如何解决代码冲突
  • 常见面试题

什么是版本

在软件开发中,版本通常指的是代码或项目的一个特定状态或发布的一个特定副本。每次对代码或项目进行修改时,开发团队可以选择增加版本号或标记新版本,以便在未来能够准确追踪和识别不同的代码状态。

在项目根目录下运行 tree命令可以查看文件树,版本是文件树在某一个时间节点的状态

为什么需要版本管理

版本管理是软件开发过程中至关重要的一部分,有以下几个主要原因:

  • 追踪变更历史:版本管理系统允许开发人员记录文件的每一次变更,包括谁做了什么修改,何时进行的修改。这样的记录对于追踪 bug、了解代码演变历程以及还原到先前的工作状态都非常重要。
  • 团队协作:在多人协作开发的项目中,版本管理系统允许多个开发人员同时编辑同一组文件,而不会造成冲突。通过合并不同的修改,开发团队可以协同工作,共同构建项目。
  • 备份和恢复:版本管理系统提供了一个集中的位置来存储项目文件的所有版本。这意味着即使出现灾难性故障或意外删除,开发人员也可以轻松地恢复到先前的工作状态。
  • 尝试新功能:版本管理系统使得创建和管理实验性功能变得容易。通过创建分支,开发人员可以在不影响主要代码的情况下尝试新功能,并在验证其可行性后合并到主分支中。
  • 版本发布:通过版本管理系统,开发团队可以轻松地标记和发布稳定的版本。这确保了在发布新版本时,能够确切地知道包含了哪些修改,并能够轻松地重现发布的特定版本。

总的来说,版本管理系统是一种关键工具,有助于提高软件开发的效率、质量和可靠性,同时也为开发团队提供了更好的协作和追踪工具。

Git -目前最好的版本管理工具

高效的开发流程,需要高效的版本管理工具去支撑,Git是一个高效的分布式版本控制系统,由Linus Torvalds创建,用于管理软件开发中的源代码。

Git的关键特点和概念

代码仓库:Git通过使用仓库(repository)来管理代码。仓库包含项目的所有文件和历史记录。开发者可以克隆现有的仓库到本地进行修改,也可以创建新的仓库来管理项目。
分支:Git鼓励使用分支来进行开发。分支是项目的一个独立工作线,开发者可以在不影响主线(通常是master分支)的情况下进行实验、开发新功能或修复bug。分支的创建、合并和删除都是非常快速和灵活的。
提交:开发者通过提交(commit)来保存工作的状态。每次提交都会记录文件的修改,并包含相应的注释以便后续回顾。提交后的变化可以在本地或者远程仓库中分享给其他开发者。
远程仓库:Git支持与远程仓库进行交互,常见的远程仓库包括GitHub、GitLab和Bitbucket等。开发者可以将本地的代码推送(push)到远程仓库,也可以从远程仓库拉取(pull)更新到本地。
标签:标签(tag)是对代码仓库中某个特定版本的命名标识,通常用于标记发布版本或重要的里程碑。
合并:Git提供了强大的合并(merge)功能,可以将一个分支的修改合并到另一个分支中。这对于协作开发和整合不同功能非常有用。
钩子:Git提供了各种钩子(hooks),允许开发者在提交、合并等操作前或后执行自定义脚本,从而实现一些自动化的任务。
总的来说,Git是一款强大且灵活的版本控制工具,广泛应用于软件开发领域,为开发者提供了高效的协作方式和版本管理能力。

初始化Git

  • 仓库 Repository
    • 存储文件树,并且可以访问任务的版本
  • 创建新仓库 git init
  • 克隆远程仓库 git clone

保存代码改变

git add

  • Working Directory:工作区,没有被暂存(Staging)的文件所在地,git add 指令会将文件或者文件夹里的内容加入到暂存区
  • Staging Area:暂存区,暂存目的是为了以后的提交,暂存区可以看为是工作区与提交记录(commit history)中间的一个缓冲区

git commit -m “”

  • commit 指令用来将暂存区的内容提交到历史(commit history)中
  • 也可以将这个提交历史理解为 git repository,因为repository会保存整个项目中所有的commit history
  • 一个commit可以看为右图的一个节点
    • 一个指向当前repository snapshot(文件快照)的指针
    • 指向"parent" commit的指针

git status

git status是一个Git命令行工具中的基本命令,用于查看当前工作目录的状态。执行此命令时,会列出以下信息:

  • 已修改的文件:显示了被修改但尚未添加到暂存区的文件。
  • 已暂存的文件:显示了已经添加到暂存区但尚未提交的文件。
  • 未跟踪的文件:显示了尚未被Git跟踪的文件。
  • 当前分支:显示了当前所在的分支。

通常,执行git status命令可以帮助用户了解工作目录的状态,以便采取适当的操作,例如将修改添加到暂存区或提交已暂存的修改。

git log

git log是一个Git命令,用于查看当前分支的提交历史记录。执行此命令会显示一系列提交记录,其中包括每次提交的作者、提交日期、提交信息以及提交的哈希值等信息。
git log命令默认按照提交时间的倒序显示提交记录,最新的提交记录显示在最顶部。如果需要退出git log命令的查看,可以按下 q 键。
此外,git log命令还支持许多选项和参数,例如:

  • --oneline:以一行的方式简化显示每个提交记录。
  • --graph:以图形的方式展示提交历史,显示分支与合并的情况。
  • --author=<author>:筛选指定作者的提交记录。
  • --since=<date>:只显示指定日期之后的提交记录。
  • --until=<date>:只显示指定日期之前的提交记录。

通过git log命令,可以了解项目的演变历程,以及每次提交的修改内容和作者信息,有助于跟踪项目的开发进程。

branch分支管理

分支是git最核心的概念,掌握了分支的创建、合并基本上就可以轻松的与开发团队协同了。分支其实也并没有很神秘,就是一个有名字的指针,指向对应的commit

git branch & git chekout

  • git branch
    • 用于新建一个分支
  • git checkout
    • 切换到对应分支
  • git checkout -b <branch_name>
    • 创建并切换到对应分支

HEAD的本质

  • 想要了解 checkout 的本质,就必须要明白 HEAD 的含义
  • HEAD 表示当前 git 指向哪个 commit
  • 因此 checkout 就是将 HEAD 指向的 commit 完成了切换
  • Attached HEAD vs Detached HEAD:“Attached HEAD” 和 “Detached HEAD” 是两种不同的状态,通常与版本控制系统(如 Git)一起使用。
    1. Attached HEAD(附着 HEAD):这是指 HEAD 引用指向一个分支(branch),它是版本控制系统中的一种正常状态。在这种情况下,HEAD 引用指向当前所在的分支,并且在提交新的更改时,这些更改会被添加到该分支的历史记录中。
    2. Detached HEAD(分离 HEAD):这是指 HEAD 引用指向一个特定的提交(commit),而不是指向任何分支。这种情况下,你处于一个不属于任何分支的状态。通常,这会发生在你检出一个特定的提交或标签时。在分离 HEAD 状态下,如果进行更改并提交,这些更改不会属于任何分支,而是直接添加到提交历史中。这意味着,如果你在这种状态下提交更改后切换分支,你可能会丢失对这些提交的引用,因为没有分支指向它们。
    3. 总的来说,Attached HEAD 是一种正常的状态,表示你目前在一个分支上工作;而 Detached HEAD 表示你处于一个特定的提交上,不属于任何分支,通常是为了查看或测试某个特定的历史状态。

git merge 合并

  • 将feature分支合并到main
    • git check out main
      • main 是合并前的分支
    • git merge feature
      • feature 是我们需要合并的分支
      • feature分支在合并后不受任何影响
  • 可以把merge操作看成在当前分支创一个新的commit,这个commit会有两个分支的历史记录的无冲突合并

fast forward merge

  • Fast-forward merge 是 Git 版本控制系统中的一种合并策略。当在一个分支上进行了一系列提交,然后要将这些更改合并回主分支(或任何父分支)时,如果在这段时间内,主分支没有任何新的提交,Git 就可以执行所谓的 fast-forward merge。
  • 在 fast-forward merge 中,Git 只是简单地将主分支的指针向前移动到分支的最新提交,因为不存在任何冲突的提交,所以不需要进行实际的文件合并。这样,分支的历史就直接成为了主分支的历史。
  • Fast-forward merge 是 Git 的默认合并行为,当目标分支(通常是主分支)没有新的提交时,直接使用 git merge 就可以达到这个效果。这意味着当执行 git merge feature 来将 feature 分支的更改合并到当前分支时,如果当前分支(假设是 master)自从 feature 分支创建以来没有新的提交,Git 将自动执行 fast-forward merge。在这种情况下,不需要特殊的命令或标志来触发 fast-forward 合并。Git 会检测到这是可能的,并默认进行快进操作,将 master 分支的指针移动到 feature 分支的最新提交。
  • 如果你不希望进行 fast-forward 合并,想要明确地创建一个新的合并提交,即使是在可以快进的情况下,你可以使用 --no-ff 选项,这个命令会创建一个新的合并提交,即使 feature 分支可以直接快进合并到 master 分支。
git merge feature --no-ff
  • 总之,默认情况下,git merge 命令会在可能的情况下执行 fast-forward 合并,无需额外的命令或参数。如果你想避免这种行为,可以使用 --no-ff 选项来强制创建一个合并提交。

举一个例子,假设我们有一个名为 master 的主分支和一个名为 feature 的特性分支。如果 feature 分支基于 master 分支最新的提交创建,并且在 feature 分支上进行了一系列更改,同时 master 分支在这段时间内没有新的提交,那么当你尝试将 feature 合并回 master 时,Git 将执行 fast-forward merge。

  • 优点:Fast-forward merge 的优点是它保持了仓库历史的线性,使得历史看起来很干净,没有不必要的合并提交。
  • 缺点:如果想保留分支的历史记录和上下文,fast-forward merge 就不会在历史中保留一个明显的节点来表示分支点。

本地与远程

在 Git 的上下文中,“本地” 和 “云端”(或更常见的说法是"远程")是指代码仓库的两种不同的存储位置。Git是分布式设计,无论本地,还是云端仓库都拥有项目的全部历史记录

  • 本地(Local):
    • 本地仓库是指你在自己的计算机上有的仓库副本。当你克隆(clone)一个远程仓库时,Git 会在你的机器上创建一个本地仓库的副本,包括所有的文件和版本历史。
    • 在本地仓库中,你可以执行所有常规的 Git 操作,如提交(commit)、分支(branch)、合并(merge)、重置(reset)等,而不需要网络连接。
    • 本地仓库通常包含一个或多个与远程仓库关联的远程(remote),这些远程仓库通常托管在互联网上,如 GitHub、GitLab 或 Bitbucket。
  • 远程(Remote):
    • 远程仓库是指托管在互联网上或其他网络中的代码仓库。远程仓库允许多个开发者协作,并且作为代码的集中存储位置。
    • 远程仓库通常是一个裸仓库(bare repository),意味着它没有工作目录,只存储 Git 的数据(即版本历史),因此不允许直接在该仓库上进行编辑或提交操作。
    • 开发者可以使用 git push 将本地更改推送到远程仓库,或使用 git fetchgit pull 从远程仓库拉取更新到本地仓库。
    • 一般来说,当提到 Git 的 “云端” 时,通常指的是远程仓库,远程仓库通常托管在为开发者协作提供便利的云服务平台上。
    • 要查看与本地仓库关联的远程仓库的列表,可以使用命令 git remote -v。要与远程仓库交互,比如推送或拉取更改,将使用 git pushgit pull 命令。这些操作需要网络连接以与远程仓库进行通信。

如何解决代码冲突

解决代码冲突是版本控制过程中常见的任务,特别是在多人协作的项目中。当两个或多个开发者在相同文件的相同部分进行更改,并且这些更改不能自动合并时,就会出现冲突。以下是解决代码冲突的一般步骤:

  1. 检测冲突
    在合并分支(例如使用 git mergegit rebase)时,Git 会尝试自动合并更改。如果出现冲突,Git 无法自动解决,它会中止合并过程并标记出冲突文件。
  2. 查看冲突
    使用 git status 查看哪些文件存在冲突。冲突文件会在输出中标记为未合并(unmerged)状态。
  3. 手动解决冲突
    打开冲突文件,并查找冲突标记。Git 会用特殊的标记来指示冲突的区域。这些标记通常包括:
  • <<<<<<< HEAD:表示当前分支(或正在合并到的分支)中的内容。
  • =======:分隔符,用来区分不同分支的内容。
  • >>>>>>> [other-branch-name]:表示与当前分支冲突的另一个分支中的内容。

需要决定如何解决这些冲突,可能的解决方案包括:

  • 选择其中一个分支的更改。
  • 结合两个分支的更改。
  • 编写全新的代码替代这两个分支的更改。

解决冲突时,确保删除 Git 插入的标记,并确保代码的完整性和功能。

  1. 测试解决方案
    在解决了所有文件的冲突后,编译并测试代码,确保你的更改不会引入任何错误或问题。
  2. 标记冲突为已解决
    解决冲突后,你需要将这些文件标记为已解决。可以使用 git add 命令将解决后的文件标记为已解决状态。
  3. 完成合并
    所有冲突解决后,如果你是在执行合并操作,可以通过 git commit 完成合并。Git 会创建一个新的合并提交,说明合并了另一个分支并解决了冲突。如果你是在执行 rebase 操作,可以使用 git rebase --continue 继续进行 rebase 流程。
  4. 分享解决方案
    解决冲突并完成合并后,将更改推送到远程仓库,以便其他团队成员可以看到解决后的结果。

解决冲突可能需要一定的时间和耐心,特别是在大型项目或大量冲突的情况下。良好的沟通和代码审查可以减少冲突的发生。

常见面试题

在软件开发领域,版本管理是一个非常重要的主题,因此在面试中经常会涉及相关问题。以下是一些关于版本管理的常见面试题以及相应的答案:

  1. 什么是版本控制?为什么它对软件开发如此重要?
    答案: 版本控制是一种记录文件变更历史和管理不同版本的方法。它对软件开发至关重要,因为它可以帮助开发团队追踪和管理代码的变化、协作开发、恢复到先前的工作状态、备份项目等,从而提高开发效率、减少错误,并促进团队合作。
  2. 什么是集中式版本控制系统和分布式版本控制系统?它们之间有什么区别?
    答案: 集中式版本控制系统是指所有文件的历史记录都存储在单一的中央服务器上,开发者需要通过与中央服务器进行交互来进行版本控制。而分布式版本控制系统则是每个开发者都拥有完整的代码仓库,可以在本地进行版本控制操作,不依赖于中央服务器。分布式系统的优势在于更强大的分支和合并支持、更好的性能和离线工作能力。
  3. 什么是Git?它与其他版本控制系统的区别是什么?
    答案: Git是一个分布式版本控制系统,由Linus Torvalds创建,用于管理软件开发中的源代码。与其他版本控制系统相比,Git具有更强大的分支和合并支持、更好的性能、离线工作能力、完整的版本历史记录等优势。
  4. 什么是分支?为什么我们需要使用分支?
    答案: 分支是代码仓库中的一个独立工作线,允许开发者在不影响主线(通常是master分支)的情况下进行实验、开发新功能或修复bug。使用分支可以提高代码的可维护性、避免不同功能之间的冲突、支持并行开发等。
  5. 什么是提交?提交时为什么需要写提交信息?
    答案: 提交是将工作目录中的修改保存到代码仓库中的过程。提交信息是对修改内容的描述,它对于其他开发者理解本次提交的目的和内容非常重要,可以帮助团队成员更好地追踪代码变化、了解项目历史、快速定位问题等。
  6. 什么是合并?在何种情况下需要进行合并操作?
    答案: 合并是将两个或多个分支的修改集成到一个分支中的过程。在多人协作开发中,不同的开发者可能会在不同的分支上进行工作,当一个分支的修改需要应用到另一个分支时,就需要进行合并操作。合并可以通过自动或手动的方式完成,以确保代码的一致性和完整性。
  7. Git 里面的 commit 是什么意思?

答案:Git里面的commit是指将工作目录中的修改保存到本地仓库的一个操作。每次commit都会生成一个唯一的哈希值,用于标识这次提交,同时也包含了作者信息、提交时间、提交信息等元数据。通过commit,开发者可以记录代码的修改历史,追踪项目的演进,并且方便与团队成员分享和协作。

  1. Git 里面 branch 的本质是什么?

答案:Git里面branch的本质是指指向一个commit对象的指针。每个branch都代表了项目的一个分支或开发线,它们可以指向不同的commit,因此可以同时存在多个并行的开发线。当创建新的commit时,branch指针会自动移动到最新的commit,从而更新项目的状态

  1. 如何高效、安全地与他人协同?

答案:要高效、安全地与他人协同,可以采取以下措施:

  • 使用分支进行开发,避免直接在主分支上进行修改。
  • 定期将本地的修改推送到远程仓库,并从远程仓库拉取最新的修改。
  • 提交清晰明了的提交信息,方便团队成员理解和回顾修改的内容。
  • 解决冲突时,及时与团队成员沟通,避免产生不必要的误解和问题。
  • 使用权限控制和分支保护等机制,确保只有授权的成员能够对代码仓库进行修改和提交。
  1. **如何进行大型项目的版本管理? **

答案:进行大型项目的版本管理可以考虑以下方法:

  • 使用分支管理不同的功能模块或团队任务,便于并行开发和协作。
  • 实施合理的代码审查机制,确保每次提交都经过严格的审核和测试。
  • 使用标签对重要的里程碑版本进行标记,方便团队成员快速定位和回溯特定版本。
  • 使用持续集成和持续部署工具,自动化构建、测试和部署过程,提高项目交付的效率和质量。
  • 定期进行代码库的清理和优化,确保代码库的结构和内容保持清晰和高效。
  1. commit history 是什么概念?

答案:commit history(提交历史)是指Git代码仓库中的所有提交记录的集合。每次通过git commit命令提交的修改都会生成一个新的提交记录,其中包含了作者信息、提交时间、提交信息以及对应的哈希值等元数据。
提交历史记录了项目的演进历程,可以追溯项目从创建至今的所有修改和变化。通过查看提交历史,开发者可以了解项目的发展轨迹,了解每个提交的具体内容和目的。提交历史还可以帮助团队成员进行代码审查、定位bug、回滚修改等操作,是项目管理和版本控制中非常重要的一个部分。

以上是一些关于版本管理的常见问答,可以有助于了解和学习版本控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一刷《剑指Offer》】面试题 3:二维数组中的查找

力扣对应题目链接&#xff1a;240. 搜索二维矩阵 II - 力扣&#xff08;LeetCode&#xff09; 核心考点&#xff1a;数组相关&#xff0c;特性观察&#xff0c;时间复杂度把握。 一、《剑指Offer》对应内容 二、分析题目 正常查找的过程本质就是排除的过程&#xff0c;谁排除…

【YOLOv9】完胜V8的SOTA模型Yolov9(论文阅读笔记)

官方论文地址&#xff1a; 论文地址点击即可跳转 官方代码地址&#xff1a; GitCode - 开发者的代码家园 官方代码地址点击即可跳转 1 总述 当输入数据经过各层的特征提取和变换的时候&#xff0c;都会丢失一定的信息。针对这一问题&#xff1a; 论文中提出的可编程梯度信息…

免费的 ChatGPT 网站(六个)

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《C》 《Linux》 《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 文章目录 一、insCode二、讯飞星火三、豆包四、文心一言五、通义千问六、360智脑 现在智能…

【漏洞复现】WordPress LayerSlider插件SQL注入漏洞复现

声明&#xff1a;亲爱的读者&#xff0c;我们诚挚地提醒您&#xff0c;Aniya网络安全的技术文章仅供个人研究学习参考。任何因传播或利用本实验室提供的信息而造成的直接或间接后果及损失&#xff0c;均由使用者自行承担责任。Aniya网络安全及作者对此概不负责。如有侵权&#…

C数据结构:双向链表(带头循环)

前言 链表分多种&#xff0c;分别为 不带头不循环单向链表、不带头循环单向链表、带头循环单向链表、带头不循环单向链表 不带头不循环双向链表、不带头循环双向链表、带头循环双向链表、带头不循环双向链表 一共八种 在前一篇博客中完成的单链表即为不带头不循环单向链表…

杰发科技AC7840——CAN通信简介(5)_可变波特率设置

0. 简介 设置可变波特率时候&#xff0c;遇到2个坑&#xff0c;在此记录下来 使用该函数即可 can_time_segment_t bitrate2 s_canBitrate[CAN_BITRATE_250K]; CAN_DRV_SetBitrate(instance, &bitrate2); 1. 波特率指针注意不要空 查看设置波特率的接口&#xff0c;发现…

吉他弹唱谱怎么制作 Guitar Pro 怎么写弹简谱 Guitar Pro8.02简谱

学习如何制作吉他弹唱谱是提升音乐创作和表现能力的重要一环。借助专业的软件工具如Guitar Pro&#xff0c;可以轻松地将音乐创意转化为可视化的乐谱&#xff0c;使演奏和分享变得更加便捷和高效。下面我们来看看吉他弹唱谱怎么制作&#xff0c;Guitar Pro 怎么写弹简谱的相关内…

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …

机器学习和深度学习--李宏毅(笔记与个人理解)Day9

Day9 Logistic Regression&#xff08;内涵&#xff0c;熵和交叉熵的详解&#xff09; 中间打了一天的gta5&#xff0c;图书馆闭馆正好npy 不舒服那天天气不好&#xff0c;哈哈哈哈哈总之各种理由吧&#xff0c;导致昨天没弄起来&#xff0c;今天补更&#xff01; 这里重点注意…

面试官:实战中用过CountDownLatch吗?详细说一说,我:啊这...

写在开头 在很多的面经中都看到过提问 CountDownLatch 的问题&#xff0c;正好我们最近也在梳理学习AQS&#xff08;抽象队列同步器&#xff09;&#xff0c;而CountDownLatch又是其中典型的代表&#xff0c;我们今天就继续来学一下这个同步工具类&#xff01; CountDownLatc…

机器学习第34周周报VBAED

文章目录 week34 VBAED摘要Abstract一、文献阅读1. 题目2. abstract3. 网络架构3.1 序列问题阐述3.2 变分模态分解3.3 具有 BiLSTM 和双向输入注意力的编码器3.4 具有 BiLSTM 和双向时间注意力的解码器 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程4.3.1 数据集数据预处…

Redis为什么会变慢

链接: https://pan.baidu.com/s/1PNzhDMqkFBdKUu9_FxA5zw 提取码: euvk

以太网数据量大小字符串生成方法(可变单位)

0 前言 当我们想显示以太网数据量大小时&#xff0c;往往有个头疼的单位需要处理&#xff0c;单位取小了不一目了然&#xff0c;单位取大了精度太低。本例设计一个函数&#xff0c;将根据以太网数据量大小自动生成单位可变的字符串&#xff08;KB、MB、GB、TB、PB&#xff09;…

雷军 30 年前的病毒论文,结语最后一句是亮点

在 2023 雷军年度「成长」主题演讲中&#xff0c;他分享了自己在武汉大学设立的三个目标&#xff1a; 两年修完大学所有学分成为优秀的程序员在学报上发论文 对于彼时的在校生来说&#xff0c;在一级学报上发表论文是十分困难的事情&#xff0c;但雷军并没有因困难而畏惧、放…

【植物大战僵尸融合机器学习】+源码

上期回顾&#xff1a; 今天给大家推荐一个Gtihub开源项目&#xff1a;PythonPlantsVsZombies&#xff0c;翻译成中就是植物大战僵尸。 《植物大战僵尸》是一款极富策略性的小游戏。可怕的僵尸即将入侵&#xff0c;每种僵尸都有不同的特点&#xff0c;例如铁桶僵尸拥有极强的抗…

VRRP虚拟路由实验(华为)

思科设备参考&#xff1a;VRRP虚拟路由实验&#xff08;思科&#xff09; 一&#xff0c;技术简介 VRRP&#xff08;Virtual Router Redundancy Protocol&#xff09;是一种网络协议&#xff0c;用于实现路由器冗余&#xff0c;提高网络可靠性和容错能力。VRRP允许多台路由器…

APP开发_开发一个入门的 H5 APP

1 开发环境的搭建与准备 1.1 安装 Android Studio 下载&#xff1a;首先&#xff0c;从谷歌的安卓开发者网站&#xff08;https://developer.android.google.cn/studio/releases?hlzh-cn&#xff09;下载Android Studio的安装包。在下载页面中&#xff0c;可以根据自己的操作…

llamafactory:unified efficient fine-tuning of 100+ lanuage models

1.introduction llamafactory由三个主要模块组成&#xff0c;Model Loader&#xff0c;Data Worker&#xff0c;Trainer。 2.Efficient fine-tuning techniques 2.1 Efficient Optimization 冻结微调&#xff1a;冻结大部分参数&#xff0c;同时只在一小部分解码器层中微调剩…

【MATLAB源码-第36期】matlab基于BD,SVD,ZF,MMSE,MF,SLNR预编码的MIMO系统误码率分析。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. MIMO (多输入多输出)&#xff1a;这是一个无线通信系统中使用的技术&#xff0c;其中有多个发送和接收天线。通过同时发送和接收多个数据流&#xff0c;MIMO可以增加数据速率和系统容量&#xff0c;同时提高信号的可靠性。…

建造者模式:构造复杂对象的艺术

在面向对象的设计中&#xff0c;建造者模式是一种重要的创建型设计模式&#xff0c;专门用来构建复杂的对象。它主要目的是将对象的构造代码与其表示代码分离&#xff0c;使同样的构建过程可以创建不同的表示。本文将详细介绍建造者模式的定义、实现、应用场景以及优缺点&#…