git中的分支管理:git branch,git checkout,解决git中的分支冲突的方法【Git学习三】

在这里插入图片描述

😁 作者简介:一名大四的学生,致力学习前端开发技术
⭐️个人主页:夜宵饽饽的主页
❔ 系列专栏:Git等软件工具技术的使用
👐学习格言:成功不是终点,失败也并非末日,最重要的是继续前进的勇气

​🔥​前言:

这里是关于git的分支管理和多人协作时的知识,让大家真正学会运用git的分支管理,而不是停留在命令上面,希望可以帮助到大家,欢迎大家的补充和纠正

文章目录

    • 第三章 分支管理
      • 3.1 创建与合并冲突
      • 3.2 解决冲突
      • 3.3 分支管理策略
      • 3.4 Bug分支
      • 3.5 多人协作
        • 3.5.1 推送分支
        • 3.5.2 抓取分支

第三章 分支管理

3.1 创建与合并冲突

在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

一开始的时候,master分支是一条线,Git用master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点:

                  HEAD││▼master││▼
┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

                 master││▼
┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘▲││dev▲││HEAD

你看,Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!

不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

                 master││▼
┌───┐    ┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘    └───┘▲││dev▲││HEAD

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

                           HEAD││▼master││▼
┌───┐    ┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘    └───┘▲││dev

所以Git合并分支也很快!就改改指针,工作区内容也不变!

合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支:

                           HEAD││▼master││▼
┌───┐    ┌───┐    ┌───┐    ┌───┐
│   │───▶│   │───▶│   │───▶│   │
└───┘    └───┘    └───┘    └───┘

其他的命令可以在命令小结查找到,我这里说一下有点难理解的合并分支的命令:

$ git merge dev
Updating e5dfae5..2d46c90
Fast-forwardreadme.txt | 3 ++-1 file changed, 2 insertions(+), 1 deletion(-)

git merge命令用于合并指定分支到当前分支。合并后,再查看readme.txt的内容,就可以看到,和dev分支的最新提交是完全一样的。

注意到上面的Fast-forward信息,Git告诉我们,这次合并是“快进模式”,也就是直接把master指向dev的当前提交,所以合并速度非常快。

当然,也不是每次合并都能Fast-forward,我们后面会讲其他方式的合并

⭐️ 命令小结

  • 查看分支:git branch
  • 创建分支:git branch <name>
  • 切换分支:git checkout <name>或者 git switch <name>
  • 创建并切换分支:git checkout -b <name> 或者 git switch -c <name>
  • 合并某个分支:git merge <name>
  • 删除分支:git branch -d <name>

3.2 解决冲突

当我们创建一个feature1的分支,并修改了工作区文件的内容,然后add和commit到版本库

当我们切换为master分支的时候,也修改了工作区文件的内容,还add和commit到版本库

于是就出现这种情况:

                            HEAD││▼master││▼┌───┐┌─▶│   │
┌───┐    ┌───┐    ┌───┐  │  └───┘
│   │───▶│   │───▶│   │──┤
└───┘    └───┘    └───┘  │  ┌───┐└─▶│   │└───┘▲││feature1

这种我们使用分支合并的时候,无法快速合并,因为有分支冲突的存在,我们试看看:

$ git merge feature1
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

我们可以看看readme文件是什么情况

Git is a distributed version control system.
Git is free software distributed under the GPL.
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1

这种时候我们需要手动修改文件,然后再提交:

Git is distributed version control system
Git is free software distributed under the GPL
Creating a new branch is quick AND simple

再提交:

$ git add readme.txt 
$ git commit -m "conflict fixed"

现在的分支图变成了:

                                     HEAD││▼master││▼┌───┐    ┌───┐┌─▶│   │───▶│   │
┌───┐    ┌───┐    ┌───┐  │  └───┘    └───┘
│   │───▶│   │───▶│   │──┤             ▲
└───┘    └───┘    └───┘  │  ┌───┐      │└─▶│   │──────┘└───┘▲││feature1

我们可以使用git log来查看分支的合并情况:

$ git log --graph --pretty=oneline --abbrev-commit
*   55a2d4f (HEAD -> master) conflict fixed
|\
| * 67d9043 AND simple
* | 5baf2da & simple
|/
* 2d46c90 brancj test
* e5dfae5 remove test
* d9d1dc0 add test.txt
* bbacedf append GPL
* c440278 add distributed
* 6fe56b1 wrote a readme file

最后,删除feature1分支:

$ git branch -d feature1
Deleted branch feature1 (was 67d9043).

3.3 分支管理策略

我们通常在合并分支时,是有两种模式的

  • Fast forward 模式(快速合并):

    • 当你在合并分支时,Git 会尝试使用 Fast forward 模式,如果可能的话。
    • 如果两个分支的提交历史是线性的,也就是说,被合并的分支的所有提交都是基于当前分支的最新提交,那么 Git 可以简单地将指针(HEAD)向前移动,指向被合并分支的最新提交,从而完成合并。
    • 这种模式下,合并操作不会创建新的合并提交,因为历史是线性的,只需移动指针即可。
    bashCopy code# 在当前分支上合并名为 feature 的分支,使用 Fast forward 模式
    git merge feature
    
  • 普通合并(non-fast-forward)模式:

    • 如果两个分支的提交历史不是线性的,即存在分叉,Git 将执行普通合并。这种情况下,Git 会创建一个新的合并提交,将两个分支的修改整合在一起。
    • 普通合并会保留每个分支的提交历史,即使它们是并行的。
    bashCopy code# 在当前分支上合并名为 feature 的分支,强制执行普通合并
    git merge --no-ff feature
    

这两种模式我们在使用时,如何选择呢,我们可以来看看这两种模式下产生的提交历史:

  • Fast forward 模式(快速合并):

    • 没有删除分支:

      $ git log --graph --pretty=oneline --abbrev-commit
      * 62e7593 (HEAD -> master, dev) add dev
      *   55a2d4f conflict fixed
      |\
      | * 67d9043 AND simple
      * | 5baf2da & simple
      |/
      * 2d46c90 brancj test
      
    • 删除分支了:

      ![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=D%3A%5C%E5%AD%A6%E4%B9%A0%E4%B8%93%E4%B8%9A%E8%B5%84%E6%96%99%5Ctypora%E9%9B%86%E5%90%88%E5%9B%BE%E7%89%87%5CGit%E5%AD%A6%E4%B9%A0-%E5%BB%96%E9%9B%AA%E5%B3%B0%5C%E5%88%86%E6%94%AF%E5%90%88%E5%B9%B6%E5%86%B2%E7%AA%81%E5%BF%AB%E9%80%9F%E6%A8%A1%E5%BC%8F.png&pos_id=img-cdZuTlQN-1700291069221)$ git log --graph --pretty=oneline --abbrev-commit
      * 62e7593 (HEAD -> master) add dev
      *   55a2d4f conflict fixed
      |\
      | * 67d9043 AND simple
      * | 5baf2da & simple
      |/
      * 2d46c90 brancj test
      
    • 图解:

      在这里插入图片描述

  • 普通模式:

    • 没有删除分支:

      $ git log --graph --pretty=oneline --abbrev-commit
      *   16c6f76 (HEAD -> master) merge with no-ff
      |\
      | * d70cf45 (dev) add dev history
      |/
      * 62e7593 add dev
      *   55a2d4f conflict fixed
      |\
      | * 67d9043 AND simple
      * | 5baf2da & simple
      |/
      * 2d46c90 brancj test
      
    • 删除分支了:

      $ git log --graph --pretty=oneline --abbrev-commit
      *   16c6f76 (HEAD -> master) merge with no-ff
      |\
      | * d70cf45 add dev history
      |/
      * 62e7593 add dev
      *   55a2d4f conflict fixed
      |\
      | * 67d9043 AND simple
      * | 5baf2da & simple
      |/
      * 2d46c90 brancj test
      
    • 图解:
      在这里插入图片描述

⭐️ 总结

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样

在这里插入图片描述

合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并

3.4 Bug分支

软件开发中,bug就像家常便饭一样。有了bug就需要修复,在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。

当你接到一个修复一个代号101的bug的任务时,很自然地,你想创建一个分支issue-101来修复它,但是,等等,当前正在dev上进行的工作还没有提交:

$ git status
On branch dev
Changes not staged for commit:(use "git add <file>..." to update what will be committed)(use "git restore <file>..." to discard changes in working directory)modified:   readme.txtno changes added to commit (use "git add" and/or "git commit -a")

👨 我的误解:

我只是想切换到master分支,然后在master分支上面创建bug修改分支issue-101,我为什么不能直接切换呢?

🌴 答,在切换分支时,如果工作区有修改的话,与切换分支会有冲突的,切换分支会不成功,所以说,我们在切换分支时,应该保证切换分支之前的分支是干净的,什么叫分支干净呢?:一个分支是基于工作目录(working directory)的状态来维护的。当我们说"切换分支之前是干净的状态"时,意味着工作目录中没有未提交的更改。这包括对文件的修改、新文件的添加和已跟踪文件的删除。

所以我们要先搞清楚怎么把工作区目录整理干净

现在的问题是提交是可以解决问题,但是并不是你不想提交,而是工作只进行到一半,还没法提交,预计完成还需1天时间。但是,必须在两个小时内修复该bug,怎么办?

幸好,Git还提供了一个stash功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash
Saved working directory and index state WIP on dev: f52c633 add merge

现在,用git status查看工作区,就是干净的(除非有没有被Git管理的文件),因此可以放心地创建分支来修复bug。

接下来就是正常的切换master分支,然后创建issue-101分支,在issue-101分支修复bug,然后合并分支到master

🆕 开始修复bug:

首先确定要在哪个分支上修复bug,假定需要在master分支上修复,就从master创建临时分支:

$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.(use "git push" to publish your local commits)$ git checkout -b issue-101
Switched to a new branch 'issue-101'

现在修复bug,需要把“Git is free software …”改为“Git is a free software …”,然后提交:

$ git add readme.txt 
$ git commit -m "fix bug 101"
[issue-101 4c805e2] fix bug 1011 file changed, 1 insertion(+), 1 deletion(-)

修复完成后,切换到master分支,并完成合并,最后删除issue-101分支:

$ git switch master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 6 commits.(use "git push" to publish your local commits)$ git merge --no-ff -m "merged bug fix 101" issue-101
Merge made by the 'recursive' strategy.readme.txt | 2 +-1 file changed, 1 insertion(+), 1 deletion(-)

🔚 结束修复bug。

太棒了,原计划两个小时的bug修复只花了5分钟!现在,是时候接着回到dev分支干活了!

$ git switch dev
Switched to branch 'dev'$ git status
On branch dev
nothing to commit, working tree clean

工作区是干净的,刚才的工作现场存到哪去了?用git stash list命令看看:

$ git stash list
stash@{0}: WIP on dev: f52c633 add merge

工作现场还在,Git把stash内容存在某个地方了,但是需要恢复一下,有两个办法:

  • 一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;

  • 另一种方式是用git stash pop,恢复的同时把stash内容也删了:

$ git stash pop
On branch dev
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   hello.pyChanges not staged for commit:(use "git add <file>..." to update what will be committed)(use "git checkout -- <file>..." to discard changes in working directory)modified:   readme.txtDropped refs/stash@{0} (5d677e2ee266f39ea296182fb2354265b91b3b2a)

再用git stash list查看,就看不到任何stash内容了:

$ git stash list

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令:

$ git stash apply stash@{0}

🤔 在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。

那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?

不,我们可以有更简单的方法

同样的bug,要在dev上修复,我们只需要把4c805e2 fix bug 101这个提交所做的修改“复制”到dev分支。注意:我们只想复制4c805e2 fix bug 101这个提交所做的修改,并不是把整个master分支merge过来。

👨 我的经验:

🌴 就是一个问题,还是合并冲突的问题,如果我们把工作区给恢复之后,再去使用这个命令去合并分支会有错误:

$ git cherry-pick 3d22a83
error: Your local changes to the following files would be overwritten by merge:readme.txt
Please commit your changes or stash them before you merge.
Aborting
fatal: cherry-pick failed

依旧是工作区分支不干净,导致无法合并分支,所以我们可以再合并分支之前,使用git status命令查看工作区是否干净

所以,我们要先把工作区使用git stash存起来,然后在合并bug分支,在把工作区的内容给修复出来

对于合并冲突的情况有以下几种:

  • 同时修改同一行或同一片区域: 如果两个不同的分支都修改了同一行代码,或者在相邻的行上做了修改,Git 无法判断应该保留哪个修改。这就导致了冲突。
  • 删除与修改冲突: 一个分支删除了某个文件,而另一个分支对该文件进行了修改。在合并时,Git 不知道是应该保留修改还是应该保留删除。
  • 合并基的变更: 如果两个分支的合并基(共同的祖先 commit)上有修改,而这些修改分别被两个分支采用,那么在合并时就会发生冲突

🌴

为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:

$ git branch
* devmaster
$ git cherry-pick 4c805e2
[master 1d4b803] fix bug 1011 file changed, 1 insertion(+), 1 deletion(-)

Git自动给dev分支做了一次提交,注意这次提交的commit是1d4b803,它并不同于master的4c805e2,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。

⭐️ 小结

修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;

当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;

在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。

3.5 多人协作

我们在对远程仓库克隆时,实际上Git自动把本地的master分支和远程的master分支对应起来了,远程仓库的默认名称是origin

我们可以使用git remote来查看远程看的信息:

$ git remote
origin

或者,用git remote -v显式更详细的信息:

$ git remote -v
origin  git@github.com:michaelliao/learngit.git (fetch)
origin  git@github.com:michaelliao/learngit.git (push)

上面显示了可以抓取和推送的origin的地址。如果没有推送权限,就看不到push的地址

3.5.1 推送分支

推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:

$ git push origin master

如果要推送其他分支,比如dev,就改成:

$ git push origin dev

如果远程仓库不存在 dev 分支,Git 会尝试创建该分支并将本地的 dev 分支推送到远程仓库。

📝 小提醒:在Git中,分支完全可以在本地自己玩,是否推送到远程仓库,你可以有选择,要看需求的

3.5.2 抓取分支

在多人协作时,大家都会往master和dev分支上推送各自的修改

这种时候会有一种情况出现:A和B用户都分别从远程仓库拉取或者克隆了代码,这时候各自完成自己的代码工作,A用户先完成了,所以就把代码推送到远程仓库去了,这种时候B用户再继续推送到远程仓库会失败的,因为远程仓库的最新提交和B用户试图推送的提交有冲突

可以有以下解决方法:

  1. 首先,可以试图用git push origin <branch-name>推送自己的修改;
  2. 如果推送失败,则因为远程分支比你的本地更新,需要先用git pull试图合并;
  3. 如果合并有冲突,则解决冲突,解决的方法和分支管理中的解决冲突完全一样,并在本地提交;
  4. 没有冲突或者解决掉冲突后,再用git push origin <branch-name>推送就能成功!

产生的问题

有时候git pull时会出现这种情况:

$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.git pull <remote> <branch>If you wish to set tracking information for this branch you can do so with:git branch --set-upstream-to=origin/<branch> dev

git pull也失败了,原因是没有指定本地dev分支与远程origin/dev分支的链接,根据提示,设置devorigin/dev的链接:

$ git branch --set-upstream-to=origin/dev dev
Branch 'dev' set up to track remote branch 'dev' from 'origin'.

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

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

相关文章

双流网络论文精读笔记

精读视频&#xff1a;双流网络论文逐段精读【论文精读】_哔哩哔哩_bilibili Two-Stream Convolutional Networks for Action Recognition in Videos 传统的神经网络难以学习到物体的运动信息&#xff0c;双流网络则通过光流将物体运动信息抽取出来再传递给神经网络 给模型提供…

Golang 中的良好代码与糟糕代码

最近&#xff0c;有人要求我详细解释在 Golang 中什么是好的代码和坏的代码。我觉得这个练习非常有趣。实际上&#xff0c;足够有趣以至于我写了一篇关于这个话题的文章。为了说明我的回答&#xff0c;我选择了我在空中交通管理&#xff08;ATM&#xff09;领域遇到的一个具体用…

linux部署jar 常见问题

1.java -jar xxx.jar no main manifest attribute, in xxx.jar 一.no main manifest attribute, in xxx.jar 在pom.xml文件中加入&#xff1a; <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifac…

C语言每日一题(35)有效的括号

力扣网 20 有效的括号 题目描述 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右…

CountDownLatch和CyclicBarrier

JUC&#xff08;Java.util.concurrent&#xff09;是Java 5中引入的一个并发编程库&#xff0c;它包含了许多用于多线程处理的工具类和接口。JUC主要提供了以下特性&#xff1a; 线程池&#xff1a;线程池可以提高线程的使用效率&#xff0c;避免频繁地创建和销毁线程&#xff…

Kotlin学习——hello kotlin 函数function 变量 类 + 泛型 + 继承

Kotlin 是一门现代但已成熟的编程语言&#xff0c;旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作&#xff0c;并提供了多种方式在多个平台间复用代码&#xff0c;以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…

Docker Swarm总结(2/3)

目录 8、service 操作 8.1 task 伸缩 8.2 task 容错 8.3 服务删除 8.4 滚动更新 8.5 更新回滚 9、service 全局部署模式 9.1 环境变更 9.2 创建 service 9.3 task 伸缩 10、overlay 网络 10.1 测试环境 1搭建 10.2 overlay 网络概述 10.3 docker_gwbridg 网络基础…

【DevOps】Git 图文详解(八):后悔药 - 撤销变更

Git 图文详解&#xff08;八&#xff09;&#xff1a;后悔药 - 撤销变更 1.后悔指令 &#x1f525;2.回退版本 reset3.撤销提交 revert4.checkout / reset / revert 总结 发现写错了要回退怎么办&#xff1f;看看下面几种后悔指令吧&#xff01; ❓ 还没提交的怎么撤销&#x…

Visual Studio连接unity编辑器_unity基础开发教程

Visual Studio连接unity编辑器 问题描述解决方法意外情况 问题描述 当我们在unity编辑器中打开C#脚本的时候发现Visual Studio没有连接unity编辑器&#xff0c;在编写代码的时候也没有unity关键字的提醒。 简单来说就是敲代码没有代码提示。 解决方法 这时候需要在unity中进行…

Qt实现图片旋转的几种方式(全)

目录 一、用手搓&#xff08;QPainter&#xff09; 二、使用 QGraphicsView 和 QGraphicsPixmapItem 三、使用 QTransform 实现图像旋转 四、利用 OpenGL 实现旋转图像的效果有几种不同的方法&#xff0c;其中常见的包括&#xff1a; 手动旋转绘制&#xff1a; 使用 QPaint…

终端仿真软件 SecureCRT v9.4.2

SecureCRT是一款终端仿真软件&#xff0c;它提供了类似于Telnet和SSH等协议的远程访问功能。SecureCRT专门为网络管理员、系统管理员和其他需要保密访问网络设备的用户设计。 SecureCRT具有以下特点&#xff1a; 安全性&#xff1a;SecureCRT支持SSH1、SSH2、SSL和TLS等加密和…

7.HTML中列表标签

7.列表标签 7.1无序列表&#xff08;重点&#xff09; 表格是用来显示数据的&#xff0c;那么列表就是用来布局的。 列表最大的特点就是整齐&#xff0c;整洁&#xff0c;有序&#xff0c;他作为布局会更加自由和方便&#xff0c; 根据使用的情景不同&#xff0c;列表可分为三…

数字图像处理(冈萨雷斯)学习笔记

目录 一.机器视觉和计算机视觉二.图像处理基础1.什么是图像2.如何访问图像 三.图像仿射变换四.灰度变换 一.机器视觉和计算机视觉 机器视觉(Machine Vision,MV)和计算机视觉(Computer Vision&#xff0c;CV)的区别和联系&#xff1a; 机器视觉更注重广义图像信号(激光&#xff…

多柱汉诺塔问题

k柱汉诺塔 题目描述 汉诺塔&#xff08;Hanoi Tower&#xff09;&#xff0c;又称河内塔。 传说大梵天创造世界的时候做了三根金刚石柱子&#xff0c;按左、中、右排序。大梵天在左侧的柱子上&#xff0c;从下往上按照大小顺序摞着64片黄金圆盘&#xff0c;越靠下的圆盘越大。…

个人博客项目 - 测试报告

文章目录 一、项目背景二、测试报告功能测试1.编写测试用例2.登录测试3.编写文章测试4.查看文章测试5.删除文章测试7.注销登录测试 自动化测试性能测试1.VUG2.进行场景设计3.生成性能测试报告 总结 本文开始 一、项目背景 通过学习测试相关的知识&#xff0c;动手实践并测试一…

2023 年 亚太赛 APMCM ABC题 国际大学生数学建模挑战赛 |数学建模完整代码+建模过程全解全析

当大家面临着复杂的数学建模问题时&#xff0c;你是否曾经感到茫然无措&#xff1f;作为2022年美国大学生数学建模比赛的O奖得主&#xff0c;我为大家提供了一套优秀的解题思路&#xff0c;让你轻松应对各种难题。 以五一杯 A题为例子&#xff0c;以下是咱们做的一些想法呀&am…

【Vue】自定义指令

自定义指令 自定义指令就是自己定义的指令&#xff0c;是对 DOM 元素进行底层操作封装 ,程序化地控制 DOM&#xff0c;拓展额外的功能 全局定义 Vue.directive(指令名字, definition) 指令名&#xff1a;不包括v-前缀&#xff0c;使用时候包括v-&#xff0c;v-指令名defini…

CUTLASS 1.3.3中的 Volta884_h884gemm

CUTLASS 是 CUDA C 模板抽象的集合&#xff0c;用于在 CUDA 内的所有级别和规模上实现高性能矩阵-矩阵乘法 (GEMM) 和相关计算。它采用了类似于 cuBLAS 和 cuDNN 中实现的分层分解和数据移动策略。 CUTLASS 最新版本为3.3&#xff0c;相比1.3.3变动较大。然而重温一下1.3.3仍然…

Linux超简单部署个人博客

1 安装halo 1.1 切换到超级用户 sudo -i 1.2 新建halo文件夹 mkdir ~/halo && cd ~/halo 1.3 编辑docker-compose.yml文件 vim ~/halo/docker-compose.yml 英文输入法下&#xff0c;按 i version: "3"services:halo:image: halohub/halo:2.10container_…

2017年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版

文章目录 2017 级考研管理类联考数学真题解析一、问题求解&#xff08;本大题共 5 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09;下列每题给出 5 个选项中&#xff0c;只有一个是符合要求的&#xff0c;请在答题卡上将所选择的字母涂黑。真题&#xff08;2017-…