代码管理平台SVN(资源)

你要了解的常识

版本控制,记录若干文件内容变化,以便将来查阅特定版本修订情况
版本管理工具发展简史,cvs svn  git 参考http://luckypoem14.github.io/test/2012/04/24/scm-history/
svn全称subversion,是一个开源版本控制系统,始于2000年
git是linux创始人linus发起的,2005年发布,最初目的是更好管理linux内核代码
git和svn不同在于git不需要依赖服务端就可以工作,即git是分布式的
关于git和svn的比较大家参考http://blog.lishiming.net/?p=305
github是基于git的在线web页面代码托管平台,可以选择付费服务
gitlab可以认为是一个开源的github,两者没有直接关系

SVN 简介

Subversion(SVN) 是一个开源的版本控制系統, 也就是说 Subversion 管理着随时间改变的数据。 这些数据放置在一个中央资料档案库(repository) 中。 这个档案库很像一个普通的文件服务器, 不过它会记住每一次文件的变动。 这样你就可以把档案恢复到旧的版本, 或是浏览文件的变动历史。

SVN 的一些概念

  • repository(源代码库):源代码统一存放的地方
  • Checkout(提取):当你手上没有源代码的时候,你需要从repository checkout一份
  • Commit(提交):当你已经修改了代码,你就需要Commit到repository
  • Update (更新):当你已经Checkout了一份源代码, Update一下你就可以和Repository上的源代码同步,你手上的代码就会有最新的变更

更多介绍:http://www.runoob.com/svn/svn-intro.html

安装svn

yum install -y subversion
创建版本库 
mkdir -p /data/svnroot/myproject
svnadmin create /data/svnroot/myproject
cd !$/conf #authz为权限配置文件,passwd为密码文件
vim authz//配置文件改为如下
[groups]
admins = aming,user1
[/]
@admins = rw
*= r
[myproject:/]
user1 = rw

vim passwd//加入如下内容
[users]
aming = aming!(*$123
user1 = user1
^^^123
user2 = user2-***123
vim svnserver.conf          //更改或增加如下内容
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
realm = /data/svnroot/myproject
svnserve -d -r /data/svnroot          //这样就启动了

svnserv -d -r  后面指定的路径,就是你svn的路径。 举个例子,-r 后面跟的路径是/data/svnroot/,而/data/svnroot/下面有myproject目录

那你远程访问myproject时,应该是svn://ip/myproject

实例:

下载

[root@localhsot ~]# yum install -y subversion

创建版本库 

[root@localhsot ~]# mkdir -p /data/svnroot/myproject         ## 创建一个目录来存放工程的版本库       

[root@localhsot ~]#  svnadmin create /data/svnroot/myproject               ## 创建工程的版本库,初始化

b682f9121bd15c2f0bde8f9b1e3360a93f3.jpg

[root@localhsot ~]#   cd !$/conf               #authz为权限配置文件,passwd为密码文件,svnserve.conf为仓库配置文件

 

d676f6d17cb20f7f6f432c294abc6f2f77b.jpg

[root@localhsot ~]#  vim authz             //配置文件改为如下

[groups]
admins = aming,user1                      # 定义用户,可以定义多个 
[/]                                           #指的是/data/svnroot/myproject目录
@admins = rw
*= r                                            #*表示所有,除了aming,其他的用户都是只读
[myproject:/]                                 #指的是项目的名字,user1的项目是rw
user1 = rw

d868204c0abcf29c910296608278ddd5fd1.jpg

[root@localhsot ~]# vim passwd

[users]
aming = aming!(*$123
user1 = user1
^^^123
user2 = user2-***123

fa13133d7bc257365a33d087b19ed7be993.jpg

[root@localhsot ~]# vim svnserver.conf

[general]
anon-access = none                         #匿名用户没有权限
auth-access = write                           #被授权的用户
password-db = passwd                     #用户的密码存放的位置passwd文件
authz-db = authz                       #需要指定文件
realm = /data/svnroot/myproject              #被哪一个项目进行征调

[root@localhsot ~]# svnserve -d -r /data/svnroot     //这样就启动了

9e00b4bf113fb097b4a0ba21062bb30534e.jpg

[root@localhsot ~]# ps aux | grep svn          #查看进程,会出现/data/svnroot 

[root@localhsot ~]#  netstat -lntp              #查看 端口

bc6d24257cb36f76cc35c06d4d589336de4.jpg

e6305798fc55ef502e5071273241b167913.jpg

9107390e24eddae613b8ff7c89cb37a6e36.jpg

当客户端访问服务端时,要看看是否有防火墙规则

[root@localhsot ~]#  iptables -nVL

c052610e6683195dc73893a9228d4ef02dc.jpg

 

客户端上使用svn(linux)

yum install -y subversion
svn checkout svn://192.168.133.130/myproject --username=aming
cd myproject ; ls -la
cp /etc/fstab .
svn add .       //添加到版本控制中心
svn commit -m “add file”             //把文件上传到服务器
svn delete filename          //在本地删除
svn commit -m “delete filename”          //在服务器上删除
svn update            //把当前目录下的文件都更新到最新版
svn log           //查看变更日志

实例:

[root@localhsot ~]# cd /home/

[root@localhsot home]#  mkdir svntest

[root@localhsot home]# svnme=aming checkout svn://192.168.226.130/myproject --username=root

[root@localhsot home]# cd myproject/

 

[root@localhsot myproject]#  cp /etc/fstab .

[root@localhsot myproject]#  ls

5779a153d3f43bb7a9b040d6885c33cfa36.jpg

[root@localhsot myproject]# svnme=aming checkout svn://192.168.226.130/myproject --username=root

e896ffeadea7aede7fd007b0f1305baac3d.jpg

[root@localhsot myproject]# ls

myproject

[root@localhsot myproject]# ls -la myproject/

b4bdf62565833bedadc4f4b91401f8acb60.jpg

 

[root@localhsot myproject]# svn add ./fstab

A               fstab

上传到服务端

[root@localhsot myproject]# svn commit -m "add fstab"

正在增加             fstab

传输文件数据

提交后的版本为1。

 

切换到服务端(01)

[root@localhsot myproject]# cd  myproject/

[root@localhsot myproject]#  ls   

与客户端同步

[root@localhsot myproject]#  svn up                         #先升级

正在升级 ‘.’:

 A   fstab

更新到版本 1。

fstab

[root@localhsot myproject]#  ls                         #查看是否增加了fstab文件

fstab    

[root@localhsot myproject ] #    cd

[root@localhsot ~]# vim /root/.subversion/servers             #查看

 

[root@localhsot ~]#  cd /root/.subversion/

[root@localhsot .subversion]#     ls

auth  config    README.txt servers

[root@localhsot .subversion]#  cd auth/

[root@localhsot auth]# ls

 

svn.simple  svn.ssl.client-passphrase  svn.ssl.server  svnusername

[root@localhsot auth]# cd svn.simple/

[root@localhsot svn.simple]#  ls

nw3kjkq3hjkhwj4khr5jkw

[root@localhsot svn.simple]]#  cat nw3kjkq3hjkhwj4khr5jkw             #查看

e274de9c518be50579fa3062b44172a4ef1.jpg

让用户不记录系统里面,删除他就行了

[root@localhsot svn.simple]#  rm -f  nw3kjkq3hjkhwj4khr5jkw     

[root@localhsot svn.simple]# cd /home/svntest/ 

[root@localhsot svntest]#  ls

myproject

 

在客户端(02)上面操作

[root@localhsot myproject]#  vi fstab             #添加一条内容

在UUID下面添加内容

kjasdhklhjsa

[root@localhsot myproject]#  svn add ./fstab              

[root@localhsot myproject]#  svn commit -m "ch fstab"      #推送到服务端

正在发送      fstab

传输文件数据。

提交后的版本为2。

[root@localhsot myproject]# 

 

在服务端端(01)上面操作

[root@localhsot svntest]# cd myproject/

[root@localhsot myproject]# svn up

[root@localhsot myproject] cat fstab                 #查看fstab生成的文件

 

•在本地删除

[root@localhsot myproject]# svn delete fstab               #删除不彻底

D           fstab

[root@localhsot myproject]#  svn commit -m "delete fstab"           #彻底删除

正在删除                 fstab

 

提交后的 版本为3.

[root@localhsot myproject]#  svn  up 

正在升级 ‘.’:

 D   fstab

更新到版本 3。

[root@localhsot myproject]#  svn log              #查看变更历史

 

客户端上使用svn(windows)

官网 https://tortoisesvn.net/index.zh.html
下载TortoiseSVN 并安装
简明教程 http://www.jianshu.com/p/6b3b7b915332

实例:

下载小乌龟

82477bb02660ef1c4fce4243bbadf8704df.jpg

0e7d4ce25849f9f3c909b06f5fd45e0be46.jpg

在桌面上面右击,查看安装

76c69565939b718ca04b96dca932e207298.jpg

创建一个myproject,然后右击选着SVN Checkou,     点击OK,

1fdbcfb63d6bab46d870db19ad736513459.jpg

ab1456ec5b02479fb9fa632eb3bf4e0bbbb.jpg

创建一个文档,并写入数据,添加到服务端。选中文档右击,找到ADD

6d7874574b576450dbe15cdf45898a7733e.jpg

0ca58aad5ce49896fca401a8c600fc9d1da.jpg

99697b26b1153559f96ab831353c864cf53.jpg

3ca18deacfc85354a51fb05aca488963565.jpg

da6e863d246f65adcc24edd4df0791038dd.jpg

在客户端(01)上面,执行,

[root@localhsot myproject]#  svn up

正在升级 ‘.’:

A    123.txt

更新到新颁布 7。

[root@localhsot myproject]#  ls

123.txt

[root@localhsot myproject]#  cat 123.txt

aas
a
sd
ad

 

[root@localhsot myproject]#  vim 111.txt

oisddls

sd

sd

asd

[root@localhsot myproject]#  svn add 111.txt

[root@localhsot myproject]#  svn commit -m "add 111.txt"

正在增加        111.txt

传输文件数据。

提交后的版本为8。

 

在windows上面更新

f4492a42529ff4a5b8f434f9b88a7492a1c.jpg

6bde6eb00adaf0c9172d7af3e596a7cd8b0.jpg

67308214d071bbcbcb18c742846695547fd.jpg

 

单机上使用git

• yum install -y git

• mkdir /data/gitroot

• cd /data/gitroot

• git init //初始化仓库

• echo -e  “123\naaa\n456\nbbb” > 1.txt //创建一个新文件

• git add 1.txt//把1.txt添加到仓库

• git commit -m “add new file 1.txt”   //add完了必须要commit才算真正把文件提交到git仓库里

• 再次更改1.txt

• git status  //查看当前仓库中的状态,比如是否有改动的文件

• git diff 1.txt  //可以对比1.txt本次修改了什么内容,相比较仓库里面的版本

实例:

下载

[root@localhost ~]# yum install -y git

[root@localhost ~]# mkdir /data/gitroot                           #创建gitroot   目录

[root@localhost ~]# cd /data/gitroot                                #切换到gitroot   目录

[root@localhost gitroot]# ls

[root@localhost gitroot]#git init                                       # 初始化仓库

9c6086a55106c3d41f9bf0a5ee570d0fe1b.jpg

[root@localhostgitroot]#ls -la

总用量 0
drwxr-xr-x. 3 root root  18 6月  30 16:13 .
drwxr-xr-x. 4 root root  36 6月  30 16:12 ..
drwxr-xr-x. 7 root root 119 6月  30 16:13 .git

 

[root@localhost gitroot]# ls .git/

branches  config  description  HEAD  hooks  info  objects  refs

4b481a438857d4425b91f1924e3d5af64f6.jpg

[root@localhost gitroot]# vim 1.txt

sad

asd

asd

[root@localhost gitroot]#  git add 1.txt                                  #把文件添加到仓库里面

[root@localhost gitroot]# git commit -m "add 1.txt"
[maste  (根提交) c123] add 1.txt

1   file changed,  4  insertions(+)

create mode 10064 1.txt

33dda195a16b4b1636dad6fa58f44d88059.jpg

[root@localhost gitroot]# vim 1.txt

sad

asd

asd

as

[root@localhost gitroot]# git add 1.txt

[root@localhost gitroot]# git commit -m “add  1.txt agin”

 

 

[root@localhost gitroot]# git status

#   位于分支  master

无文件要提交,干净的工作区

[root@localhost gitroot]# git diff 1.txt                          #相比较仓库里面的版本

diff   --git a/1.txt b/1.txt

idnex  908809..789789 100644

--- a/1.txt

+++ b/1.txt

@@ -4,3 +4,4  @@ asdjk

sad

asd

asd

+as

 

版本回退
多更改几次1.txt,然后add,commit
git log//查看所有提交记录
git log --pretty=oneline//一行显示
git reset --hard f7c8e9//回退版本,其中后面跟的字符串是简写
撤销修改
rm -f 1.txt//不小心删除了1.txt
git checkout -- 1.txt//恢复1.txt
如果1.txt文件修改,add后但没有commit,再想回退到上一次提交的状态,可以使用git reset HEAD 1.txt,再执行git checkout -- 1.txt
git reflog //查看所有历史版本

实例(机器同上):

[root@localhost gitroot]# git add 1.txt 

[root@localhost gitroot]# git commit -m "add 1.txt agin"

[master f83b2hj3j] add 1.txt agin

   1 file   changed,   1  insertion(+)

[root@localhost gitroot]# vim 1.txt

sad

asd

as

[root@localhost gitroot]# git add 1.txt

[root@localhost gitroot]# git commit -m "ch 1.txt agin"

[master f83b2hj3j] ch 1.txt agin

   1 file   changed,   1  deletion(-)

[root@localhost gitroot]#   git log     #查看记录

[root@localhost gitroot]# ls

1.txt

[root@localhost gitroot]# cd .git/

[root@localhost .git]# ls

branches   COMMIT_EDITMSG   config description HEAD   hooks info    logs    objecks  refs

[root@localhost .git]# cat config

[core]

           repositoryformatversion = 0

           filemode  = true

           bare  =  false

           loggallrefupdates = true

[root@localhost .git]# cat /root/.

 

[root@localhost .git]#  cat /root/.gitconfig

[user]

        email = lisi@lishiming.net

        name = lisi

[push]

       default = matching

[root@localhost .git]# git log

[root@localhost .git]# git log --pretty=oneline                           #让git log看起来更清楚

aw324jkh234kh23k4h3223k4bhkj2bj2k33    ch    1.txt agin

s879df7dfsjadfjkhsdjkfhkjshdfkjhbsbdjkfj     add 1.txt agin

87usd832jk4bjk23bh4jk23hn45jk2hn3jk       add 1.txt agin

c55342jhik23hj4ihj234hjjk23h4kj23h4kj        add 1.txt

 

版本回退

[root@localhost .git]# cd ..

[root@localhost gitroot]# ls

1.txt

[root@localhost gitroot]# git reset --hard 12ku3hjk12h3kh

HEAD   现在位于  f33uh add 1.txt agin

[root@localhost gitroot]# git log --pretty=oneline   

s879df7dfsjadfjkhsdjkfhkjshdfkjhbsbdjkfj     add 1.txt agin

87usd832jk4bjk23bh4jk23hn45jk2hn3jk       add 1.txt agin

c55342jhik23hj4ihj234hjjk23h4kj23h4kj        add 1.txt

 

恢复s879df7dfsjad

[root@localhost gitroot# git reset --hard s879df7dfsjad

[root@localhost gitroot]# git log --pretty=oneline                     #发现只有两条日志了

87usd832jk4bjk23bh4jk23hn45jk2hn3jk       add 1.txt agin

c55342jhik23hj4ihj234hjjk23h4kj23h4kj        add 1.txt

 

[root@localhost gitroot]#  git reflog                   #查看以前恢复的版本

 

恢复删除的文件

[root@localhost gitroot]# rm -f 1.txt

[root@localhost gitroot]# ls

[root@localhost gitroot]# git checkout -- 1.txt 

[root@localhost gitroot]# ls

1.txt

如果1.txt文件修改,add后但没有commit,再想回退到上一次提交的状态,可以使用git reset HEAD 1.txt,再执行git checkout -- 1.txt

[root@localhost gitroot]# vim 1.txt                    #修改文档

asd

asd

sad

a

[root@localhost gitroot]# git add 1.txt

[root@localhost gitroot]# git reset HEAD 1.txt                    #去掉add的标记

重置后撤出暂存区的变更:

M        1.txt

[root@localhost gitroot]# git checkout -- 1.txt    #撤销上一步

[root@localhost gitroot]# cat 1.txt

asd

asd

sad

a

 

删除文件 
echo -e "11111111111\n2222222222" > 2.txt 
git rm 2.txt 
git commit -m "rm 2.txt"

实例:

[root@localhost gitroot]#  git rm 1.txt

rm '1.txt'

[root@localhost gitroot]# git commit -m "rm 2.txt"                      #彻底删除了

[master cab660a] delete 1.txt

1 file changed,6  deletions(.)

delete mode 100644 1.txt

[root@localhost gitroot]# ls

恢复

[root@localhost gitroot]# git log --pretty=online

[root@localhost gitroot]# git reset --hard a66026e30

0775ca0cf64790c13f14b974caad9d8e793.jpg

[root@localhost gitroot]# ls                   #恢复成功了

1.txt

[root@localhost gitroot]# cat 1.txt

 

建立远程仓库

首先到 https://github.com 注册一个账号,创建自己的git,点repositories 再点new
名字自定义,比如叫studygit 选择public 点 create repository
添加key:右上角点自己头像,选择settings,左侧选择SSH and GPG keys
左侧点New SSH key,把linux机器上的~/.ssh/id_rsa.pub内容粘贴到这里
把本地仓库推送到远程仓库 git remote add origin git@github.com:aminglinux/studygit.git //这一步是在远程创建一个新的仓库studygit,名字尽量和本地的一致
git push -u origin master //然后把本地的studygit仓库推送到远程的studygit
下一次再推送,就可以直接 git push

实例:

注册

1c5140d338b2088fd4849536ef1fffd385b.jpg

a605d965e1ef3353d358c2ecd804b5f3a8c.jpg

创建一个项目

d0c32bc7e7d8ba68da39b95763c626546a3.jpg

ec26640bdc5fbee7f9cef262f8c4eb5fc15.jpg

6f92e2e763ab2ebd37c8f0ab1c0de2fa017.jpg

创建完成

 

添加秘钥,验证

1ec5e8b90d415acc1aa67e3ffa657c7a480.jpg

00b7e8e0307b7e0c8ddac1dcbba7bebae87.jpg

在机器(01)上面操作

[root@localhost ~]# ssh-keygen                             #查看秘钥

[root@localhost ~]# cat .ssh/id_rsa.pub                 #查看生产的秘钥

d4106c4fa3d136da07aa63767d506859462.jpg

 

在客户端(01机器)上面创建仓库,写好东西之后,发送到远程端上。

bddf1a3f9352f4ecf8b62883e35acdc6f36.jpg

链接地址:https://github.com/wzqlinux/localhost

在客户端(01机器)上

【root@localhost ~】# cd /tmp/

【root@localhost tmp】# mkdir localhost                      #如果已经存在了,删除执行下一步

【root@localhost tmp】# rm -rf localhost/              #再次 mkdir localhost创建        

【root@localhost tmp】# cd localhost/

 

创建一个新的存储库。

【root@localhost localhost】# echo "# localhost" >> README.md
【root@localhost localhost】# git init

初始化空的Git版本库于/tmp/localhost/.git/

【root@localhost localhost】# ls -la
总用量 8
drwx-xr-x   3  root  root    35   10月 18 08:80 .
drwxrwxret. 7  root  root    7868 10月 18 08:80 ..
drwxrwxret. 7  root  root    7868 10月 18 08:80 .git
【root@localhost localhost】# git add README.md
【root@localhost localhost】# git commit -m "first commit"
【root@localhost localhost】# git remote add origin https://github.com/wzqlinux/localhost.git                 #执行这一条,下面没有显示,说明执行错成功了
【root@localhost localhost】# git push -u origin master

219626f684404f5538dd2e7144dad82621c.jpg

原因:是之前已经创建了一个,重新创建一个就行了

d83d7c3eba4f648b07df98910ad4c38584a.jpg

【root@localhost localhost】# ls

README.md

【root@localhost localhost】# vim 2.txt              #编译一个新的文件

asdfasasd

asdsd

【root@localhost localhost】# git add 2.txt

【root@localhost localhost】#git commit -m "add 2.txt"

[master 32hjb1hj2] add 2.txt

   1 file  changed ,  3 insertions(+)

   create mode 100644 2.txt

【root@localhost localhost】#git push                       #推到远程上面

【root@localhost localhost】# git remote add origin https://github.com/wzqlinux/localhost.git

然后刷新gitHUB  ,下面中间显示的注释

6a314f6d9dbda3155a2bbba11ef862a46bc.jpg

 

 

 

克隆远程仓库(在工作中常用)

cd /home
git clone git@github.com:aminglinux/lanmp.git
它提示,会在当前目录下初始化一个仓库,并创建一个.git的目录,如下
Initialized empty Git repository in /home/lanmp/.
git/完成后,ls可以看到一个lanmp的目录
cd lanmp
vi lanmp.sh 编辑一下文件,然后提交
git add lanmp.sh
git commit -m "sdlfasdf" 
然后再推送到远程服务端
git push

实例:

在GitHub上面,找一个项目,复制要克隆的链接

235df3cb5b131b1c4afa0d0fd01157502da.jpg

 

在客户端(01机器)上

【root@localhost localhost】# cd /home
[root@localroot home]# ls
【root@localhost home】# git clone git@github.com:aminglinux/lanmp.git    #没有上传公钥,也可以执行这一步
【root@localhost home】# cd lamp/
【root@localhost lamp】# ls
lamp.sh      README.md
【root@localhost lamp】# ls -l
总用量 20
-rw-r--r--  1  root root 17861 6月 12:23 lamp.sh
-rw-r--r-- 1   root root 17861 6月 12:23 README.md
【root@localhost lamp】# vim README.md
#lamp
lamp/lnmp  一键安装脚本
author:aming
version :  0.2
sdssdsdf
asdf

把更改的文件上传到服务端

【root@localhost lamp】# git add README.md

【root@localhost lamp】# git commit -m "change readme.md"

【root@localhost lamp】#git push                   #推到服务端

回到GitHub上面刷新

08b66b0d2a0f175fd4cbc6de267ceb1754b.jpg

选中lamp.sh,然后修改

321040d5131d04db4606082e75d9b7130f6.jpg

ce99a4731542edd69884b167232d480f2d9.jpg
 

在客户端(01)上面更新

【root@localhost lamp】# git pull                   #把上面更改的内容下拉下来
【root@localhost lamp】# cat README.MD     #查看README.MD是否更新了

 

 

分支管理

git branch    //查看分支
git branch aming      //创建分支
git checkout aming    //切换到了aming分支下
再用git branch查看,会看到有两个分支master和aming,当前使用的分支前面会有一个*在aming分支下 ,编辑2.txt,并提交到新分支
echo "askdfjlksadjflk" > 2.txt
git add 2.txt
git commit -m "laksjdflksjdklfj" 
切换回master分支
git checkout master //此时cat 2.txt发现并没有更改内容

注意:

两个分支的的不同会在

<<<<<<< HEAD

>>>>>>> aming

之间展示。

而<<<之前或>>>之后的部分是两个分支都相同的地方

实例:

在本地的仓库里面查操作

在客户端(01机器)上

【root@localhost ~】# cd /data/gitroot
[root@localroot gitroot]# git branch                    #//查看仓库里面分支

* master                #星号代表当前的分支,是哪一个。

[root@localroot gitroot]# git branch aming      //创建分支
[root@localroot gitroot]# git branch 

aming

* master                            #* master  说明还在master分支上面     

[root@localroot gitroot]# ls                           #查看master分支下的文件

 1.txt

[root@localroot gitroot]# git checkout aming           //切换到了aming分支下

切换到分支‘aming’

[root@localroot gitroot]#  git branch                   #查看分支

* aming

master     

[root@localroot gitroot]# ls                           #查看阿明分支下的文件

1.txt

[root@localroot gitroot]# vim 2.txt       #新创建一个文件,做测试

sdf

sd

ffsd

[root@localroot gitroot]# git add .
[root@localroot gitroot]# git -m "add 2.txt"
[root@localroot gitroot]# git push                       #推到

ecae1f5b2f4ee2e29a9272770794ddcf658.jpg

原因:没有配置远程的窗口,git push 使用前提:有一个远程的仓库,本地和远程同步的时候。

[root@localroot gitroot]# ls

1.txt    2.txt

[root@localroot gitroot]# git checkout master                     #切换到master分支下
[root@localroot gitroot]# ls                             #没有2.txt。说明分支是隔离开的

1.txt 

 

分支的合并

git checkout master //合并分支之前,先切换到目标分支 
git merge aming //把aming分支合并到了master
如果master分支和aming分支都对2.txt进行了编辑,当合并时会提示冲突,需要先解决冲突才可以继续合并。
解决冲突的方法是在master分支下,编辑2.txt,改为aming分支里面2.txt的内容。 然后提交2.txt,再合并aming分支。
但是这样有一个问题,万一master分支更改的内容是我们想要的呢? 可以编辑2.txt内容,改为想要的,然后提交。切换到aming分支,然后合并master分支到aming分支即可(倒着合并)。合并分支有一个原则,那就是要把最新的分支合并到旧的分支。也就是说merge后面跟的分支名字一定是最新的分支。
git branch -d aming //删除分支
如果分支没有合并,删除之前会提示,那就不合并,强制删除
git branch -D aming


 

实例:

在客户端(01机器)上

[root@localroot gitroot]# git branch                       #切换到master分支上去

    aming

*  master

[root@localroot gitroot]# git merge aming         //把aming分支合并到了master
[root@localroot gitroot]# ls                           #合并完成之后,下面出现2。txt

1.txt    2.txt

 

做一些变更

[root@localroot gitroot]# vim 2.txt                   #在2.txt中添加一些内容

sdjkfh

sdf

sdfsdf

[root@localroot gitroot]# git add 2.txt
[root@localroot gitroot]# git commit -m "ch 2.txt"

[master 257sd] ch 2.txt

1 fiel changed, 2 inserts(+)

[root@localroot gitroot]# git checkout aming                      #切换到amingf分支

切换到amingf分支

[root@localroot gitroot]# vim 2.xtx

j32

23kj

23j4

更改阿明下的2.txt文件

[root@localroot gitroot]# git add 2.txt
[root@localroot gitroot]# git commit -m "ch 2.txt"

[master 81sdg7] ch 2.txt

1 fiel changed, 2 deletions(-)

 

分支管理

合并aming到master分支下

[root@localroot gitroot]# git checkout master
[root@localroot gitroot]# git merge aming
[root@localroot gitroot]# cat 2.txt                  #上面是master分支下的内容,地下是aming分支下的内容。

b465c5361d309c2b840b01071c0b8b1c50b.jpg

22a00795cdead2c6fa83b8722e423a396f9.jpg

原因:两个文件的修改的内容不一样。把这两个文件内容,设置成一样的

解决办法:

44329e8b0330f2f3052512cd082f1d25d5f.jpg

[root@localroot gitroot]# vim 2.txt                       #修改2.txt文件

c87e6186e34b1628e3f4858a30570a30213.jpg

[root@localroot gitroot]# git checkout aming

e5aace5072f74290c850f8c219ee6192b05.jpg

[root@localroot gitroot]# git merge aming

b5c35844b5e9a35bc779164304fbad868ec.jpg

[root@localroot gitroot]# git commit -a              #查看一些提示信息
[root@localroot gitroot]# git add 2.txt
[root@localroot gitroot]# git commit -m "ch 2.txt"

581eff7d37adc5b4bdd82c109c2add968b7.jpg

再一次合并

[root@localroot gitroot]# git merge aming

Already up-to-date.

 

切换到aming分支

[root@localroot gitroot]# git checkout aming

切换到‘aming分支’

查看2.txt文件

[root@localroot gitroot]# cat 2.txt

删除分支aming

[root@localroot gitroot]# git branch -d aming

8c0bc244902382aadbd17e7f709dcfcc420.jpg

原因:你在aming分支里面

切换到aming分支,然后再删除。

[root@localroot gitroot]# git checkout master
[root@localroot gitroot]# git branch -d aming

如果上面的删除不了,执行这一步强制删除aming

[root@localroot gitroot]# git branch -D aming

使用分支的原则

对于分支的应用,建议大家以这样的原则来:
master分支是非常重要的,线上发布代码用这个分支,平时我们开发代码不要在这个分支上。
创建一个dev分支,专门用作开发,只有当发布到线上之前,才会把dev分支合并到master
开发人员应该在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支

0526bc42a89c0306ac4393b8fec438e42cc.jpg

dev分支合并bob分支的命令是:
git checkout dev //先切换到dev分支,然后
git merge bob

master的分支不动,master合并的时候才会动,dev的分支用做开发,在dev的基础上再分支成个人分支,个人分支(在自己pc上)里面开发代码,然后合并到dev分支,然后dev合并到master  分支的合并原则

远程分支

本地新建的分支如果不推送到远程,对其他人就是不可见的
查看远程分支 git ls-remote origin,可以看到所有分支
对于git push分支分两种情况
当本地分支和远程分支一致时


git push会把所有本地分支的变更一同推送到远程,如果想只推送一个分支,使用git push origin branch-name


当本地分支比远程分支多,默认git push 只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用git push origin branch-name 如果推送失败,先用git pull抓取远程的新提交


git clone的时候默认只把master分支克隆下来,如果想把所有分支都克隆下来,需要手动创建,在本地创建和远程分支对应的分支,使用git checkout -b branch-name origin/branch-name,本地和远程分支的名称要一致

 

实例:

1d372b6e95938fe96f434be75af73efce8d.jpg

2cbff080a9b7e67e75d7a12a3659493cbc5.jpg

创建新的项目名

7640637a0a5c6243bb657b996250e4e52cf.jpg

26ac23edac369f2f50faf8dfff3dcdc6ffb.jpg

格式化

013db1354fbc42c568b3f44a2d615b86ea2.jpg

 

另一种克隆方法:在命令行下格式化:把这个项目,克隆岛本地上,在本地操作,同步到远程上面

创建分支

d480375e4ece71d3c439035e776c5ce44d7.jpg

把仓库克隆到本地

[root@localroot gitroot]# cd /tmp
[root@localroot tmp]# git clone git@github.com:aminglinux/apelearn.git          #克隆
[root@localroot tmp]# cd apelearn/
[root@localroot apelearn]# ls

linux.doc    README.md

查看分支

[root@localroot apelearn]# git branch

* master

查看远程所有的分支

[root@localroot apelearn]# git ls-remote origin

23jkw3bjkb23kj4b2323j4n2332            HEAD

4jk43jkb23kjb4jk23b4jk23bkl4             refs/heads/dev

jk23jk4h23kjh4nkj23n4lk23jn4             refs/heads/master

 

把所有的分支都克隆下来,手动创建,在本地创建和远程分支对应的分支

 

[root@localroot apelearn]# git checkout -b dev origin/dev                要远程分支的名字dev

分支dev设置为跟踪来自origin的远程分支dev.

切换到一个新的分支‘dev’

[root@localroot apelearn]# git branch

* dev

   master

[root@localroot apelearn]# ls

linux.doc         README.md

 

更改dev分支下的文件

[root@localroot apelearn]#  vim 2.txt                    #新建一个文件

aa

bb

cc

[root@localroot apelearn]# git  add 2.txt
[root@localroot apelearn]# git commit -m "ch 2.txt"

[dev 56757] ch 2.txt

1 file  changed ,2 insertions(+)

    create mode 100644  2.txt

把增加的内容,推送到远程上面

[root@localroot apelearn]# git push                          #推送到远程上面

        8c23hh23..3b434j    dev -> dev

 

推送分支的种类

git push会把所有本地分支的变更一同推送到远程,如果想只推送一个分支,使用git push origin branch-name

[root@localroot apelearn]# git push origin dev            #只推送一个分支dev

 

• 当本地分支比远程分支多,默认git push 只推送本地和远程一致的分支,想要把多出来的本地分支推送到远程时,使用git push origin branch-name  如果推送失败,先用git pull抓取远程的新提交

新建一个分支dev2

[root@localroot apelearn]# git branch dev2               新建一个分支dev2
[root@localroot apelearn]# git branch                     查看分支

* dev

  dev2

  master

[root@localroot apelearn]# git checkout dev2

切换到分支'dev2'

[root@localroot apelearn]# ls

2.txt    linux.doc  README.md

[root@localroot apelearn]# vim 3.txt

aaaaaaaaaa

bbbbb

[root@localroot apelearn]# git add 3.txt
[root@localroot apelearn]# git commit -m "add 3.txt"

[dev2 c67b32] add 3.txt

   1 file changed ,1 insertion(+)

   create mode 100644 3.txt

[root@localroot apelearn]# git push                 #查看新创建的分支

Everything up-to-date                       #最新的,不需要更新

 

把新创建的dev2推送到远程上面

[root@localroot apelearn]# git push origin dev2      把新创建的dev2推送到远程上面

      * [new branch ]      dev2 > dev2

 

刷新页面,查看新创建的dev2

8860d73aa88afc8401f5bef5b7d54970d44.jpg

 

标签管理
标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。
git checkout master 先切到master分支上
git tag v1.0 给master打一个标签v1.0
git show v1.0 查看标签信息
git tag 可以查看所有的标签
tag是针对commit来打标签的,所以可以针对历史的commit来打tag
git log --pretty=oneline --abbrev-commit //先查看历史的commit
git tag v0.9 46d3c1a //针对历史commit打标签
git tag -a v0.8 -m "tag just v1.1 and so on" 5aacaf4 //可以对标签进行描述
git tag -d v0.8 //删除标签
git push origin v1.0 //推送指定标签到远程
git push --tag origin //推送所有标签
如果本地删除了一个标签,远程也想要删除需要这样操作:
git tag v1.0 -d //删除本地标签
git push origin :refs/tags/v1.0 //删除远程标签

实例:

给master打标签

[root@localroot apelearn]# git checkout master         先切到master分支上

切换到分支 ‘master’

[root@localroot apelearn]# git tag v1.0         给master打一个标签v1.0
[root@localroot apelearn]#  git show v1.0      查看标签信息
[root@localroot apelearn]# git tag      可以查看所有的标签

v1.0

[root@localroot apelearn]# git show v1.0       查看标签信息

tag是针对commit来打标签的,所以可以针对历史的commit来打tag

[root@localroot apelearn]# git log --pretty=oneline  查看当前的commit

46152c9de3b3c366241afc6765a7eb3a709.jpg

[root@localroot apelearn]# git log --pretty=oneline --abbrev-commit     //先查看历史的commit,,,,,,显示简写的commit

 

针对历史commit打标签

[root@localroot apelearn]# git tag v0.8 3cff3f23f          //针对历史commit打标签
[root@localroot apelearn]# git tag

v0.8

v0.9

[root@localroot apelearn]# git tag -a v0.8 -m "first ltag" 5aacaf4 //可以对标签进行描述
[root@localroot apelearn]#  git tag -d v0.8       //删除标签

推送指定标签到远程

[root@localroot apelearn]#  git push origin v1.0      //推送指定标签到远程

f3a70466f7dcf0f47dcbd725c99d0432c20.jpg

[root@localroot apelearn]#  git push --tag origin     //推送所有标签

 如果本地删除了一个标签,远程也想要删除需要这样操作

[root@localroot apelearn]# git tag v1.0 -d    //删除本地标签
[root@localroot apelearn]#•git push origin :refs/tags/v1.0   //删除远程标签

 

git别名
git commit 这个命令是不是有点长? 用别名可以提高我们的工作效率
git config --global alias.ci commit
git config --global alias.co checkout
git config --global alias.br branch
查看git别名使用命令
git config --list |grep alias
查询log小技巧:
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 config --global --unset alias.br

实例:

[root@localroot gitroot]# git config --global alias.ci commit

查看git别名使用命令

[root@localroot gitroot]# git config --list |grep alias

取消别名

[root@localroot gitroot]# git config --global --unset alias.br
[root@localroot gitroot]#
[root@localroot apelearn]#
[root@localroot apelearn]#
[root@localroot apelearn]#

 

 

搭建git服务器

     git服务器平时是不动的,我们从服务器端克隆一个远程仓库到客户端,平时写什么代码就在本地克隆的仓库去写,然后把修改的内容push到远程的git服务器仓库实现修改。
      github毕竟是公开的,而私有仓库又得花钱买。所以我们可以想办法搭建一个私有的,只自己公司使用的。Gitlab是个不错的选择。在介绍它之前,先讲述一下命令行的git服务器
找一台服务器,首先要安装git,yum install git 
添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆
useradd -s /usr/bin/git-shell git 
cd /home/git
创建authorized_keys文件,并更改属主、属组和权限,用来存客户端机器上的公钥
mkdir .ssh
touch .ssh/authorized_keys
chown -R git.git .ssh
chmod 600 .ssh/authorized_keys

定好存储git仓库的目录,比如 /data/gitroot
mkdir /data/gitroot
cd /data/gitroot
git init --bare sample.git // 会创建一个裸仓库,裸仓库没有工作区,因为服务器上的Git仓库纯粹是为了共享,所以不让用户直接登录到服务器上去改工作区,并且服务器上的Git仓库通常都以.git结尾
chown -R git.git sample.git
以上操作是在git服务器上做的,平时git服务器是不需要开发人员登录修改代码的,它仅仅是充当着一个服务器的角色,就像github一样,平时操作都是在我们自己的pc上做的
首先要把客户端上的公钥放到git服务器上/home/git/.ssh/authorized_keys文件里
在客户端上(自己pc)克隆远程仓库
git clone git@ip:/data/gitroot/sample.git
此时就可以在当前目录下生成一个sample的目录,这个就是我们克隆的远程仓库了。进入到这里面,可以开发一些代码,然后push到远程。

实例:

在一台新的虚拟机上面操作,搭建git服务器

[root@localroot ~]# yum install git 

添加git用户,并且设置shell为/usr/bin/git-shell,目的是为了不让git用户远程登陆

[root@localroot ~]# useradd -s /usr/bin/git-shell git 
[root@localroot ~]# cd /home/git

创建authorized_keys文件,并更改属主、属组和权限,用来存客户端机器上的公钥

[root@localroot git]# mkdir .ssh
[root@localroot git]# touch .ssh/authorized_keys
[root@localroot git]# chown -R git.git .ssh
[root@localroot git]# chmod 600 .ssh/authorized_keys

85d64339046f69d191e9fc58877d7131e5d.jpg

在客户端虚拟机(01)

[root@localroot ]# cat .ssh/id_rsa.pub                  #查看密钥

然后把密钥粘贴到02虚拟机.ssh/authorized_keys中,也就是新建的虚拟机

[root@localroot git]# vi .ssh/authorized_keys

在客户端虚拟机(01)(192.168.133.132是新建的02虚拟机上面)

[root@localroot git]# ssh git@192.168.133.132

dec79f9955b4f521313633f2b2245182a47.jpg

这样的提示说明没问题,说明验证超成功了。不允许登陆

在新建的虚拟机(02服务端

初始化仓库

[root@localroot git]# cd /data/
[root@localroot data]# mkdir /data/gitroot
[root@localroot gitroot]# cd  /data/gitroot
[root@localroot gitroot]# git init --bare sample.git

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

初始化k空的Git仓库于  /data/gitroot/sample.git/

[root@localroot gitroot]# ls

sample.git

设置一个数组

[root@localroot git]# chown -R git.git sample.git

 

在客户端(01)上(自己pc)克隆远程仓库
git clone git@ip:/data/gitroot/sample.git

[root@localroot git]# git clone git@192.168.133.132:/data/gitroot/sample.git
[root@localroot git]# cd sample/
[root@localroot sample]# ls -la

总用量

drwx-xr-x     3   root root  18 6月  18 15:33 .

dr-x-xr-x--   25   root root  18 6月  18 15:33 ..

drwx-xr-x     7    root root  18 6月  18 15:33 . git

[root@localroot sample]# cp /etc/init.d/

123  function mariadb  mysqld    netconsole   network   nginx  php-fpm   README

[root@localroot sample]# cp /etc/init.d/mysqld .
[root@localroot sample]# git add .
[root@localroot sample]# git commit -m "add new file"

[master (根提交) d1ddd2hjg]  add  new  file

  1  file  changed 100755 mysqld (+)

  create mode 100755 mysqld

[root@localroot sample]# git push

5c3c4ef40654556175057ee9bf04c108677.jpg

原因:没有选择branch

解决版本:设置一个仓库,push的时候加上分支

[root@localroot sample]#  git push origin master

ad54c9fe61b8820a87778bb7a7d83b77787.jpg

再做一个变更

[root@localroot sample]# echo "sidhfksd" > 222.txt
[root@localroot sample]# git add 222.txt
[root@localroot sample]# git commit -m "add 22.txt"

e3ca2ff7667f27153f9bd02c4e802bad84f.jpg

[root@localroot sample]# git push

fa0615a62a859c0ba07453812126884d293.jpg

做一个测试

[root@localroot sample]#  cd ..
[root@localroot ~]# cd /tmp/

把刚才的测试,项目仓库克隆下来,把代码推送到服务端

[root@localroot tmp]# git clone git@192.168.133.132:/data/gitroot/sample.git

1a4b69d9203bdaf79210f5c50c3faf6d285.jpg

[root@localroot tmp]# ls sample/

222.txt   mysqld

[root@localroot tmp]# cd sample/
[root@localroot sample]# vim 222.txt                #修改 222.txt

222

33

[root@localroot sample]# git commit -m "ch 222.txt"

6d235e7976babcd968ab57cc28d1cf65d6e.jpg

[root@localroot sample]# git push

1be112c63c81af451e16c004c672261b799.jpg

[root@localroot sample]# cd /root/sample/
[root@localroot sample]# ls

222.txt    mysqld

[root@localroot sample]# git pull                             #拉取222.txt 

f76210d94ee4c4947bc72e8ca54e5223e4c.jpg

[root@localroot sample]# cat 222.txt 

222

33

 

 

使用gitlab

      GitLab是利用 Ruby on Rails 一个开源的版本管理系统,实现一个自托管的Git项目仓库,可通过Web界面进行访问公开的或者私人项目。它拥有与Github类似的功能,能够浏览源代码,管理缺陷和注释。可以管理团队对仓库的访问,它非常易于浏览提交过的版本并提供一个文件历史库。团队成员可以利用内置的简单聊天程序(Wall)进行交流。它还提供一个代码片段收集功能可以轻松实现代码复用,便于日后有需要的时候进行查找。
gitlab官网 https://about.gitlab.com/gitlab-com/
官方安装文档 https://about.gitlab.com/installation/?version=ce#centos-7 (ce/ee)
要求服务器内存不少于2g
vim /etc/yum.repos.d/gitlab.repo//加入如下内容
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
yum install -y gitlab-ce
gitlab-ctl reconfigure
netstat -lnpt //查看监听端口
gitlab-ctl stop/restart/start/status
浏览器访问gitlab,输入ip即可
默认管理员root,无密码,它会让我们去定义一个密码
gitlab常用命令 https://www.cnyunwei.cc/archives/1204
gitlab备份 gitlab-rake gitlab:backup:create
备份目录在/var/opt/gitlab/backups
gitlab 恢复 先停服务 gitlab-ctl stop unicorn ; gitlab-ctl stop sidekiq
gitlab-rake gitlab:backup:restore BACKUP=xxxxx (这里是一个编号,即备份文件的前缀)
再启动服务 gitlab-ctl start

实例:

e2076b6728abe13b26ccf4b5ef145199467.jpg

532b89ececeef20e8e364cb38e644f02ba5.jpg

在虚拟机(01)上面操作,配置镜像

[root@localroot ~]# vim /etc/yum.repos.d/gitlab.repo//加入如下内容

[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1

[root@localroot ~]# yum install -y gitlab-ce
[root@localroot ~]# gitlab-ctl reconfigure              #启动服务
[root@localroot ~]# ps aux | grep git

b208d42b2570fce72e81fc5d1f4b14b9b66.jpg

deffb233197275ce7dab1060a4196157095.jpg

[root@localroot g~]# netstat -lnpt //查看监听端口

停掉系统中的nginx服务

[root@localroot ~]# /etc/init.d/nginx stop
[root@localroot ~]# chkconfig nginx off

 

[root@localroot ~]# gitlab-ctl stop/restart/start/status   #/停止/重启/

如果有redis.server,停掉他

[root@localroot ~]# killall redis.server

启动服务

[root@localroot ~]#gitlab-ctl start

b37403dfc2927b276cf8a2b347f4188674c.jpg

查看是否IPTABLES规则,如果有就开放80端口

[root@localroot ~]# iptables -nvL
[root@localroot ~]# w                     #查看负载
[root@localroot ~]# free
[root@localroot ~]# vmstat 1
[root@localroot ~]# top -c

 

浏览器访问gitlab,输入ip即可,ip是客户端的IP
默认管理员root,无密码,它会让我们去定义一个密码

 

使用gitlab

查看提供Web服务的nginx目录

[root@localroot ~]# ps aux | grep nginx
[root@localroot ~]# ls /var/opt/gitlab/nginx/conf/

gitlab-http.conf     nginx.conf    nginx-status.conf

[root@localroot ~]# ls /var/opt/gitlab/nginx/conf/nginx.conf      主配置文件

/var/opt/gitlab/nginx/conf/nginx.conf 

[root@localroot ~]#ls /var/opt/gitlab/nginx/conf/gitlab-http.conf        gitlab配置文件

/var/opt/gitlab/nginx/conf/gitlab-http.conf

修改监听的端口

[root@localroot ~]# vim /var/opt/gitlab/nginx/conf/gitlab-http.conf 

f8c0c71e7c6572d9f4264b14f809b8a8e71.jpg

1e6fc73d8d65aad30bd82b0b41e941f187c.jpg

eb4c36c93c035ebae02d266d000043cd86f.jpg

b0650f1020c10bafeb8fc1e9bcc8310753d.jpg

 

d3781566a0c27b7a389d30dee0f650ee10b.jpg

添加公钥

32bccfb595a566ca8ff3dbdd4bdffdff525.jpg

进入管理员区域

e86fbbbb54aa848788a705342fe9eb958db.jpg

 

 

[root@localroot ~]#
[root@localroot ~]#
[root@localroot ~]#

 

 

 

常见问题:

1、

  1. 是不是每创建一个项目,都需要用svnadmin create xxx 进行初始化操作? conf目录下的三个文件是独立还是通用的?

  2. svnserve.conf中的auth-access不会跟authz中的设定产生冲突么? 例如 authz文件中我设定@admins = r,svnserve.conf中设定auth-access = write .那么admins组的用户到底有没有write的权限?

答:1 每个项目都需要create一下 authz和passwd文件可以共用,参考扩展里面的多仓库统一管理

 

2 svnserver.conf里面设定的整个项目的读写权限,而authz是针对个人用户的。 若svnserver.conf中设置为写,但是个人用户却为只读,那最终权限是只读。若svnserver.conf里面是只读,即使authz设置为写,也不能写。

3、安装gitlab的时候自动安装了gitlab

 

 

扩展部分

推送到服务器上的文件  可以在服务器硬盘上找到源文件

http://blog.csdn.net/qshn2sky/article/details/77622016 

http://blog.csdn.net/aguda_king/article/details/71609475

 

svn的钩子  http://coolnull.com/1716.html

gitlab修改端口  http://blog.csdn.net/arybd/article/details/54635295

修改主机名 http://www.mamicode.com/info-detail-1316828.html

第三方邮件 http://blog.csdn.net/liuruiqun/article/details/50000213

server ssh 端口并不是22   http://www.cnblogs.com/limx/p/5709101.html   http://www.linuxidc.com/Linux/2017-02/141043.htm 

应该修改  /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml

# If you use non-standard ssh port you need to specify it

ssh_port: xxxxx

 

 

有关svn方面的信息:https://bbs.csdn.net/topics/360112901?list=lz

 

链接:

SVN 教程 :http://www.runoob.com/svn/svn-tutorial.html

 

转载于:https://my.oschina.net/u/3803405/blog/1837942

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值