Git从入门到精通

参考书目:Git从入门到精通

第一章 Git入门

1.1 什么是Git

  如果你去问那些正在使用Git的人,什么是Git,他们可能会说:Git就是一种版本控制系统,专业一点的人会说Git是一种分布式版本的版本控制系统,那么什么是版本呢?

  就像一个一个存放工作内容的文件夹,里面的文件数量在不断变化,文件在不断被修改。每次目录状态的变化,不管是新建还是删除文件,或者是改动文件内容,都可以被称为一个版本。

  所谓版本控制系统,就是用来记录所有的这些状态的变化的,使你可以像搭乘时光机一样回到过去某一个版本的状态。

  简单地说,Git就像是打游戏时的存档一样,再打BOSS时你输了,也可以回档重头再来。

  无论做任何工作,如果有Git帮你保留这些历史记录和证据,那么发生意外是你也可以知道是从什么时候开始有问题的,以后可以找谁负责,再也不用自己背黑锅了!

1.2 Git安装

1.2.1 Windows下安装Git

  在Windows下安装Git之前,先从官方网站(https://git-scm.com/download/win)下载。
请添加图片描述

  下载后,安装时一路点击Next即可。

  安装完成后,选择Git Bash,启动Git Bash后进入其操作界面,这个黑黑的窗口与Windows自带的命令提示符窗口不一样,它本身模拟了一个在Linux世界很有知名度的软件Bash。请添加图片描述
  这个时候,可以在窗口中试着输入命令,验证一下Git是否安装
请添加图片描述

1.2.2 Linux下安装Git

  在Linux下安装Git,只需要一行apt-get即可
请添加图片描述

  在Git官网上,有很多GUI工具,在Linux下可以安装gitk。

apt-get install gitk

1.3 设置Git

  使用Git时,首先要做的事设置用户的E-mail信箱和用户名,打开终端机,输入下面命令:

git config --global user.name "Eddie Kao"
git config --global user.email "eddie@5xruby.tw"

  输入完成后,可以再检查一下当前的设置:

git config --list

  设置文件的保存位置:

  不管是通过命令行还是GUI完成的设置,所有Git相关的设置都默认保存在自己账号下的.gitconfig文件中,所以使用一般文字编辑器直接修改该文件,也会有一样的效果。

  可能注意到了,之前在设置的时候加了一个global参数,其含义是进行全局设置,但偶尔也会有针对特定的项目设置不同的作者,此时可以加入local参数。这样一来,在对这个项目进行操作的时候,就会使用为其特别定制的用户名以及E-mail来操作。

git config --local user.name xxx
git config --local user.email xxx

第二章 开始使用Git

2.1 新增、初始Repository

  如果这是第一次使用Git,就先从创建一个全新的目录开始吧。

cd /tmp
mkdir git-practice
cd git-practice
git init         //初始化这个目录,让Git对这个目录进行版控

请添加图片描述

  其中,git init命令会在git-practice目录中创建一个.git目录,整个Git的精华都在这个目录中了。

  如果针对本来就有的目录,只需要到那个目录下执行git init就行了。

  其实,Git版控很简单,全靠.git这个目录在做事,如果这个目录不想被Git控制,可以直接删掉.git这个目录。

2.2 把文件交给Git管控

(1)创建文件

git status

请添加图片描述

  现在的目录,没有任何文件,所以提示无文件提交。接下来,在这个目录中创建一个文件。

echo "hello git">welcome.html

请添加图片描述

  这个状态和开始不一样,这个welcome.html文件当前状态是未跟踪,即这个文件尚未被加入到Git版控系统中。

(2)把文件交给Git

  使用git add命令把对这个文件进行跟踪。

git add welcome.html

请添加图片描述

  从以上信息看出,这个文件状态已经变成了new file。表示文件已经被安置到暂存区(staging area),稍后与其他文件一起被存储到存储库中。

  这个暂存区也叫下标(index)。

  如果想要一次追踪多个文件,可以直接使用–all参数,或者通配符

git add -all
git add *.html             //把所有html后缀都git追踪

(3)把暂存区的内容提交到存储库里存档

  如果只是吧通过git add命令把异动加入到暂存区,还不算是完整的流程。如果想要暂存区里的内容保存下来,就要使用git commit命令:

git commit -m "init commit"

在这里插入图片描述
  在后面加上-m "init commit"是要说明这次commit做了什么事,只要使用简单清楚的文本说明即可。能让自己和别人很快明白。

  完成这个动作后,对Git来说就是把暂存区的内容放到仓库(repository)中了。换言,就是我完成了一个存档的动作。

  那么,git commit到底commit了哪些东西:

  • 首先要记住,Git的每次commit只会处理暂存区的内容。如果一个文件没有先执行git add命令,那么执行git commit也不会加入存储区。

  • 在commit时,如果没有输入信息,Git默认是不会完成commit的,他最主要的目的是告诉你和其他人,这次改动做了什么(一个备注)。如果没有在后面没有加入信息参数,默认会弹出来一个vim。不过,加入–allow-empty参数,没有内容也是可以commit的。

  那么什么时候可以commit呢:

  • 完成一个任务时:大到完成一整个电子商务的金流系统,小到只添加了一个页面甚至只改了几个字。
  • 下班的时候:虽然还有可能没完成任务,但至少先commit今天的进度。
  • 想要commit的时候:只要想commit,就可以commit。

2.3 查看记录

  接下来介绍如何查看之前commit的记录。

  可以使用git log命令:

git log

  从上面这些信息中可以看出来以下内容:

  • commit的作者是谁
  • 什么时候commit的
  • 每次的commit大概做了什么

  至于上面的代码,是Git中使用SHA1算法计算的结果,Git使用这样的字符串作为识别码,每个commit都有一个这样的值。

  以下是使用Git查询历史记录时常见的问题:

(1)想要查找某个人的commit

  如果要查找一个名叫sherly的作者的commit,可以使用以下命令:

git log --oneline --author="sherly"

在这里插入图片描述
(2)查找commit信息中是否含有某些关键字

  使用–grep参数,可以从commit信息中搜索符合关键字的内容,如搜索LOL:

git log --oneline --grep="LOL"

(3)怎么在commit文件中找到Ruby

  使用-S参数,可以在所有的commit文件中进行搜索,找到符合特定条件的内容:

git log -S "Ruby"

(4)怎么查找某一时段的commit

  在查看历史记录时,可以搭配–since和–unit还有–after参数查询:

git log --oneline --since="9am" --until="12am" --after="2017-01"

这样就可以找到从2017年1月之后,每天早上九点到十二点之间的commit。

2.4 如何在Git中删除文件或变更文件名

  在Git中,无论是删除文件还是变更文件名,对Git来说都是一种改动。

2.4.1 删除文件

(1)直接删除

  可以用rm命令直接删除文件

rm welcome.html

在这里插入图片描述
  可以看到文件状态是deleted,如果确定这是你想做的,可以把这次改动加入暂存区。
在这里插入图片描述
(2)用Git删除

  可以先执行rm删除,在执行git add命令加入暂存区。也可以直接使用git rm命令完成。

git rm welcome.html

  这样它就直接在暂存区了,不需要add了。

(3)加入–cached参数

  不论执行rm,还是git rm命令,都会直接把这个文件删除,如果不想删除文件,只是不想让这个文件再被Git控制,可以加入–cached参数:

git rm welcome.html --cached

2.4.2 变更文件名

(1)直接改名

  与删除文件一样,变更文件名也是一种改动。

mv hello.html world.html     //把hello.html改成world.html

在这里插入图片描述
  虽然只是改了文件名,对git来说被认为是两个动作,一个是删除hello.html这个文件,一个是新增了一个world.html文件,接着使用git add命令把这个改动加入暂存区。

在这里插入图片描述
  Git可以发现文件内容没有变化,可以判断出只是单纯地改名,所以状态变成renamed了。

(2)用Git改名

  和之前git rm一样,git也可以改名,少做一步

git mv hello.html world.html

  事实上,Git是根据文件的内容来计算SHA1值得,所以文件的名称不重要。

2.5 修改commit记录

(1)使用–amend参数改动最后一次的commit。

  原来的记录是这样的:

在这里插入图片描述
  如果要改动最后一次commit信息:

git commit --amend -m "welcome"

在这里插入图片描述
  可以发现,对于Git来说,因为commit的内容改变了,所以Git会重新生成一个新的commit对象,这是一个全新的commit。

  虽然只是改动信息,但不管怎么说,它就是改动了一次历史记录,所以尽量不要在已经push出去后再改动。

(2)使用git reset命令拆掉重做

  先看一下现在的git记录:

在这里插入图片描述
  如果想要拆掉最后一次commit,可以使用相对或绝对的办法,相对的办法是这样的:

git reset 372a7fc^

  最后这个^表示前一次,所以上面指向的就是372a7fc这个commit的前一次,如果是两个,就代表commit的前两次。

  因为HEAD和master当前都是指向372a7fc这个commit,而且372a7fc不好记,所以上面这行代码通常改为:

git reset master^
git reset HEAD^

  如果你很清楚要把当前状态回退到哪个commit,可以直接指明

git reset 820629d

  注意,不要被reset误导了,这个词通常翻译是重新设置,但在Git中,更好地翻译是前往或者变成。

  使用git reset HEAD^^或者git reset HEAD~2这个命令应该被翻译成前往两个commit前的状态。中间的过程并没有完全删掉。

2.6 查看特定文件的commit记录

  git log可以查看整个项目的commit记录,但如果只想查看单一文件的记录,可以在后面加入文件名

git log welcome.html

  这样就可以看到这个文件commit的记录,如果想要查看这个文件每次commit做了什么改动,可以再给它加上-p参数。

git log -p welcome.html

  可以看出来,welcome这次的commit是添加了一行hello git。

2.7 这行代码是谁写的

  想要知道文件的某一行代码是谁写的,在Git中可以使用git blame命令帮你找出来:

git blame world.html

在这里插入图片描述
  可以很清楚的看出来每一行代码是谁在哪个时候写下的,前面的代码是每次commit的结果,表示这一行代码是在那一次的commit中加进来的。

  如果文件很大,就可以加入-L参数,只显示特定行数的内容:

git blame -L 5,10 index.html

  这样就可以查看第5-10行的信息。

2.8 不小心吧文件或目录删除了

  这里现将所有的html文档删除:

在这里插入图片描述
  这个时候,如果要把文件挽救回来,可以使用git checkout命令:

git checkout index.html

在这里插入图片描述
  可以看到,文件回来了。如果想要把所有删除的文件都挽救回来,可以不加后缀,直接使用git checkout。

  那么,Git是怎么把文件挽救回来的呢?

  当时用git checkout命令时,这个命令会把存储区中的文件拿来覆盖当前工作目录中的文件。

  如果在执行这个命令时,多加一个参数

git checkout HEAD~2 welcome.html

  那么距离现在两个版本以上的那个welcome.html文件就会用来覆盖当前工作目录中的welcome.html文件。

第三章 使用分支

  在开发的过程中,一路向前commit也没什么问题,但当越来越多的同伴加入到一个项目中后,就不能这么随意想commit就commit了,这时分支就派上了用场。例如:想要新增功能或者修复BUG,又或是想要试试新的做法,都可以另外做一个分之来进行,在确保没问题之后再合并过来,不影响正在运行的产品线。

  在多人团队共同开发时,也可以引入Git Flow之类的开发程序,让同一个团队的人都用相同的方式进行开发。

3.1 开始使用分支

  在Git中使用分支非常简单,只要使用git branch命令:

git branch

  如果git branch命令后面没有加任何参数,它仅会输出当前在这个项目中有哪些分支。Git默认会设置一个名为master的分支,前面的星号*表示现在正在这个分支上。

3.1.1 新增分支

  要增加一个分支,可以在执行git branch命令时,加上想要的分支的名称:

git branch cat

  这个就新增了一个cat分支。
在这里插入图片描述

3.1.2 更改分支名称

  如果觉得分支的名称不够响亮,可以随时更改,不会影响文件或目录。

  可以在git branch后加入-m参数:

git branch -m cat tiger

在这里插入图片描述
  这样cat分支就变成了tiger分支。即使是master分支也是可以改的。

3.1.3 删除分支

  可以通过在git branch后加入-d参数进行删除

git branch -d cat

在这里插入图片描述
  如果要删除的分支还没有被完全合并,Git会有提示。因为没有完全被合并,所以使用-d参数是无法删除的,这时需要使用-D参数强制删除。

  在Git中没有什么分支是不能删的,包括默认的master(master只是默认分支,并没有什么特别之处)。如果非要说什么分支不能删,就只有当前所在的分支不能删,需要在切换其他分支后才可以删除。

3.1.4 切换分支

  如果需要切换分支,用到git checkout:

git checkout cat

在这里插入图片描述
  看一下当前状态:
在这里插入图片描述
  例如,切换到cat分支,然后加两次commit,再分别新增cat1.html和cat2.html文件:
在这里插入图片描述

  看一下文件列表:
在这里插入图片描述
  这里是有这两个文件的。之后切换回master分支:
在这里插入图片描述
  发现这个master分支时没有刚才的两个文件了。别担心,他们还都在,只是在不同的分支而已,切换回去就会出现了。

  注意,要切换到哪个分支时,对应分支必须先存在,不然会有错误。

  如果没有这个分支,在git branch后加入-b参数就可以了,相当于先创建分支,再切换过去。

3.2 对分支的误解

  有人可能认为,所谓的开分支,就是把文件先复制到另外的目录,然后进行改动,之后再合并,把文件与原本的文件对比之后放回原来的目录。其实Git不是这样做的。

  可以把分支想象成一张贴纸,贴在一个commit上面。
在这里插入图片描述
  当做了一次新的commit之后,这个新的commit就会指向它前一次的commit,而接下来当前的分支,也就是HEAD所指的分支,会贴到刚刚做的那个commit上,同时HEAD也会跟进。
在这里插入图片描述
  如果一个分支不够用,此时再通过git branch cat创建一个新的分支:
在这里插入图片描述

  而接下来通过git checkout cat切换到cat分支,此时HEAD转而指向cat分支,表示它是当前的分支:
在这里插入图片描述
  然后在进行一次commit,这个cat分支会继续贴在下一个commit上:
在这里插入图片描述
  这也就是为什么刚才在cat分支新建了cat1和cat2两个文件,切换到master分支后看不到了的原因。

3.3 合并分支

  任务执行的差不多了,就要准备合并回来了,如果想用master分支来合并cat分支,要切回master分支。

git checkout master

  接下来,使用git merger命令合并分支

git merge cat

在这里插入图片描述
  因为已经合并了cat分支了,所以之前的cat1和cat2两个文件也就出现了。
在这里插入图片描述

3.4 不小心删掉了分支还可以找回么

  对于合并过的分支,可以保留也可以删除,那么如果把没有合并的分支删除了,还能救回来么?

  分支只是一个指向某个commit的指标,删除这个指标并不会使得那些commit小时。所以,删除分支后那些commit都还在,只是因为你没有记录下这个commit的SHA1值,不方便拿来使用,既然存在,就可以在找回来:

git branch new_cat b174a5a

  这个命令就是创建了一个名为new_cat的分支,让它指向了b174a5a这个commit。

  如果没有记下来刚刚删除的cat分支指向的commit的SHA1值,可以通过git reflog命令查找,reflog默认保留30天。

3.5 可以从过去某个commit开始创建分支么

  如果我在年轻时,一定会做出另一种选择。我们做不到,但Git可以。

  如果要从之前的某个commit(657fce7)开始分支,只需要:

git branch bird 657fce7

  这样就可以在这个commit上开了一个bird分支。

第四章 标签

标签是什么?

  在Git中,标签(Tag)是一个指向某个commit的指示标。这看起来与分支很像,但又有一些不太一样的地方。

什么时候使用标签?

  通常在开发软件时会完成特定的里程碑,如软件版号1.0.0之类的,这时就很适合使用标签做标记。

4.1 标签的分类

  标签有两种,一种是轻量标签,另一种是有附注的标签。不管是哪一种标签,都可以把它当做贴纸,贴在某个commit上。

(1)轻量标签

  轻量标签的使用方法非常简单,只需要直接指定要贴上去的那个commit即可:
在这里插入图片描述
  通过命令git tag打标签:

git tag big_cats a42ada4

  这样就可以在a42ada4这个commit上打上big_cats的标签了。

  如果tag之后没有指定commit,标签就会贴在当前所在的commit上。

  轻量标签只是一个指向某个commit的指示标,不含有其他信息,所以Git比较推荐使用有附注的标签。

(2)有附注的标签

  如果要创建一个有附注的标签:

git tag big_cats a42ada4 -a -m "Big Cats are comming"

  其中,-a参数就是让Git创建有附注的标签,后面的-m参数就是跟创建一般的commit时输入的信息类似,如果没有-m参数,会弹出vim编辑器。

4.2 删除标签

  不管是哪一种标签,其本质都是贴纸,删掉并不会影响commit,如果要删除标签,只需要-d参数:

git tag -d big_cats

  分支和标签的区别在于,分支会随着commit移动,但标签不回,因此,分支可以看做是会移动的标签。

第五章 远程协作——GitHub

5.1 GitHub概述

  GitHub是一个商业网站,是当前全球最大的Git服务器,在这里,你可以和一些优秀的开发者交朋友,为其他人的项目贡献自己的力量,或者为自己的项目寻求帮助。

  Git和GitHub的区别:

  Git是工具,GitHub是网站,GitHub本体是一个Git服务器。

5.2 将内容Push到GitHub上

(1)在GitHub上创建新的项目

  要上传文件到GitHub,需要先在上面创建一个新的项目。首先在GitHub网站右上角点击+按钮,在弹出的下拉列表中选择New repository选项:
在这里插入图片描述
  接着填写项目名称:

  这里有两点:

  • repository name可以任意填写,只要不重复即可。

  • 存取权限选中public可以免费使用,选择private则需要交钱。

  单击create repository按钮,可以新增一个repository。

  接着会看到引导界面:
在这里插入图片描述
  这里有两点说明:

  • 如果是新项目,按照create a new repository on the command line的提示进行操作,如果是上传现有项目,则按照push an existing repository from the command line的提示进行。
  • 有两个按钮可以切换,分别是https和ssh。如果单击ssh,需要设置ssh key。

  假设现在说明都没有,要重新开始一个项目,找到一个空的目录,然后按照提示进行操作,首先创建一个README.md文件:

echo "# practice-git" >> README.md

  这个README.md文件是GitHub项目的默认说明界面。

  接下来就是熟悉的Git了,用git init针对目录进行Git初始化:

git init
git add README.md
git commit -m "first commit"
git branch -M main

  在这之前,所有的操作都是在自己的计算机上完成的,接下来就是要准备把内容推上远端的Git服务器了,首先,需要设置一个远程端点:

git remote add origin https://github.com/Triangle75/practice-git.git

  这里说明三点:

  • git remote指令主要进行与远端有关的操作。
  • add指令是指要加入一个远程端点
  • 这里origin是一个代名词,指的是后面那串GitHub服务器的位置。

  按照惯例,远程的节点默认使用origin这个名称,如果是从服务器上clone下来的,默认名就是origin。但这是惯例,也可以不用这个名字。

  设置好远程端点后,接下来就是把内容推上去:

git push -u origin main

  这里简单的push指令其实做了以下几个事:

  • 将main分支的内容推向origin位置。
  • 在origin远程服务器上,如果main不存在,将创建一个名为main的分支。
  • 如果服务器上存在main分支,就会移动服务器上的main分支,使它指向当前最新的进度上。
  • 设置upstream,就是-u参数做的事情,稍后说明。

  返回之前的GitHub页面,刷新一下,刚才的引导页面就会变成这样:
在这里插入图片描述
  该页面表示已经顺利把本地内容推到这个远端项目上了。

  upstream是什么意思?

  前面进行push的时候加入了-u参数,表示要设置upstream,那么这是什么意思呢?

  upstream翻译成上游,其实就是另一个分支的名称而已,在Git里,每个分支可以设置一个上游,它会指向并追踪某个分支。通常,upstream会是远端服务器上的某个分支,如果设置了upstream,当下次执行git push指令时,就会默认它来当默认值,例如:

git push -u origin master

  就会把origin/master设置为本地master分支的upstream,当下次执行git push指令时不加任何参数时,git就会猜出是要往origin远端节点,并把master分支推上去:

git push

  如果没有设置upstream,就需要每次push时都要跟git说清楚:

git push origin master

5.3 Pull下载更新

  刚才介绍了如何把东西推上GitHub,接下来介绍如何将内容拉回来更新。

  与push命令相反,pull指令是拉回本机更新。在介绍pull之前,先介绍一下fetch。

(1)Fetch指令才是把内容拉回来的主角

  试着运行这个代码

git fetch

  会发现没有任何信息,因为现在的进度与在线版本是一样的,为了营造有不同进度的效果,可以到GitHub上直接编辑某个文件,对之前的README.md文件编辑:
在这里插入图片描述
  单击下面的Commit changes按钮,即可进行存档并新增一次commit,这样在线版本就领先了,接着在此fetch:

git fetch

在这里插入图片描述
  这样就把origin上的分支拿回来了,接下来要进行合并分支:

git merge origin/main

在这里插入图片描述
  这样,本地的文件也就更新了。

(2)pull指令

  如果理解了fetch指令,那么pull就很好理解了。

git pull=git fetch+git merge

  pull指令就是去线上把内容抓下来(fetch),在进行合并(merge)。

5.4 有时候推不上去

  在线版本的内容比本地计算机中的内容还要更新,所以Git不让推上去。

  出现这种问题一般是多人一起开发时:

  (1)sherly和eddie在差不多的时间从Git服务器上拉了一份文档下来准备开发。

  (2)sherly手脚比较快,先完成了,于是把做好的成果推了一份上去。

  (3)eddie之后完成了,但他要推的时候发现,推不上去了。

  这种问题怎么解决呢?

  (1)第一招,先拉再推

  因为本地计算机中的内容是比较旧的,那就先拉一份在线版本的内容回来更新,然后再推一次。

  (2)第二招,无视规则

  如果在推的时候加入了-f参数,就会强制推上去,把sherly之前的内容覆盖了。

git pull -f

  不过,之后就要跟sherly解释为什么把她的进度覆盖了。

5.5 从服务器上取得repository

  之前介绍的进行push、pull的前提是,已经有了这个项目了。

  如果在GitHub上看到有趣的项目,想要下载查看,可以使用clone这个指令。clone命令会把整个项目的内容复制一份到本地计算机中,包括项目的历史记录、分支、标签等。

git clone https://github.com/Triangle75/practice-git.git

  在GitHub页面单击code按钮,也可以选择https和ssh的方式。

在这里插入图片描述
在这里插入图片描述
  clone和pull指令有什么区别?

  这两个指令的使用场景是不同的,如果这个项目你是第一次看到,想要下载到自己的计算机中,应使用clone指令,如果已经下载了,只是想更新一下,是要用pull指令。

  clone指令通常是在第一次下载时使用,之后的更新就是用pull了。

5.6 怎么删除远端分支

  先看看在GitHub上怎么删除远端的分支:

  先登录GitHub网站的项目页面,点击branch标签,可以看到当前所有分支:
在这里插入图片描述
  单击某一个分支右下角删除图标即可删除该分支。

第六章 使用Git Flow

  当同一个项目中的开发人员越来越多时,如果没有制定好规则,放任大家自己的习惯commit的话就会造成灾难。

  因此,需要一套流程或者说一套规则提供大家共同遵守,如GitHub Flow、Gitlab Flow等,这里以Git Flow为例。

  根据Git Flow建议,分支主要分为Master分支、Develop分支、Hotfix分支、Release分支以及Feature分支,各分支负责不同的功能。

  • Master分支:主要用来存放稳定的项目版本。这个分支的来源只能是从别的分支合并,开发者不会直接commit到这个分支,因为是稳定版本,所以通常会在这个分支的commit上打上版本号标签。
  • Develop分支:这个分支是所有开发分支中的基础分支,当要新增功能时,所有的Feature分支都是从这个分支划分出去的,而Feature分支的功能完成后,也会合并到这个分支。
  • Hotfix分支:当在线产品有问题时,会从Master分支划出一个Hotfix分支进行修复,修复好后合并回Master分支,同时合并一份给Develop分支。
  • Release分支:当认为Develop分支足够成熟时,就可以把Develop分支合并到Release分支,在其中进行上线前的最后测试,测试完成后,Release分支会合并到Master分支和Develop分支。
  • Feature分支:如果需要新增功能,就要用Feature分支,这个分支是从Develop分支划分出来的,完成后再合并会去。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值