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

Git基础学习_p1

文章目录

  • 一、前言
  • 二、Git手册学习
    • 2.1 Git介绍&前置知识
    • 2.2 Git教程
      • 2.2.1 导入新项目
      • 2.2.2 做更改
      • 2.2.3 Git追踪内容而非文件
      • 2.2.4 查看项目历史
      • 2.2.5 管理分支
      • 🔺2.2.6 用Git来协同工作
      • 2.2.7 查看历史
  • 三、结尾


一、前言

Git相信大部分从事软件工作的人都听说过,甚至用过。
它是一款版本控制软件,用于管理项目迭代更新。
但大部分时候,你可能只是用过。就我个人而言,能想起来并知道其用途的,就下面几个简单命令,

git init
git pull
git add 
git commit
git push

还有git remotegit branch等命令会偶尔用一下,但使用时都得上网查询。
虽然大部分情况下,这已经够了。
但偶尔会出现一些特殊情况,可能是操作时序有误导致的冲突,可能是项目真的有损坏。

当然本文并不需要解决这些问题,只是想通过文档学习,对git流程、git基础有个更全面的了解。

我打算从git介绍、git简单命令、git文档教程入手,对git进行进一步学习。

二、Git手册学习

git,是一个傻瓜式的内容跟踪器(Linux内核的首席架构师,也是Git的主要开发者Linus Torvalds是这么说的)。

使用简介如下:

git [-v | --version] [-h | --help] [-C <path>] [-c <name>=<value>][--exec-path[=<path>]] [--html-path] [--man-path] [--info-path][-p|--paginate|-P|--no-pager] [--no-replace-objects] [--bare][--git-dir=<path>] [--work-tree=<path>] [--namespace=<name>][--config-env=<name>=<envvar>] <command> [<args>]

这一长串的命令选项,可以看出其功能之强大,虽然这也不是给一般人用的。不过也别被吓到,根据八二定理,大部分情况下你只需要用到几条简单命令即可,而且现在有许多带GUI的git,图形化操作相对简单许多(即使如此,你还是需要了解Git基本流程)。

2.1 Git介绍&前置知识

Git是一个快速、可扩展、分布式版本控制系统,具有异常丰富的命令集,提供高级操作以及对内部的完全访问。

文档建议从 gittutorial 开始学习,不过在这之前,还有一个非常重要的前置知识,那就是Git的二区一库。
二区是指,

  • 工作区:Wokespace,即受Git管控的项目目录/文件夹。

  • 暂存区:英文是 index 或 stage,也叫索引。一般存放在 .git 目录下的 index 文件中。

一库指,

  • 版本库:在工作区有一个隐藏目录 .git ,这个不算工作区,而是Git的版本库。

三者的简要关系如下,
在这里插入图片描述
可以看到Git的版本库(也就是Git初始化后,项目目录下多出来的那个.git文件夹)里有许多东西,其中最重要的就是暂存区stage(或者叫index),还有Git为我们自动创建的第一个分支master,以及指向master的指针叫HEAD。

有了以上简单认识,接下来正式进入Git教程。

注意
本小节内容是后来补的,故与后文可能没那么连贯。
但其内容对了解后文部分操作相当有用。

2.2 Git教程

gittutorial,这是文档中的章节名,顾名思义,它是git的教程介绍。
本节介绍如何将新项目导入git,对其修改,并将更改共享给其他开发人员。

首先,可以通过git log --graph等命令获取文档:

$ man git-log

$ git help log

后者会使用手册浏览器;(我装了的是某种GUI Git,在命令行中输入前者并不起作用,后者则会弹出说明文档)

$ 符号
$: (读法和dollar一样),
命令行中的 $ 符号是Linux系统下的用户提示符,表示当前用户是普通用户。
你在windows系统下安装git时,通常会装上vim命令行编辑器,也会看到该符号。

在进行操作前,最好向Git说明你的姓名和电子邮件地址。最简单的方法是:

$ git config --global user.name "Your Name Comes Here"
$ git config --global user.email "You@yourdomain.example.com"

2.2.1 导入新项目

假设你一开始有一个tarball(Linux下的打包工具) project.tar.gz 包。你可以把它放在Git版本控制路径之下(能用Git访问到),如下操作:

$ tar xzf project.tar.gz
$ cd project
$ git init

在windows下前两行通常可以省略,因为可以用图形化的解压工具(winrar/7zip等),解压完直接在解压出的文件夹里右键打开命令行工具(称为bash)并输入 git init 即可。

Git会回应:

Initialized empty Git repository in .git/

现在Git已经初始化了该文件夹,此时你可以看到该目录下多了一个名为 .git 的新文件夹。

接下来,告诉Git对当前目录下的所有文件进行快照(take a snapshot),用 git add命令( . 表示当前目录):

$ git add .

该快照现在存储在Git中称为 索引(index) 的暂存区域中。你可以用 git commit将索引的内容持久化到仓库(即版本库)中。
(索引相当于一个缓存区,所做修改先添加到索引中,然后再提交最终版。就像考试一样,你先在试卷和草稿纸上写写算算,然后在答题卡上填上答案,最后再提交;而不是试卷上写一个字提交一个字。从整个Git系统来看,这个比喻可能不那么恰当)

$ git commit

这会提示你输入提交信息(即对此次提交进行简要说明)。输入完后保存退出,就已将项目的第一个版本存储在Git中了(Vim中是这样的,GUI中则是点相应确认按钮)。

2.2.2 做更改

修改一些文件,然后将它们的更新内容添加到索引中:

$ git add file1 file2 file3

现在已经准备好了提交。
你可以使用 git diff--cached 选项来查看将要提交的内容。

$ git diff --cached

(若没有 –cached 选项, git diff 则显示你已经做出但尚未添加到索引中的更改)。你也可以使用 git status 来得到Git状态的简况:

–cached就是缓存,即查看索引的变化(确切讲是索引与上一次提交的不同);
不加就是查看工作区的变化,工作区相对于于索引的不同。

$ git status
On branch master
Changes to be commited:(use "git restore --staged<file>..." to unstage)modified: file1modified: file2modified: file3

若你需要进一步做更改,请立即进行,然后将新更改的内容添加到索引中。最后,用以下命令进行提交:

$ git commit

这将再次提示你输入描述更改的信息。然后记录项目的新版本。
或者,你可以使用以下命令,而无需预先运行 git add

$ git commit -a

它会自动关注任何修改过的(但非新的)文件,将它们添加到索引中,然后提交,所有这一切都在一步中完成。(顾名思义,它不会追踪到新文件,只会追踪更改过的老文件;若你有新建文件,则会被遗漏
在这里插入图片描述

提交消息的注释:虽然不是必须的,但最好以一个简短的(不超过50个字符)行来总结更改,然后空一行,进行更全面的描述,以开始提交消息。
提交消息中第一个空行之前的文本被视为提交标题,并且该标题在整个Git中使用。
例如, git-format-patch 将提交转换为电子邮件,并使用主题行上的标题和正文中的提交的其余部分。

2.2.3 Git追踪内容而非文件

许多版本控制系统提供了 add 命令,该命令会告诉系统开始跟踪新文件的更改。

Git的 add 命令功能更单一且更强大:

git add 作用于新建文件和新更改的文件,这两种情况下,它都会拍摄/记录给定文件的快照并将内容暂存在索引中,准备好包含在下一次提交中。(即新建一个文件也能被追踪到,并非只记录老文件的修改)

2.2.4 查看项目历史

你可以随时使用以下命令查看更改的历史记录:

$ git log

若你想要看每一步完整的差异,使用:

$ git log -p

通常,每次更改的概述对了解每一步很有用:

$ git log --stat --summary

2.2.5 管理分支

单个Git仓库可以维护多个开发分支。
使用以下命令可以创建一个名为 experimental 的新分支:

$ git branch experimental

若你此时运行

$ git branch

你会得到一份表示现有的分支列表:

  experimental
* master

experimental 分支是你刚刚创建的分支, master 分支是默认分支。 * 标记了你当前所在的分支;输入:

$ git switch experimental

以切换至 experimental 分支。现在编辑文件,提交更改,然后切换回主分支。

(edit file)
$ git commit -a
$ git switch master

检查你刚刚所做的更改是否不再可见,因为它是在 experimental 分支上进行的,且你现在回到了主分支上。

题外话
以前用过部署在远端的git仓库,觉得切换分支后,内容发生变化是一件稀松平常的事。
但这次在本地试验后,还是觉得很震撼,就在一个文件夹下,我敲一条切换分支的命令,这个文件夹下的文件就变了(惊叹的不是这样的功能实现,而是功能设计)。
在这里插入图片描述

现在你可以在 master 分支上做一些不同的更改:

(edit file)
$ git commit -a

此时,两个分支已经有所不同了,每个分支都做了不同的更改。若要合并 experimental 中的更改,请运行:

git merge experimental

如果更改没有冲突,就合并完成。若存在冲突,则在有问题的文件中留下标记,以显示冲突。
git diff 会显示冲突内容。若你编辑文件,解决完了冲突。
可用 git commit -a 提交合并结果。
最后,用 gitk 会出现一个友好的图形界面来显示历史记录。
在这里插入图片描述
此时,你可以使用以下命令来删除 experimental 分支:

$ git branch -d experimental

该命令要确保 experimental 分支的更改已经完全在当前分支中了。
在这里插入图片描述
若你在一条名为 crazy-idea 的分支上开发了一阵子,但又不想要这条分支了,你也可以随时用以下命令删除分支:

$ git branch -D crazy-idea

分支很容易获取到,所以在分支上开发新功能是尝试新事物的好方法(即fork新的分支,在新分支上开发功能,开发完毕后合并以扩展主分支)。

🔺2.2.6 用Git来协同工作

假设 Alice 已在 /home/alice/project 中用Git仓库开启了一个新项目,且在同一台机器上的Bob也想给该项目贡献代码。

Bob可以用以下命令:

bob$ git clone /home/alice/project myrepo

这会创建一个新目录 myrepo ,其中包含 Alice仓库的一份克隆。克隆体与原始项目是平等的,拥有自己的原始项目历史记录副本(即Git也会对该克隆体管理,对更改做历史记录)。

接着,Bob会做一些更改,并提交:

(edit files)
bob$ git commit -a
(repeat as necessary)

当他准备好后,他会告诉 Alice 从 /home/bob/myrepo 拉取(pull)仓库的更改。Alice 需要这样做:

alice$ cd /home/alice/project
alice$ git pull /home/bob/myrepo master

👆 basic
这之前的内容应该属于常用且基础的,这之后的内容算是进阶。
👇 advanced


这样就将Bob master 分支的更改合并到 Alice的当前分支。若Alice在此期间也做了一些自己的变更,那么她可能需要手动解决冲突。(简单讲就是Alice和Bob都对某些文件做了更改,Alice合并Bob的分支后这部分代码就会冲突,就需要人工判断确定最终改动)。

因此, pull 命令执行了两个操作:从远程分支获取更改(fetch),然后将它们合并到当前分支中(merge)

一般来讲,Alice会在启动 pull 前,提交她的本地更改。
但若在Bob克隆分支后,Bob的工作与Alice所做的内容冲突,Alice将使用她的 工作树 和索引来解决冲突,且已有的本地更改会干扰冲突解决过程(Git仍将执行获取,但会拒绝合并)——Alice将不得不以某种方式摆脱本地更改的干扰,并在该操作后再次 pull

Alice可以使用 fetch 命令先窥视Bob所作的事情而不首先合并。这允许Alice使用特殊标记 FETCH_HEAD 检查Bob所做的事情,以确定Bob的分支上是否有值得拉取的东西,就像这样:

alice$ git fetch /home/bob/myrepo master
alice$ git log -p HEAD..FETCH_HEAD

HEADFETCH_HEAD
1 HEAD
如果你和我一样,在这之前没有系统地学习过Git。
那看到HEAD和FETCH_HEAD应该会很头疼,所以这里我对这两者做简单介绍。
HEAD是Git中非常重要的概念,你可以将它理解为指针或引用(就像C/C++中的指针一样,数据结构中的头指针),它可以指向任意一个节点,并且指向的节点始终为当前工作目录。换句话说,当前工作目录就是HEAD指向的节点,即它是对当前 Commit-ID 的引用。
为了更好地理解HEAD及相关操作,再介绍一下什么情况下会影响HEAD。

  • 使用 git commit 时,HEAD会跟着移动,并指向当前分支的最新 Commit-ID。
  • 使用 git checkout 时,HEAD会跟着移动,并指向对应分支的最新 Commit-ID。
  • 使用 git reset 时,HEAD会跟着移动,并指向对应分支的指定 Commit-ID。


2 FETCH_HEAD
FETCH_HEAD 是一个版本链接,记录在本地的一个文件中,指向目前已经从远程仓库取下来的分支的末端版本。
git fetch 就会将远程仓库的最新版本获取到本地,但不会 merge

即使Alice未提交本地更改,该操作也是安全的。范围标记 HEAD…FETCH_HEAD 意思是显示从 FETCH_HEAD 可达的所有内容,但排除可从 HEAD 到达的内容(前不达后达)。

Alice已经知道导致她当前状态( HEAD )的所有内容,并使用该命令查看 Bob 在 Bob所在状态(即 FETCH_HEAD )中她没有看到的内容。

若Alice想可视化Bob在历史分叉后做了什么,可用以下命令:

$ gitk HEAD..FETCH_HEAD

这使用了我们之前在 git log 中看到的两点范围表示法。Alice可能想查看两人分支后都做了什么,她可以使用三点的形式来代替两点:

$ gitk HEAD...FETCH_HEAD

这表示显示从任一者可访问的所有内容,但排除从两者均可访问的任何内容。

注意,该范围标记法也可以用在 gitkgit log 中。

在查看了 Bob 做了什么后,若没有紧急情况,Alice 也许会继续工作而不拉取 Bob的更改。若Bob的历史记录中确实有 Alice 立即需要的内容,那么Alice可以选择先藏匿/储备(stash)她正在进行的工作,进行一次 pull ,最后再将自己的工作内容在新产生的内容之上进行修改。

当你在一个紧密联系的小团队中工作时,反复与同一个仓库进行交互很正常。通过给远程仓库定义简写(shorthand,缩略名),可以使其更简洁:

alice$ git remote add bob /home/bob/myrepo

这样,Alice 可以使用 git fetch 命令单独执行 pull 操作的第一部分,而无需将它们与自己的分支合并:

alice$ git fetch bob

与普通写法不同,当 Alice 使用 git remote 设置的远程仓库简写从 Bob 处获取时,获取的内容将存储在远程跟踪分支(remote-tracking branch)中,在本例中为 bob/master 。所以在这之后:

alice$ git log -p master ..bob/master

显示 Bob 自 Alice 的 master 分支 fork 以来所作的所有更改的列表(显示bob/master可达的路径,排除master可达路径)。

检查这些更改后, Alice 可以将这些更改合并到她的 master 分支中:

alice$ git merge bob/master

该合并也可通过从她自己的远程跟踪分支中拉取来完成,就像这样:

alice$ git pull . remotes/bob/master

注意, git pull 总是合并到当前分支,无论命令行给出了什么。
之后,Bob 可以使用 Alice 的最新更改来更新他的仓库:

bob$ git pull

注意,他并不需要提供 Alice 仓库的路径;当 Bob 克隆 Alice 的存储库时, Git 将她的仓库位置存储在了仓库配置中,并且将该位置用于 pull 操作:

bob$ git config --get remote.origin.url
/home/alice/project

(使用 git config -l 可以看到 git clone 创建的完整配置,git config -l 手册解释了每个选项的含义)

Git还以 origin/master 名称保留了 Alice master 分支的原始副本:

bob$ git branch -rorigin/master

如果 Bob 后来决定在不同的主机上工作,他仍然可以使用 ssh 协议执行 clone 和 pull :

bob$ git clone alice.org:/home/alice/project myrepo

或者,Git 有本地协议,或者可以使用 http;详情参阅 git-pull(1)

Git也可以在类似 CVS 的模式下使用,具有一个中央仓库,各个用户都可以将更改推送到其中。详情参阅 git-push(1)gitcvs-migration(7)

2.2.7 查看历史

Git 的历史记录表现为一系列相关联的提交。我们已经看到 git log 可以列出这些提交。请注意,每个 git log 项的第一行还给出了提交的名称(那串长长的英文字符与数字的组合字串):

在这里插入图片描述
可以将该名称给到 git show 以显示该次提交的细节:
在这里插入图片描述
也有一些其他的方法引用提交。你可以使用名称的任何初始部分(得足够长)来唯一标识提交:

在这里插入图片描述
通常,每个提交都会有一个 提交,它指向项目的前一个状态:

$ git show HEAD^ 	# 查看HEAD的父亲
$ git show HEAD^^ 	# 查看HEAD的祖父
$ git show HEAD~4	# 查看HEAD的曾曾祖父

注意,合并(merge)类型的提交可能会有多于一个的父亲:

$ git show HEAD^1 # 显示HEAD的第一个父亲(同HEAD^)
$ git show HEAD^2 # 显示HEAD的第二个父亲

你也可以自己给提交命名:

$ git tag v2.5 709d387fbd12

通过名称 v2.5 来引用 709d387fbd12 。若你打算与其他人共享此名称(例如,确认版本发布),你应该创建一个“标签,tag”对象,并对其进行签名。

任何需要知道提交的Git命令都可以采用这些名称中的任何一个。例如:

$ git diff v2.5 HEAD 		# 比较当前HEAD 和 v2.5
$ git branch stable v2.5 	# 基于v2.5开启一条名为stable分支
$ git reset --hard HEAD^ 	# 将当前分支和工作目录回滚至 HEAD^ 的状态

特别小心第三条命令:它除了会丢失工作目录的更改外,还会删除此分支中所有之后的提交(类似于回档)。若该分支是包含这些提交的唯一分支,那么它们将会丢失。另外,不要在其他开发人员从中 pull 的公开可见的分支上使用 git reset,因为这会迫使其他开发人员进行不必要的合并以清除历史。若你需要撤销已经推送(push)的更改,请用 git revert

git grep 命令可以在项目的任何版本中搜索字符串,因此:

$ git grep "hello" v2.5

会搜索 v2.5 中所有出现的 “hello” 。
若省略提交名称, git grep 将搜索它在当前目录中管理的任何文件。因此:

$ git grep "hello"

是一种仅搜索Git跟踪的文件的快速方法。

许多Git命令还接受提交集(即一次多个),可以通过多种方式来指定这些提交。以下是 git log 的一些示例:

$ git log v2.5..v2.6		# v2.5和v2.6之间的提交,结合前面的HEAD..FETCH_HEAD来看# 就很清晰,能看到v2.6的路径但排除v2.5的路径,所以就是它们之间的
$ git log v2.5..			# 自v2.5开始的提交
$ git log --since="2 weeks ago"	# 过去的两周提交
$ git log v2.5.. Makefile	# 自v2.5开始的 Makefile的提交

你也可以给 git log 一个提交的范围,在该范围中第一个参数不一定为第二个参数的祖先;例如,如果分支"stable" 和 “master” 的尖端从一个共同的提交中分离,那么:

$ git log stable..master

会列出 master 分支所做的提交,而没有 stable 分支做的提交。而:

$ git log master..stable

会列出 stable 分支所做的提交,而没有 master 分支的提交。

git log 命令有一个缺点:它必须以列表的形式呈现提交。当历史上有开发线分开,然后合并在一起时, git log 显示这些提交的顺序就没有意义了。

大多数有多个贡献者的项目(如Linux内核或Git本身)都有频繁的合并,而gitk在可视化它们的历史记录方面做的更好。例如:

$ gitk --since="2 weeks ago" drivers/

允许你浏览最近两周的修改了 drivers 目录下的文件提交。(注意:你可以通过按住control键同时按"-“或”+"来调整gitk的字体)

最后,大多数接受文件名的命令允许你在任何文件名前添加一个提交,以指定文件的版本:

$ git diff v2.5:Makefile HEAD:Makefile.in

你也可以使用 git show 来查看文件:

$ git show v2.5:Makefile

三、结尾

本文大部分是gittutorial中的内容,整文偏应用向。
看完该教程,对于你项目的基本修订控制应该是足够了。
然而,为了充分理解Git的深度与功能,本文还有p2,p2重点对对象数据库和索引文件做介绍(本文开头处也提到过,它们是git中简单而重要的思想)。

相关文章:

Git基础学习_p1

文章目录 一、前言二、Git手册学习2.1 Git介绍&前置知识2.2 Git教程2.2.1 导入新项目2.2.2 做更改2.2.3 Git追踪内容而非文件2.2.4 查看项目历史2.2.5 管理分支&#x1f53a;2.2.6 用Git来协同工作2.2.7 查看历史 三、结尾 一、前言 Git相信大部分从事软件工作的人都听说过…...

4.Redis事务

4.Redis事务 文章目录 4.Redis事务是什么&#xff1f;能干嘛&#xff1f;Redis 事务 VS 数据库事务命令总结 是什么&#xff1f; 可以一次执行多个命令&#xff0c;本质是一组命令的集合。一个事务中的所有命令都会序列化&#xff0c;按顺序地串行化执行而不会被其它命令插入&…...

golang 图片加水印

需求&#xff1a; 1&#xff0c;员工签到图片加水印 2&#xff0c;水印文字需要有半透明的底色&#xff0c;避免水印看不清 3&#xff0c;图片宽设置在600&#xff0c;小于600或者大于600都需要等比例修改图片的高度&#xff0c;保持水印在图片中的大小和位置 4&#xff0c;处理…...

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set问题解决方案

sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set问题解决方案 当我们使用sudo su切换权限时提示错误&#xff1a; sudo: /usr/bin/sudo must be owned by uid 0 and have the setuid bit set该错误出现原因&#xff1a;是因为/usr/bin/sudo的权限被…...

提升效率:使用注解实现精简而高效的Spring开发

IOC/DI注解开发 1.0 环境准备1.1 注解开发定义bean步骤1:删除原XML配置步骤2:Dao上添加注解步骤3:配置Spring的注解包扫描步骤4&#xff1a;运行程序步骤5:Service上添加注解步骤6:运行程序知识点1:Component等 1.2 纯注解开发模式1.2.1 思路分析1.2.2 实现步骤步骤1:创建配置类…...

全面好用的setting.xml配置

<?xml version"1.0" encoding"UTF-8"?> <!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information…...

八股文打卡day14——计算机网络(14)

面试题&#xff1a;TCP的Keepalive和HTTP的Keep-Alive是一个东西吗&#xff1f; 我的回答&#xff1a; TCP的Keepalive 1.位于TCP/IP模型的传输层。 2.是用来判活的。客户端会向服务器发送一个Keepalive包来判断&#xff0c;这个TCP连接是否还存活着。 HTTP中的Keep-Alive 1.…...

NCNN环境部署及yolov5pt转ncnn模型转换推理

该内容还未完整&#xff0c;笔记内容&#xff0c;持续补充。 〇开发环境版本 vs2022 cmake3.21.1 ncnn20231027发行版 yolov5s v6.2 vunlkan1.2.198.1 Protobuf3.20.0 Opencv3.4.1 一、模型转换 yolov5s v6.2训练的pt模型&#xff0c;直接导出tourchscript&#xff0c…...

selenium模块有哪些用途?

Selenium模块是一个用于Web应用程序测试的模块&#xff0c;具有多种示例用法。以下是一些示例&#xff1a; 1.打开网页并执行一些基本操作&#xff0c;如点击按钮、输入文本等。 定位网页元素并执行操作&#xff0c;例如使用 find_element 方法查找单个元素&#xff0c;使用 f…...

精品Nodejs实现的校园疫情防控管理系统的设计与实现健康打卡

《[含文档PPT源码等]精品Nodejs实现的校园疫情防控管理系统的设计与实现[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Win…...

爬虫工作量由小到大的思维转变---<第三十五章 Scrapy 的scrapyd+Gerapy 部署爬虫项目>

前言: 项目框架没有问题大家布好了的话,接着我们就开始部署scrapy项目(没搭好架子的话,看我上文爬虫工作量由小到大的思维转变---&#xff1c;第三十四章 Scrapy 的部署scrapydGerapy&#xff1e;-CSDN博客) 正文: 1.创建主机: 首先gerapy的架子,就相当于部署服务器上的;所以…...

python测试工具: 实现数据源自动核对

测试业务需要&#xff1a; 现有A系统作为下游数据系统&#xff0c;上游系统有A1,A2,A3... 需要将A1,A2,A3...的数据达到某条件后&#xff08;比如&#xff1a;A1系统销售单提交出库成功&#xff09;自动触发MQ然后再经过数据清洗落到A系统&#xff0c;并将清洗后数据通过特定…...

要学习openfoam,c++需要掌握到什么程度?

要学习openfoam&#xff0c;c需要掌握到什么程度&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「c的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&…...

web一些实验代码——Servlet请求与响应

实验4&#xff1a;Servlet请求与响应 1、在页面输入学生学号&#xff0c;从数据库中查询学生信息并显示。 &#xff08;1&#xff09;启动MySQL数据库服务&#xff0c;新建数据库&#xff0c;将student.sql文件导入到新建数据库&#xff08;建立表&#xff0c;并插入3条数据&…...

GPT系列概述

OPENAI做的东西 Openai老窝在爱荷华州&#xff0c;微软投资的数据中心 万物皆可GPT下咱们要失业了&#xff1f; 但是世界不仅仅是GPT GPT其实也只是冰山一角&#xff0c;2022年每4天就有一个大型模型问世 GPT历史时刻 GPT-1 带回到2018年的NLP 所有下游任务都需要微调&#x…...

基于遗传算法的集装箱吊装优化,基于遗传算法的集装箱装卸优化

目录 背影 遗传算法的原理及步骤 基本定义 编码方式 适应度函数 运算过程 代码 结果分析 完整代码下载: 基于遗传算法的集装箱吊装优化,基于遗传算法的集装箱装卸优化(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88674652 背影 …...

postgreSQL单机部署

一、环境准备 架构操作系统IP主机名PG版本端口磁盘空间内存CPUsingle 单机centos7192.168.1.10pgserver01PostgreSQL 14.7543350G4G2 1、官网下载源码包 https://www.postgresql.org/download/2、操作系统参数修改 2.1 sysctl.conf配置 vi /etc/sysctl.conf kernel.sysrq …...

思维逻辑题3

题目1&#xff1a; 如果所有A都是B&#xff0c;且某个对象是B&#xff0c;那么它一定是A吗&#xff1f; 答案&#xff1a;不一定&#xff0c;尽管所有A都是B&#xff0c;但还有其他的对象可能也是B。 题目2&#xff1a; 如果A和B都是真&#xff0c;那么以下哪个选项是真&…...

强大的音乐乐谱控件库

2023 Conmajia, 2018 Ajcek84 SN: 23C.1 本中文翻译已获原作者首肯。 简介 PSAM 控件库——波兰音乐文档系统——是用于显示、排版乐谱的强大 WinForm 库&#xff0c;包含用于绘制乐谱的名为 IncipitViewer 控件&#xff0c;乐谱内容可以从 MusicXml 文件读取&#xff0c;或者…...

数据库——简单查询复杂查询

1.实验内容及原理 1. 在 Windows 系统中安装 VMWare 虚拟机&#xff0c;在 VMWare 中安装 Ubuntu 系统,并在 Ubuntu 中搭建 LAMP 实验环境。 2. 使用 MySQL 进行一些基本操作&#xff1a; &#xff08;1&#xff09;登录 MySQL&#xff0c;在 MySQL 中创建用户&#xff0c;…...

java虚拟机内存管理

文章目录 概要一、jdk7与jdk8内存结构的差异二、程序计数器三、虚拟机栈3.1 什么是虚拟机栈3.2 什么是栈帧3.3 栈帧的组成 四、本地方法栈五、堆5.1 堆的特点5.2 堆的结构5.3 堆的参数配置 六、方法区6.1 方法区结构6.2 运行时常量池 七、元空间 概要 根据 JVM 规范&#xff0…...

Hive实战:词频统计

文章目录 一、实战概述二、提出任务三、完成任务&#xff08;一&#xff09;准备数据文件1、在虚拟机上创建文本文件2、将文本文件上传到HDFS指定目录 &#xff08;二&#xff09;实现步骤1、启动Hive Metastore服务2、启动Hive客户端3、基于HDFS文件创建外部表4、查询单词表&a…...

FairyGUI-Cocos Creator官方Demo源码解读

博主在学习Cocos Creator的时候&#xff0c;发现了一款免费的UI编辑器FairyGUI。这款编辑器的能力十分强大&#xff0c;但是网上的学习资源比较少&#xff0c;坑比较多&#xff0c;主要学习方式就是阅读官方文档和练习官方Demo。这里博主进行官方Demo的解读。 从gitee上克隆项目…...

LabVIEW利用视觉引导机开发器人精准抓取

LabVIEW利用视觉引导机开发器人精准抓取 本项目利用单目视觉技术指导多关节机器人精确抓取三维物体的技术。通过改进传统的相机标定方法&#xff0c;结合LabVIEW平台的Vision Development和Vision Builder forAutomated Inspection组件&#xff0c;优化了摄像系统的标定过程&a…...

【Linux】指令(本人使用比较少的)——笔记(持续更新)

文章目录 ps -axj&#xff1a;查看进程ps -aL&#xff1a;查看线程echo $?&#xff1a;查看最近程序的退出码jobs&#xff1a;查看后台运行的线程组fd 任务号&#xff1a;将后台任务提到前台bg 任务号&#xff1a;将暂停的后台程序重启netstat -nltp&#xff1a;查看服务及监听…...

032 - STM32学习笔记 - TIM基本定时器(一) - 定时器基本知识

032 - STM32学习笔记 - TIM定时器&#xff08;一&#xff09; - 基本定时器知识 这节开始学习一下TIM定时器功能&#xff0c;从字面意思上理解&#xff0c;定时器的基本功能就是用来定时&#xff0c;与定时器相结合&#xff0c;可以实现一些周期性的数据发送、采集等功能&#…...

轮廓检测与处理

轮廓检测 先将图像转换成二值 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度图 ret, thresh cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY) # 变为二值&#xff0c;大于127置为255&#xff0c;小于100置为0.使用cv2.findContours(thresh, cv2.RETR_TREE, cv2.…...

跟着LearnOpenGL学习11--材质

文章目录 一、材质二、设置材质三、光的属性四、不同的光源颜色 一、材质 在现实世界里&#xff0c;每个物体会对光产生不同的反应。 比如&#xff0c;钢制物体看起来通常会比陶土花瓶更闪闪发光&#xff0c;一个木头箱子也不会与一个钢制箱子反射同样程度的光。 有些物体反…...

Java guava partition方法拆分集合自定义集合拆分方法

日常开发中&#xff0c;经常遇到拆分集合处理的场景&#xff0c;现在记录2中拆分集合的方法。 1. 使用Guava包提供的集合操作工具栏 Lists.partition()方法拆分 首先&#xff0c;引入maven依赖 <dependency><groupId>com.google.guava</groupId><artifa…...

GLTF编辑器-位移贴图实现破碎的路面

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 位移贴图是一种可以用于增加模型细节和形状的贴图。它能够在渲染时针…...

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测

多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-BiLSTM麻雀算法优化双向长短期记忆神经网络多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.MATLAB实现SSA-BiLSTM麻雀算法优化…...

docker安装Nacos和Rabbitmq

一、安装Nacos 首先需要拉取对应的镜像文件&#xff1a;&#xff08;切换版本加上对应版本号即可&#xff0c;默认最新版&#xff09; docker pull nacos/nacos-server 接着挂载目录&#xff1a; mkdir -p /mydata/nacos/logs/ #新建logs目录 mkdir -p …...

Android MVC 写法

前言 Model&#xff1a;负责数据逻辑 View&#xff1a;负责视图逻辑 Controller&#xff1a;负责业务逻辑 持有关系&#xff1a; 1、View 持有 Controller 2、Controller 持有 Model 3、Model 持有 View 辅助工具&#xff1a;ViewBinding 执行流程&#xff1a;View >…...

网络层解读

基本介绍 概述 当两台主机之间的距离较远(如相隔几十或几百公里&#xff0c;甚至几千公里)时&#xff0c;就需要另一种结构的网络&#xff0c;即广域网。广域网尚无严格的定义。通常是指覆盖范围很广(远超过一个城市的范围)的长距离的单个网络。它由一些结点交换机以及连接这些…...

js for和forEach 跳出循环 替代方案

1 for循环跳出 for(let i0;i<10;i){if(i5){break;}console.log(i) }在函数中也可以return跳出循环 function fn(){for(let i0;i<10;i){if(i5){return;}console.log(i)} } fn()for ... of效果同上 2 forEach循环跳出 break会报错 [1,2,3,4,5,6,7,8,9,10].forEach(i>…...

如何使用ArcGIS Pro自动矢量化建筑

相信你在使用ArcGIS Pro的时候已经发现了一个问题&#xff0c;那就是ArcGIS Pro没有ArcScan&#xff0c;在ArcGIS Pro中&#xff0c;Esri确实已经移除了ArcScan&#xff0c;没有了ArcScan我们如何自动矢量化地图&#xff0c;从地图中提取建筑等要素呢&#xff0c;这里为大家介绍…...

交互式笔记Jupyter Notebook本地部署并实现公网远程访问内网服务器

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1.前言2.Jupyter Notebook的安装2.1 Jupyter Notebook下…...

41.坑王驾到第七期:uniapp开发微信小程序引用组件时报错!

一、错误再现 页面login引用了一个组件register&#xff0c;运行至小程序开发工具报错。 xxx.js 已被代码依赖分析忽略&#xff0c;无法被其他模块引用。 二、解决办法 在微信小程序的配置文件中找到setting节点&#xff0c;增加两个配置项。 “ignoreDevUnusedFiles”: fa…...

挂载与解挂载

一. 挂载 1.什么是挂载 将系统中的文件夹和磁盘做上关联&#xff0c;使用文件夹等于使用磁盘 2.mount 2.1 格式 mount [ -t 类型 ] 存储设备 挂载点目录 mount -o loop ISO镜像文件 挂载点目录 注意&#xff1a;指明要挂载的设备 设备文件&#xff1a;例如:/dev/sda5 卷…...

UGUI Panel的显示和隐藏优化

unity UI如何开启&#xff08;显示&#xff09;或者关闭&#xff08;隐藏&#xff09;Panel界面&#xff0c;相信大家都是知道的&#xff0c;但是如何做最好呢&#xff1f; 可能大家一般开启/关闭界面的方法就是直接SetActive吧。这样做通常是可以的&#xff0c;简答快速地解决…...

Linux:多文件编辑

多文件编辑 1.使用vim编辑多个文件 编辑多个文件有两种形式&#xff0c;一种是在进入vim前使用的参数就是多个文件。另一种就是进入vim后再编辑其他的文件。 同时创建两个新文件并编辑 $ vim 1.txt 2.txt默认进入1.txt文件的编辑界面 命令行模式下输入:n编辑2.txt文件&…...

模式识别与机器学习-概率图模型

模式识别与机器学习-概率图模型 概率图模型三大基本问题表示推断学习 有向概率图模型例子三种经典的图 HMMViterbi 算法 谨以此博客作为复习期间的记录 概率图模型三大基本问题 概率图模型通常涉及三个基本问题&#xff0c;即表示&#xff08;Representation&#xff09;、推…...

RK3566 ANDROID 11 平台上适配移远EC200A

适配前理清楚一下调试的流程: 1.该模块为LGA封装,需要控制上电时序模块才能正常上电工作: 2.模块供电正常后,读取模组的PID 和VID 并将其ID添加到内核里面,确保USB转Serial端口能够正常生成: 3.生成ttyUSB0~ttyUSB2端口后,确保rild进程正常启动,能够正常加载ril库; …...

存算分离降本增效,StarRocks 助力聚水潭 SaaS 业务服务化升级

作者&#xff1a;聚水潭数据研发负责人 溪竹 聚水潭是中国领先的 SaaS 软件服务商&#xff0c;核心产品是电商 ERP&#xff0c;协同350余家电商平台&#xff0c;为商家提供综合的信息化、数字化解决方案。公司是偏线下商家侧的 toB 服务商&#xff0c;员工人数超过3500&#xf…...

Linux 内核学习笔记: hlist 的理解

前言 最近阅读 Linux 内核时&#xff0c;遇到了 hlist&#xff0c;这个 hlist 用起来像是普通的链表&#xff0c;但是为何使用 hlist&#xff0c;hlist 是怎么工作的&#xff1f; 相关代码 hlist_add_head(&clk->clks_node, &core->clks); /*** clk_core_link_…...

几种设计模式介绍

前言 设计模式是一种用于解决软件开发中常见问题的通用解决方案&#xff0c;它可以提高代码的可读性、可维护性和可复用性。前端开发中也有很多应用设计模式的场景&#xff0c;比如处理异步操作、优化性能、封装复杂逻辑等。 前端开发中常见的设计模式有以下几种&#xff1a; …...

拓展操作(三) jenkins迁移到另一个机器

让清单成为一种习惯 互联网时代的变革,不再是简单的开发部署上线,持续,正确,安全地把事情做好尤其重要;把事情做好的前提是做一个可量化可执行的清单,让工程师就可以操作的清单而不是专家才能操作: 设定检查点 根据节点执行检查程序操作确认或边读边做 二者选其一不要太…...

重定向和转发的区别

重定向 1、定义 用户通过浏览器发送一个请求&#xff0c;Tomcat服务器接收这个请求&#xff0c;会给浏览器发送一个状态码302&#xff0c;并设置一个重定向的路径&#xff0c;浏览器如果接收到了这个302的状态码以后&#xff0c;就会去自动加载服务器设置的路径 一个页面跳转…...

基于ElementUI二次封装弹窗组件

效果&#xff1a; 一、自定义内容类型弹窗 <!-- title&#xff1a;对话框的标题confirmLoading&#xff1a;当前是否处于提交中titleCenter&#xff1a;对话框标题居中方式footerCenter&#xff1a;底部按钮的对其方式visible&#xff1a;是否显示弹窗width&#xff1a;设置…...

linux cat命令改变功能显示当前文件行号

linux的cat命令使用-n显示多个文件行号时&#xff0c;行号是累加的&#xff0c;不是到了新文件就重新计数。这样满足不了我的需求。如果到了新文件能够重新计数&#xff0c;就能使用-nf&#xff08;在上一篇-f显示文件名功能的基础上&#xff09;加| grep xxx&#xff0c;既能直…...