[ 摘自:廖雪峰的官方网站Git教程 ]

文章目录

  • 前言
  • 1 Git简介
    • 1.1 Git的产生
    • 1.2 集中式和分布式版本控制系统的区别
  • 2 安装Git
    • 2.1 Linux环境安装Git
    • 2.2 Windows环境安装Git
  • 3 创建版本库
    • 3.1 初始化仓库
    • 3.2 添加文件到Git仓库
  • 4 时光机穿梭
    • 4.1 查看仓库状态和文件修改内容
    • 4.2 版本回退
    • 4.3 工作区和暂存区
    • 4.4 管理修改
    • 4.5 撤销修改
    • 4.6 删除文件
  • 5 远程仓库
    • 5.1 本地仓库和Github之间的传输设置
    • 5.2 添加远程库
    • 5.3 从远程库克隆
  • 6 分支管理
    • 6.1 创建与合并分支
    • 6.2 解决合并冲突
    • 6.3 分支策略
    • 6.4 Bug分支
    • 6.5 feature分支
    • 6.6 多人协作
      • 6.6.1 推送分支
      • 6.6.2 抓取分支
      • 6.6.3 多人协作的工作模式
    • 6.7 Rebase
  • 7 标签管理
    • 7.1 创建标签
    • 7.2 操作标签
  • 8 使用GitHub(参与开源项目)
  • 9 使用码云
  • 10 自定义Git
    • 10.1 忽略特殊文件
    • 10.2 配置别名
    • 10.3 搭建Git服务器
  • 11 使用Source Tree

前言

该系列文章摘录于廖雪峰的官方网站《Git教程》,用于记录学习的知识点及便于日后查询和复习,如有侵权请联系我进行删除或修改。

1 Git简介

1.1 Git的产生

Linus反对使用集中式的版本软件CVS和SVN,后面采用商业版本控制软件BitKeeper,BitMover公司授权Linux社区免费使用该软件。但是由于Linux社区的Andrew试图破解BitKeeper的协议,被发现后BitMover公司收回免费使用权。故Linux之父Linus花了两周用C语言写出Git。

1.2 集中式和分布式版本控制系统的区别

集中式的版本库是存在中央服务器的,使用时需要从服务器取得最新的版本,修改之后再上传到服务器。最大的缺点是必须联网才能工作,若在局域网内还好,如果在互联网上,遇到网速慢的情况,就非常棘手。

分布式版本系统的最大好处之一是在本地工作完全不需要考虑远程库的存在,也就是有没有联网都可以正常工作,而SVN在没有联网的时候是拒绝干活的!当有网络的时候,再把本地提交推送一下就完成了同步,真是太方便了!

2 安装Git

2.1 Linux环境安装Git

通过如下命令查看系统是否安装Git:

$ git

Debian或Ubuntu,通过如下命令进行安装:

$ sudo apt-get install git

若使用老版本的Debian或Ubuntu,要把命令改为:

$ sudo apt-get install git-core

因为以前有个软件也叫GIT(GNU Interactive Tools),结果Git就只能叫git-core了。由于Git名气实在太大,后来就把GNU Interactive Tools改成gnuit,git-core正式改为git。

如果是其他Linux版本,可以直接通过源码安装。先从Git官网下载源码,然后解压,依次输入:

$ ./config
$ make
$ sudo make install

2.2 Windows环境安装Git

在Windows上使用Git,可以从Git官网直接下载安装程序,然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。

注意:git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

3 创建版本库

版本库又名仓库,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但是只能知道改了,不知道改了啥。不幸的是,Microsoft的Word格式是二进制格式。

3.1 初始化仓库

初始化Git仓库:

$ git init

git init命令把当前目录变成git可以管理的仓库,执行完该命令之后可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,不要手动去修改这个目录里面的文件。

有一点需要注意的是,如果使用windows系统,为了避免各种莫名其妙的问题,请确保git仓库的目录名称(包括父目录)不包含中文。

因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

使用Windows的童鞋要特别注意:
千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可。

3.2 添加文件到Git仓库

分两步:

第一步,用git add命令把文件添加到仓库,格式如下:

$ git add <file>

注意:可反复多次使用,添加多个文件,也可以一次添加多个文件。

第二步,用git commit命令把文件提交到仓库,格式如下:

$ git commit -m <message>

-m后面输入的<message>是本次提交的说明,即更新记录。

git commmit可以一次提交很多文件,把git add到仓库的文件都提交到仓库。

4 时光机穿梭

4.1 查看仓库状态和文件修改内容

查看工作区的状态(仓库文件的修改和提交状态等):

$ git status

查看文件的修改内容:

$ git diff <file>

4.2 版本回退

查看历史日志:

$ git log

日志中显示的如 1094adb… 的是commit id(版本号)。

查看简洁版日志:

$ git log --pretty=oneline

简洁版日志只会显示版本号和提交日志。

版本回退:

$ git reset --hard <commit_id>

这个版本号就是通过git log查看到的,版本号不需要写全,只需要写前面的一部分即可,可以到版本号指定的版本,可以是历史版本也可以是未来的版本(未来的版本意思是你先回到了历史版本,然后需要再回到回退前的版本)。

HEAD表示当前版本,上一个版本就是HEAD^,上上个版本就是HEAD^^,以此类推…但是不可能往上100个版本就用100个^,故表示为HEAD~100。如:

$ git reset --hard HEAD^

回退到上一个版本。

查看历史命令:

$ git reflog

可以通过这个命令查看回退前的版本号,之后就可以通过git reset --hard <commit_id>到未来的版本。

4.3 工作区和暂存区

工作区就是我们通过git init初始化的文件夹。

版本库是指工作区下的.git文件夹。

暂存区的就是git add后存放修改内容的地方,通过git commit将暂存区的内容进行提交。

4.4 管理修改

git commit只是把暂存区的修改提交了,工作区的修改并不会提交,也就是说只会提交git add的文件,对于修改后没有git add的文件不会提交。

查看工作区和版本库里面最新版本的区别:

$ git diff HEAD -- <file>

4.5 撤销修改

  • 丢弃工作区的修改,不丢弃已经到暂存区的修改内容:

    $ git checkout -- <file>
    

    适用场景:当你修改了工作区的内容,想直接丢弃工作区的修改时。

  • 撤销暂存区的修改,重新放回工作区:

    $ git reset HEAD <file>
    

    之后你可以再次通过git checkout -- <file>丢弃工作区的修改。

    适用场景:当你将修改添加到暂存区时,想丢弃暂存区的修改时。

  • 已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库(也就是没有git push到远程仓库)。

4.6 删除文件

从版本库中删除文件:

$ git rm <file>
$ git commit -m <message>

从版本库中恢复文件(用版本库中的版本替换工作区中的版本):

$ git checkout -- <file>

5 远程仓库

远程仓库有两种:

  • 搭建自己的Git服务器
  • Github网站

5.1 本地仓库和Github之间的传输设置

我们目前只介绍GitHub仓库,由于本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以需要如下设置:

  • 创建SSH Key

    在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。

    如果没有(当然有了也可以重新生成),打开Git Bash,创建SSH Key:

    $ ssh-keygen -t rsa -C "youremail@example.com"
    

    你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可。

    如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。

  • 配置Github
    登陆GitHub,打开“Settings”,“SSH and GPG Keys”页面,然后点击“New SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容。

    SSH Key是为了让GitHub识别出你推送的提交确实是你推送的,而不是别人冒充的。所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。

    GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。

5.2 添加远程库

a. 添加远程库步骤如下:

  • 进入github网站
  • 点击New repository按钮
  • 填入Repository name,选择public或者private,点击创建按钮
  • GitHub告诉我们,可以从这个仓库克隆到本地,也可以把一个已有的本地仓库与之关联,然后,把本地仓库的内容推送到GitHub仓库

b. 将已有的本地仓库与GitHub仓库关联

$ git remote add origin 远程仓库地址如:
$ git remote add origin git@github.com:hess-hxf/Accumulation-fund-calculation.git

添加后,远程库的名字就是origin,这是Git默认的叫法,也可以改成别的,但是不建议这么做。

c. 将本地仓库的内容推送到远程库

$ git push -u origin master        //会让你输入GitHub的账户名和密码,验证成功才能推送到远程库

把本地库的内容推送到远程,用git push命令,实际上是把当前分支master推送到远程。

由于远程库是空的,我们第一次推送master分支时,加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。只要本地作了提交,就可以通过命令:$ git push origin master把本地master分支的最新修改推送至GitHub。

5.3 从远程库克隆

要克隆一个仓库,首先必须知道仓库的地址(GitHub给出的地址不止一个,包括ssh和https两种协议地址),然后使用git clone <仓库地址>命令克隆。

Git支持多种协议,包括https,但通过ssh支持的原生git协议速度最快。使用https除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh协议而只能用https。

6 分支管理

没有分支的风险:
假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活。如果等代码全部写完再一次性提交,又存在丢失每天进度的巨大风险。

分支在实际中的作用:
有了分支,这些问题就迎刃而解,你创建属于自己的分支,别人看不到,你在你自己的分支上工作,可以随意提交,不影响原来的分支,开发完毕之后,再一次性合并到原来的分支上,这样既安全,又不影响别人工作。

Git鼓励大量使用分支。

6.1 创建与合并分支

查看当前分支:

$ git branch

git branch命令会列出所有分支,当前分支前面会标出*号。

创建分支:

$ git branch <name>

切换分支:

$ git checkout <name>
或
$ git switch <name>       //切换分支这个动作,用switch更科学

创建+切换分支:

$ git checkout -b <name>
或
$ git switch -c <name>

合并某分支到当前分支:

$ git merge <name>

删除分支:

$ git branch -d <name>

6.2 解决合并冲突

当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容(通过vi进入冲突文件时可以看到Git用<<<<<<<,=======,>>>>>>>标记出不同分支的内容),再提交。

查看冲突的文件:

$ git status

查看分支合并图:

$ git log --graph
或
$ git log --graph --pretty=oneline --abbrev-commit     //常用

6.3 分支策略

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

  • 首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;
  • 那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
  • 你和你的小伙伴们每个人都在dev分支上再创建自己的分支,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

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

合并模式

通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息。加上--no-ff参数就可以用普通模式合并,Git就会在merge时生成一个新的commit,合并后的历史有分支信息,能看出来曾经做过合并。

如将dev分支合并到master上:

$ git merge --no-ff -m "merge with no-ff" dev

因为使用--no-ff合并会创建一个新的commit,所以加上-m参数,把commit描述写上去。

6.4 Bug分支

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

当手头工作没有完成时,先把工作现场git stash一下,也就是把当前工作现场保存起来,然后去修复bug,修复后,再恢复现场,有两种恢复方式:

$ git stash apply
$ git stash drop

这种方式恢复后,stash内容并不删除,你需要用git stash drop来删除;

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

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

$ git stash apply stash@{0}

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

6.5 feature分支

开发一个新功能,最好新建一个分支,在上面开发,完成后合并,最后删除feature分支;

删除分支(已经被合并的分支):

$ git branch -d <name>

如果要丢弃一个没有被合并过的分支:

$ git branch -D <name>

未被合并过的分支使用git branch -d <name>无法删除,需要使用-D选项强行删除。

6.6 多人协作

查看远程库的信息:

$ git remote

显示更详细的信息:

$ git remote -v

6.6.1 推送分支

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

$ git push origin master

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

$ git push origin dev

但是,并不是一定要把本地分支往远程推送,那么,哪些分支需要推送,哪些不需要呢?

  • master分支是主分支,因此要时刻与远程同步;
  • dev分支是开发分支,团队所有成员都需要在上面工作,所以也需要与远程同步;
  • bug分支只用于在本地修复bug,就没必要推到远程了,除非老板要看看你每周到底修复了几个bug;
  • feature分支是否推到远程,取决于你是否和你的小伙伴合作在上面开发。

总之,就是在Git中,分支完全可以在本地自己藏着玩,是否推送,视你的心情而定!

6.6.2 抓取分支

在本地创建和远程分支对应的分支:

$ git checkout -b branch-name origin/branch-name

从远程抓取分支:

$ git pull

6.6.3 多人协作的工作模式

  • 推送修改:

    $ git push origin <branch-name>
    
  • 推送失败,则因为远程分支比你的本地更新,先使用如下命令试图合并:
    $ git pull
    
  • 如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,使用如下命令:
    $ git branch --set-upstream-to <branch-name> origin/<branch-name>
    
  • 如果合并有冲突,则解决冲突,并在本地提交。
  • 没有冲突或者解决冲突后,再次推送:
    $ git push origin <branch-name>
    

6.7 Rebase

7 标签管理

发布一个版本时,通常先在版本库中打一个标签(tag),标签虽然是版本库的快照,但其实它就是指向某个commit的指针。

tag其实就是一个让人容易记住的有意义的名字,它跟某个commit绑在一起。

7.1 创建标签

创建标签:

  • 切换到需要打标签的分支
  • 创建标签:
    $ git tag <tagname> <commit_id>
    

    commit_id是可选的,如果没有该项则默认对最新提交的commit打标签,若指定commit_id则代表对指定的commit打标签。

  • 创建带有说明的标签
     $ git tag -a <tagname> -m msg <commit_id>
    

    -a指定标签名,-m指定说明文字。

查看所有标签:

$ git tag

查看指定标签信息:

$ git show <tagname>

注意: 标签总是和某个commit挂钩,如果这个commit既出现在master分支,又出现了在dev分支,那么在这两个分支上都可以看到这个标签。

7.2 操作标签

推送本地指定标签:

$ git push origin <tagname>

推送本地所有标签:

$ git push origin --tags

删除本地标签(还未推送到远程):

$ git tag -d <tagname>

删除远程标签(确认是否删除远程库的标签,可以登录Github查看):

  • 先从本地删除:

    $ git tag -d <tagname>
    
  • 再删除远程标签:

    $ git push origin :refs/tags/<tagname>
    

8 使用GitHub(参与开源项目)

  • 访问项目主页
  • Fork开源项目(Fork到自己的账户下)
  • clone到本地仓库
  • 发起pull request给项目官方仓库贡献代码

假设我们参与开源项目bootstrap,官方仓库twbs/bootstrap,Github上克隆的仓库my/bootstrap,及本地仓库的关系如下图:

9 使用码云

码云是国内的Git托管服务,相比于Github访问速度更快。

具体使用参见:
https://www.liaoxuefeng.com/wiki/896043488029600/1163625339727712

10 自定义Git

配置Git显示颜色:

$ git config --global color.ui true

10.1 忽略特殊文件

忽略文件的原则:

  • 忽略操作系统自动生成的文件,比如缩略图等
  • 忽略编译生成的中间文件、可执行文件等,如java编译产生的.class文件
  • 忽略带有敏感信息的配置文件,比如存放口令的配置文件

如何忽略文件:

  • Git工作区的根目录下创建.gitignore文件
  • 然后把要忽略的文件名填进去
  • .gitignore文件内可以填写注释,用#
  • 提交.gitignore到Git上

有时候,提交文件到Git,发现提交不了,可能是因为被.gitignore文件忽略了,强制提交使用-f选项:

$ git add -f <filename>

并且可以用git check-ignore命令检查是哪个规则导致:

$ git check-ignore -v <filename>

10.2 配置别名

配置别名命令如下:

$ git config --global alias.别名 现有命令

--global是针对当前用户起作用的,如果不加,那只对当前仓库起作用。

Git的配置文件:

每个仓库的配置都放在.git/config文件中,别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。

当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中。

配置别名除了通过命令,还可以直接修改配置文件。

10.3 搭建Git服务器

Ubuntu系统搭建Git服务器:

  • 第一步,安装Git:

    $ sudo apt-get install git
    
  • 第二步,创建git用户,用来运行git服务:
    $ sudo adduser git
    
  • 第三步,创建证书登录:
    收集所有需要登录的用户的公钥,就是他们自己的id_rsa.pub文件,把所有公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
  • 第四步,初始化Git仓库:
    先选定一个目录作为Git仓库,假设是/srv/sample.git,在/srv目录下输入命令:

    $ sudo git init --bare sample.git
    

    Git就会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾,然后把所有者改为git:

    $ sudo chown -R git:git sample.git
    
  • 第五步,禁用shell登录:
    出于安全考虑,第二步创建的git用户不允许登录shell,这可以通过编辑/etc/passwd文件完成,将:

    git:x:1001:1001:,,,:/home/git:/bin/bash
    改为
    git:x:1001:1001:,,,:/home/git:/usr/git-shell
    
  • 第六步,克隆远程仓库:
    现在可以通过git clone命令克隆远程仓库了:

    $ git clone git@server:/srv/sample.git
    

团队较大,无法通过收集公钥放到服务器这种手段来实现,要方便管理公钥,可以使用Gitosis软件。

要像SVN那样变态的控制权限,用Gitolite软件。

11 使用Source Tree

Source Tree是由Atlassian开发的免费Git图形界面工具,可以操作任何Git库。

具体操作参见:
https://www.liaoxuefeng.com/wiki/896043488029600/1317161920364578

Git 基础入门教程相关推荐

  1. Android基础入门教程——1.5.1 Git使用教程之本地仓库的基本操作

    Android基础入门教程--1.5.1 Git使用教程之本地仓库的基本操作 标签: Android基础入门教程 Git是什么? 一个分布式版本控制系统,和SVN类似,但远比SVN强大的一个版本控制系 ...

  2. 最新Android基础入门教程目录(完结版)

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  3. 2015年最新Android基础入门教程目录(完结版)

    2015年最新Android基础入门教程目录(完结版) 标签(空格分隔): Android基础入门教程 前言: 关于<2015年最新Android基础入门教程目录>终于在今天落下了帷幕,全 ...

  4. java adt入门教程_Android基础入门教程目录

    第一章:环境搭建与开发相关(已完结 10/10) https://blog.csdn.net/coder_pig/article/details/50000773 Android基础入门教程--1.1 ...

  5. python怎么输出浮点数_python 零基础入门教程第 2 章:基本数据类型 (一)

    一.什么是数据类型 编程语言通过一些复杂的计算机物理底层机制,创造不同类型的数据,用来表示现实世界中的不同信息,以便于计算机更好的存储和计算. 每种编程语言都会有一些基本的数据类型用来表示现实世界中的 ...

  6. python免费入门手册-Python 基础入门教程

    Python是一种解释型.面向对象.动态数据类型的高级程序设计语言. Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年. <Python 基础入 ...

  7. Python基础入门教程:使用 Python 3 协程快速获得一个代理池

    Python基础入门教程:使用 Python 3 协程快速获得一个代理池 前言 在执行 IO 密集型任务的时候,程序会因为等待 IO 而阻塞.比如我们使用 requests 库来进行网络爬虫请求的话, ...

  8. Git完整入门教程(从0开始)

    前言 本博客是Git的入门教程,刚刚接触Git的朋友们参照本博客流程便可以在自己电脑上实现本地与云端Github的交互,同时本博客中使用到的Git指令也是最基本的. 文章目录 前言 初始化Git仓库 ...

  9. 超全面Python基础入门教程【十天课程】博客笔记汇总表

    目录 1.学习地址 2.下载地址[视频.源码.课件.软件] 3.详细博客笔记 Day 01 Day 02 Day 03 Day 04 Day 05 Day 06 Day 07 Day 08 Day 0 ...

最新文章

  1. 【ACM】杭电OJ 2030
  2. 【拯救赵明】全面防护网络***服务器负载及安全解决方案
  3. csp-s模拟测试42「世界线·时间机器·密码」
  4. socket中使用心跳来检测连接是否断开[ZT]
  5. 多线程跑调度_java多线程中的调度策略
  6. 鸡蛋掉落(动态规划)
  7. exists sql用法_《SQL进阶教程》笔记(3)
  8. Fragment事务管理源码分析
  9. 贵州省二级分类土地利用数据(矢量)
  10. namenode节点无法启动解决方法
  11. 容器技术Docker K8s 20 容器服务ACK基础与进阶-存储管理
  12. 太阳粒子是什么东西_太阳粒子流是什么
  13. html当当网上书店,当当网上书店案例代码+css+js+images
  14. SAP UI5 应用开发教程之六十一 - 在 SAP UI5 应用里绘制甘特图 Gantt Chart 试读版
  15. 浙江高考计算机专业要选什么课,浙江省新高考7选3选课指南发布 七选三技巧解读...
  16. html图片顺时针倾斜50度,html – 使用transform进行垂直对齐:translateY(-50%);里面绝对定位的div...
  17. linux内核热插拔,Linux热插拔机制的介绍和应用
  18. 冬季无锡旅游攻略,无锡太湖、鼋头渚之游小记!!!!
  19. 六一儿童节带娃旅游,在曼谷玩哪些景点超好玩?
  20. vue页面的定时刷新

热门文章

  1. 格雷码编码与二进制的关系
  2. 服务器集群管理应用XGS 9635OSD v2.5
  3. java grizzly_Grizzly简介 | Java Game
  4. acunetix_WVS 13.基础使用
  5. LED灯具巴西INMETRO认证标准介绍(一)
  6. python实现梯度下降求解方程斜率和截距,线性回归算法LinearRegression
  7. 华硕 TUF GAMING b360m 启动设备中看不到启动项 已解决
  8. Dev-C++ 配置 WinPcap 开发环境
  9. Exp2 后门原理与实践 20204308李文艳
  10. 窄带物联网系统能量分析