Git使用简述


title: Git使用简述
date: 2021-03-16 09:08:04
top: 21
tags:

  • git
  • gitee
    categories:
  • git

关于git

Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

安装

git包下载

各版本下载地址

ps: 如果网速不行,可选择版本号为Git-2.30.1-64-bit

git安装

这里就不赘述了,一直点就完事了。

git配置

Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。

打开git bash

单击鼠标右键>>点击git bash here

注意:默认在工作路径为当前位置,可以在目标文件夹进行打开,也可以通过命令切换到目标路径。

git bash命令行下可使用Linux系统的常用指令,相当于在windows系统嵌入一个shell bash

查看git版本,确认是否安装成功

git --version

配置个人信息

git config --global user.name "用户名"
git config --global user.email "邮件地址"

查看配置信息

git config -l

git工作流程

git工作流程图

git概念: 工作区、暂存区和版本库

  • **工作区:**就是你在电脑里能看到的目录。
  • **暂存区:**英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
  • **版本库:**工作区有一个隐藏目录 .git,这个不算工作区,而是 Git 的版本库。

.

git基本操作

初始化本地git仓库

git init

该命令是用来初始化git仓库的,是git使用的第一个命令。在执行完成 git init 命令后,Git 仓库会在当前目录生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。

git init <newrepo>

newrepo为项目仓库文件夹名。初始化后,会在 newrepo 目录下会出现一个名为.git的目录,所有 Git 需要的数据和资源都存放在这个目录中。

git remote 添加远程仓库

# 命令格式
git remote add [shortname] [url]
git remote add balbums git@39.105.7.83:/root/repositories/albums
##############
git remote -v     # 显示所有远程仓库
git remote show [remote]   # 显示某个远程仓库的信息
git remote rm name   # 删除远程仓库
git remote rename old_name new_name  # 修改仓库名

git add 添加文件到git暂存区

git add [file1] [file2] ...           # 添加一个或多个文件(包括子目录)到暂存区
git add .         # 添加当前目录下的所有文件到暂存区
git status       # 命令用于查看在你上次提交之后,是否有对文件进行再次修改

git commit 提交暂存区到本地仓库

git commit -m "info"   # 提交暂存区到本地仓库中;info是一些备注信息
git commit [file1] [file2] ... -m "info"

git commit --amend -m "info" 	# 修改上一次提交的info信息
*********************
git commit -a   #  -a 参数设置修改文件后不需要执行 git add 命令,直接来提交;不推荐使用。

git push 推送本地仓库文件

# 从将本地的分支版本上传到远程并合并 命令
git push [-f] [--set-upstream] <远程主机名> <本地分支名>:<远程分支名>   
-f 表示强制覆盖(覆盖远端)
--set-upstream 推送到远端的同时建立起和远端分支的关联关系;如果当前分支已经和远端分支关联,则可以省略分支名和远端分支名 // 需远端分支名已存在
-u <=> --set-upstream
###########
git push balbums master:master  # 分支名相同,;master可省略
-----------
git push --set-upstream balbums master
git push

从现有 Git 仓库中拷贝项目

git clone <repo> <directory>  			# 首次从远程仓库拉取代码

git pull [remote name] [brach name]   	# 下载远程代码并合并

git clone 从现有 Git 仓库中拷贝项目。directory可以省略,默认当前文件夹。repo为拷贝仓库的地址,如果是链接自己的仓库,这里可以使用ssh密钥来拷贝远程仓库。

git rm 删除文件操作

git rm <-f> <file>  # 暂存区和工作区删除文件file; f>>force
git rm --cached <file>  # 保留工作区文件,删除暂存区

git reset 回退版本

git reset [--soft | --mixed | --hard] [HEAD]
-----------
git reset --hard HEAD~3  # 回退上上上一个版本  
git reset –hard bae128  # 回退到某个版本回退点之前的所有信息。 
git reset --hard origin/master    # 将本地的状态回退到和远程的一样 
-----------
# --mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变
git reset HEAD^            # 回退所有内容到上一个版本  
git reset HEAD^ hello.php  # 回退 hello.php 文件的版本到上一个版本  
git  reset  052e           # 回退到指定版本
--------------
# --soft 参数用于回退到某个版本, 只进行对commit操作的回退,不影响工作区的文件
git reset --soft HEAD~3   # 回退上上上一个版本 
--------------
# --hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交
# 会对当前工作文件进行回退
$ git reset --hard HEAD~3  # 回退上上上一个版本  
$ git reset --hard bae128  # 回退到某个版本回退点之前的所有信息。 
$ git reset --hard origin/master    # 将本地的状态回退到和远程的一样 
---------------
可以使用 ~数字表示
HEAD~0 表示当前版本
HEAD~1 上一个版本
HEAD^2 上上一个版本
HEAD^3 上上上一个版本

git tag 添加版本标签

# 如果你达到一个重要的阶段,并希望永远记住那个特别的提交快照,你可以使用 `git tag` 给它打上标签。
# 比如说,我们想为我们的项目发布一个"1.0"版本,可以用 `git tag -a v1.0 `命令给最新一次提交打上(HEAD)"v1.0"的标签。
git tag -a v1.0    # -a 选项意为"创建一个带注解的标签"
git tag -a <tagname> -m "info"    # 指定标签信息命令

git 其他操作

git mv [file] [newfile]   # 移动或重命名工作区文件
-----------
git diff [file]    # 比较文件的不同,即暂存区和工作区的差异
# 尚未缓存的改动:git diff
# 查看已缓存的改动: git diff --cached
# 查看已缓存的与未缓存的所有改动:git diff HEAD
# 显示摘要而非整个 diff:git diff --stat

git diff <file> # 比较当前文件和暂存区文件差异 git diff
git diff <id1><id1><id2> # 比较两次提交之间的差异
git diff <branch1> <branch2> # 在两个分支之间比较
git diff --staged # 比较暂存区和版本库差异
git diff --cached # 比较暂存区和版本库差异
git diff --stat # 仅仅比较统计信息


------------
git fetch [remote name] [brach name]   # 从远程获取代码库,抓取更新但不合并


git 分支管理

开发中分支使用原则与流程

在开发中,一般有如下分支使用原则与流程:

  • master(生产)分支

    线上分支,主分支,中小规模项目作为线上运行的应用对应分支;

  • develop(开发)分支

    从master创建的分支,一般作为开发部门的主要开发分支,如果没有其他并行开发不同期上线要求,都可以在此版本进行开发,阶段开发完成后,需要合并到master分支,准备上线;

  • feature分支

    从develop创建的分支,一般是同期并行开发,但不同期上线时创建的分支,分支上的研发任务完成后合并到develop分支;

  • hotfix分支

    从master派生的分支,一般作为线上bug修复使用,修复完成后需要合并到master,develop,test分支;

  • 其他分支,如test分支(用于代码测试),pre分支(预上线分支)

分支操作命令

创建分支命令:

git branch <branchName>
# git branch 创建新分支,需要在master分支正式建立后,才能进行,也即第一次git commit操作后
----------------------
git branch dev  # 创建dev分支
git branch -d dev  # 删除dev分支
git branch -D dev  # 强制删除dev分支,一般在未进行merge操作的前提下删除分支,会需要-D确认删除
---------------------
git branch -vv  # 查看本地分支与远端分支的绑定关系
-------------------
git branch <branchName> <oldBranchName> 	# 在oldBranchName分支上新建分支branchName

git checkout 切换分支命令:

git checkout (branchname)
-------------------
git checkout -b dev  # 创建并切换到dev分支
git checkout -b dev master # 在master分支上创建并切换到dev分支

当你切换分支的时候,Git 会用该分支的最后提交的快照替换你的工作目录的内容, 所以多个分支不需要多个目录。

git merge 合并分支命令:

git merge 
# 一般合并操作的合并到master分支上
# 合并操作的流程为:切换到master分支,合并
git checkout master
git merge dev   # 将分支dev合并到当前分支中,自动进行新的提交
git merge --no-commit maint  # 将分支maint合并到当前分支中,但不要自动进行新的提交

列出分支基本命令

git branch  # (没有参数时,`git branch` 会列出你在本地的分支):

删除分支命令:

git branch -d (branchname)  # 删除本地分支
git branch -D (branchname)  # 强制删除本地分支
git push origin --delete (branchname)  # 删除远程分支

git 日志

使用git log 查看历史操作日志

查看日志命令:

git blame <file>    # 以列表形式查看指定文件的历史修改记录
git log
# 以单行图形化形式查看详细日志信息
git log --oneline --all --graph --abbrev-commit
git log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit
# 如果不带任何参数,它会列出所有历史记录,最近的排在最上方,显示提交对象的哈希值,作者、提交日期、和提交说明
# 如果记录过多,则按Page Up、Page Down、↓、↑来控制显示
--------------
# 按q退出历史记录列表
-p:按补丁显示每个更新间的差异,比下一条- -stat命令信息更全
--stat:显示每次更新的修改文件的统计信息,每个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出所有增减行数小计
--shortstat:只显示--stat中最后的行数添加修改删除统计
--name-only:尽在已修改的提交信息后显示文件清单
--name-status:显示新增、修改和删除的文件清单
--abbrev-commit:仅显示SHA-1的前几个字符,而非所有的40个字符
--relative-date:使用较短的相对时间显示(例如:"two weeks ago")
--graph:显示ASCII图形表示的分支合并历史
—pretty=:使用其他格式显示历史提交信息,可选项有:oneline,short,medium,full,fuller,email,raw以及format:<string>,默认为medium,如:
    --pretty=oneline:一行显示,只显示哈希值和提交说明(--online本身也可以作为单独的属性)
    --pretty=format:” ":控制显示的记录格式,如:
        %H  提交对象(commit)的完整哈希字串
        %h  提交对象的简短哈希字串
        %T  树对象(tree)的完整哈希字串
        %t  树对象的简短哈希字串
        %P  父对象(parent)的完整哈希字串
        %p  父对象的简短哈希字串
        %an 作者(author)的名字
        %ae 作者的电子邮件地址
        %ad 作者修订日期(可以用 -date= 选项定制格式)
        %ar 作者修订日期,按多久以前的方式显示
        %cn 提交者(committer)的名字
            作者和提交者的区别不知道是啥?
            作者与提交者的关系:作者是程序的修改者,提交者是代码提交人
			(自己的修改不提交是怎么能让别人拉下来再提交的?)
            其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。
			当你为某个项目发布补丁,某个核心成员将你的补丁并入项目,你就是作者,而那个核心成员就是提交者
        %ce 提交者的电子邮件地址
        %cd 提交日期(可以用 -date= 选项定制格式)
        %cr 提交日期,按多久以前的方式显示
        %s  提交说明
    带颜色的--pretty=format:” ",这个另外写出来分析
        以这句为例:%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an> 
        先断句:[%Cred%h][%Creset   -][%C(yellow)%d ][%Cblue%s][%Cgreen(%cd)][%C(bold blue)<%an>]
        然后就是很明显能得到的规律了
            一个颜色+一个内容
            颜色以%C开头,后边接几种颜色,还可以设置字体,如果要设置字体的话,要一块加个括号
                能设置的颜色值包括:reset(默认的灰色),normal, black, red, green, yellow, blue, magenta, cyan, white.
                字体属性则有bold, dim, ul, blink, reverse.  
            内容可以是占位元字符,也可以是直接显示的普通字符
--------------------------------------------------------
-------------------------------------------------
--date= (relative|local|default|iso|rfc|short|raw):定制后边如果出现%ad或%cd时的日期格式
    有几个默认选项
        --date=relative:shows dates relative to the current time, e.g. "2 hours ago".
        --date=local:shows timestamps in user’s local timezone.
        --date=iso (or --date=iso8601):shows timestamps in ISO 8601 format.
        --date=rfc (or --date=rfc2822):shows timestamps in RFC 2822 format,often found in E-mail messages.
        --date=short:shows only date but not time, in YYYY-MM-DD format.这个挺好用
        --date=raw:shows the date in the internal raw git format %s %z format.
        --date=default:shows timestamps in the original timezone (either committer’s or author’s).
    也可以自定义格式(需要git版本2.6.0以上),比如--date=format:'%Y-%m-%d %H:%M:%S' 会格式化成:2016-01-13 11:32:13,其他的格式化占位符如下:
        %a:Abbreviated weekday name
        %A:Full weekday name
        %b:Abbreviated month name
        %B:Full month name
        %c:Date and time representation appropriate for locale
        %d:Day of month as decimal number (01 – 31)
        %H: Hour in 24-hour format (00 – 23)
        %I:Hour in 12-hour format (01 – 12)
        %j:Day of year as decimal number (001 – 366)
        %m:Month as decimal number (01 – 12)
        %M:Minute as decimal number (00 – 59)
        %p:Current locale's A.M./P.M. indicator for 12-hour clock
        %S:Second as decimal number (00 – 59)
        %U:Week of year as decimal number, with Sunday as first day of week (00 – 53)
        %w:Weekday as decimal number (0 – 6; Sunday is 0)
        %W:Week of year as decimal number, with Monday as first day of week (00 – 53)
        %x:Date representation for current locale
        %X:Time representation for current locale
        %y:Year without century, as decimal number (00 – 99)
        %Y:Year with century, as decimal number
        %z, %Z:Either the time-zone name or time zone abbreviation, depending on registry settings; no characters if time zone is unknown
        %%:Percent sign

按数量
    -n:显示前n条log
按日期
    --after=
        比如git log --after="2014-7-1”,显示2014年7月1号之后的commit(包含7月1号)
        后边的日期还可以用相对时间表示,比如"1 week ago"和”yesterday",比如git log --after="yesterday"
        这里的格式可以是什么?
    --before=
        同上
        另外这两条命令可以同时使用表示时间段,比如git log --after="2014-7-1" --before="2014-7-4"
        另外--since --until和 --after --before是一个意思,都可以用
按作者
    --author=
        比如git log --author=“John",显示John贡献的commit
        注意:作者名不需要精确匹配,只需要包含就行了
        而且:可以使用正则表达式,比如git log --author="John|Mary”,搜索Marry和John贡献的commit
        而且:这个--author不仅包含名还包含email, 所以你可以用这个搜索email
按commit描述
    --grep=
        比如:git log --grep="JRA-224"
        而且:可以传入-i用来忽略大小写
        注意:如果想同时使用--grep和--author,必须在附加一个--all-match参数
按文件
    - -(空格)或[没有]
        有时你可能只对某个文件的修改感兴趣, 你只想查看跟某个文件相关的历史信息, 你只需要插入你感兴趣文件的路径[对,是路径,所以经常是不太好用]就可以了
        比如:git log -- foo.py bar.py ,只返回和foo.py或bar.py相关的commit
        这里的--是告诉Git后面的参数是文件路径而不是branch的名字. 如果后面的文件路径不会和某个branch产生混淆, 你可以省略- -,比如git log foo.py 
        另外,后边的路径还支持正则,比如:git log  *install.md 是,指定项目路径下的所有以install.md结尾的文件的提交历史
        另外,文件名应该放到参数的最后位置,通常在前面加上--并用空格隔开表示是文件
        另外,git log file/ 查看file文件夹下所有文件的提交记录
按分支
    - -
        --branchName branchName为任意一个分支名字,查看某个分支上的提交记录
        需要放到参数中的最后位置处
        如果分支名与文件名相同,系统会提示错 误,可通过--选项来指定给定的参数是分支名还是文件名
            比如:在当前分支中有一个名为v1的文件,同时还存在一个名为v1的分支
            git log v1 -- 此时的v1代表的是分支名字(--后边是空的)
            git log -- v1 此时的v1代表的是名为v1的文件
            git log v1 -- v1 代表v1分支下的v1文件
按内容
    -S"<string>"、-G"<string>"
        有时你想搜索和新增或删除某行代码相关的commit. 可以使用这条命令
        假设你想知道Hello, World!这句话是什么时候加入到项目里去的,可以用:git log -S"Hello,World!"
        另外:如果你想使用正则表达式去匹配而不是字符串, 那么你可以使用-G代替-S.
        这是一个非常有用的debug工具, 使用他你可以定位所有跟某行代码相关的commit. 甚至可以查看某行是什么时候被copy的, 什么时候移到另外一个文件中去的
        注:-S后没有"=",与查询内容之间也没有空格符
按范围
    git log <since>..<until>
        这个命令可以查看某个范围的commit
        这个命令非常有用当你使用branch做为range参数的时候. 能很方便的显示2个branch之间的不同
        比如:git log master..feature,master..feature这个range包含了在feature有而在master没有的所有commit,同样,如果是feature..master包含所有master有但是feature没有的commit
        另外,如果是三个点,表示或的意思:git log master...test 查询master或test分支中的提交记录
过滤掉merge commit
    --no-merges
        默认情况下git log会输出merge commit.  你可以通过--no-merges标记来过滤掉merge commit,git log --no-merges
        另外,如果你只对merge commit感兴趣可以使用—merges,git log --merges
按标签tag
    git log v1.0
        直接这样是查询标签之前的commit
        加两个点git log v1.0.. 查询从v1.0以后的提交历史记录(不包含v1.0)
按commit
    git log commit :查询commit之前的记录,包含commit
    git log commit1 commit2:查询commit1与commit2之间的记录,包括commit1和commit2
    git log commit1..commit2:同上,但是不包括commit1
        其中,commit可以是提交哈希值的简写模式,也可以使用HEAD代替
            HEAD代表最后一次提交,HEAD^为最后一个提交的父提交,等同于HEAD~1
            HEAD~2代表倒数第二次提交

git reflog 查看HEAD和分支引用在过去指向的位置记录

git reflog show [branchname]

git shortlog 日志汇总

# -s 参数省略每次 commit 的注释,仅仅返回一个简单的统计。
# -n 参数按照 commit 数量从多到少的顺利对用户进行排序
git shortlog -s -n

git submodule

git submodule详解

其他操作

git config 配置git操作信息

# 配置git命令(以别名的形式,配置现有的git操作集)
# --add 添加配置项
git config [--local|--global|--system] --add section.key value
# --local 默认项,本地配置,配置文件位置 .git/config
# --global 当前用户全局配置,配置文件位置 ~/.gitconfig
# --system 所有用户全局配置,配置文件位置 /etc/gitconfig

# --add 可省略,默认
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg  # 替代后面一长串

# 全局配置文件修改情况:
# [alias]
#         lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

---
git config alias.llg "log --oneline --all --graph --abbrev-commit"
-----------------------------
# --unset 删除配置信息
git config [--local|--global|--system] --unset section.key

git config --global -–unset alias.lg
# 全局配置文件中该结点信息会被删除

-------------------------------------
-------------------------------------
-------------------------------------
# alias别名设置方式:
# 1. 通过git config配置 (推荐)
# 2. 直接按照格式修改配置文件
# 3. 修改 .bashrc文件

gitee(码云)

如果你知道github的话,把gitee看成国内版本就好了。gitee地址

Gitee 提供免费的 Git 仓库,还集成了代码质量检测、项目演示等功能。对于团队协作开发,Gitee 还提供了项目管理、代码托管、文档管理的服务,5 人以下小团队免费。

gitee 新建仓库

登陆网站>>注册账号>>点击右上头像边的+>>新建仓库

然后,该点的点,该填的填。

这里最后创建上面有个导入已有仓库,可以通过这个位置,把github上的仓库给导入进来。github访问慢的同学,可以通过这样的方式去下载 。
在这里插入图片描述

SSH与gitee

查看系统中是否存在.ssh文件夹(Everything搜吧,一般在C盘的用户目录下,如果不存在:

ssh-keygen -t rsa -C "xxxxx@xxxxx.com"

连续回车键,生成文件。打开.ssh文件夹下的id_rsa.pub,全选复制

打开gitee的设置界面>>SSH公钥>>粘贴进公钥对应的框>>确定

在这里插入图片描述

远程仓库与本地仓库连接

git clone <SSH>

<SSH>为项目地址,可从gitee对应仓库中复制获取。

在这里插入图片描述

第一次使用该命令可能会出现

在这里插入图片描述

输入yes后回车

PS:如果是之前存在.ssh文件夹报错,建议删了按步骤来一遍。

个人git服务器搭建

–bare “裸仓库”

git init 与 git init --bare差异对比

git init albums
tree -aL 2 albums
#####################
albums
└── .git
    ├── branches
    ├── config
    ├── description
    ├── HEAD
    ├── hooks
    ├── info
    ├── objects
    └── refs
######################
git init --bare albums.git
tree -aL 2 albums.git
#####################
albums.git
├── branches
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   └── update.sample
├── info
│   └── exclude
├── objects
│   ├── info
│   └── pack
└── refs
    ├── heads
    └── tags

功能差异

  • --bare参数创建的仓库(albums.git)一般叫“裸仓库”,里面没有工作区的概念,不能直接在仓库里进行正常的git命令操作; 该仓库可以推送的项目文件,但无法对文件进行任何操作。
  • albums仓库 可以直接在上面进行git操作 ,推送(git push)会报错
  • 一般,默认git仓库目录命为directoryName.git;在系统中创建用户名为git的用户,并关闭该用户的bash权限,作为服务器仓库连接用户。

搭建git服务器

设你已经有sudo权限的用户账号,下面,正式开始安装。

无法在root用户下创建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结尾。然后,把owner改为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/bin/git-shell

这样,git用户可以正常通过ssh使用git,但无法登录shell,因为我们为git用户指定的git-shell每次一登录就自动退出。

第六步,克隆远程仓库:

现在,可以通过git clone命令克隆远程仓库了,在各自的电脑上运行:

$ git clone git@server:/srv/sample.git
Cloning into 'sample'...
warning: You appear to have cloned an empty repository.

剩下的推送就简单了。

参考文献

[1] Git 教程

[2] The authenticity of host can’t be established.

[3] 黑马程序员Git全套教程

[4] 搭建Git服务器

[5] Git教程

[6] git log命令全解析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值