你要了解的常识
版本控制,记录若干文件内容变化,以便将来查阅特定版本修订情况
版本管理工具发展简史,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 ## 创建工程的版本库,初始化
[root@localhsot ~]# cd !$/conf #authz为权限配置文件,passwd为密码文件,svnserve.conf为仓库配置文件
[root@localhsot ~]# vim authz //配置文件改为如下
[groups]
admins = aming,user1 # 定义用户,可以定义多个
[/] #指的是/data/svnroot/myproject目录
@admins = rw
*= r #*表示所有,除了aming,其他的用户都是只读
[myproject:/] #指的是项目的名字,user1的项目是rw
user1 = rw
[root@localhsot ~]# vim passwd
[users]
aming = aming!(*$123
user1 = user1^^^123
user2 = user2-***123
[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 //这样就启动了
[root@localhsot ~]# ps aux | grep svn #查看进程,会出现/data/svnroot
[root@localhsot ~]# netstat -lntp #查看 端口
当客户端访问服务端时,要看看是否有防火墙规则
[root@localhsot ~]# iptables -nVL
客户端上使用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
[root@localhsot myproject]# svnme=aming checkout svn://192.168.226.130/myproject --username=root
[root@localhsot myproject]# ls
myproject
[root@localhsot myproject]# ls -la myproject/
[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 #查看
让用户不记录系统里面,删除他就行了
[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
实例:
下载小乌龟
在桌面上面右击,查看安装
创建一个myproject,然后右击选着SVN Checkou, 点击OK,
创建一个文档,并写入数据,添加到服务端。选中文档右击,找到ADD
在客户端(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上面更新
单机上使用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 # 初始化仓库
[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
[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
[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
[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
实例:
注册
创建一个项目
创建完成
添加秘钥,验证
在机器(01)上面操作
[root@localhost ~]# ssh-keygen #查看秘钥
[root@localhost ~]# cat .ssh/id_rsa.pub #查看生产的秘钥
在客户端(01机器)上面创建仓库,写好东西之后,发送到远程端上。
链接地址: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
原因:是之前已经创建了一个,重新创建一个就行了
【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 ,下面中间显示的注释
克隆远程仓库(在工作中常用)
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上面,找一个项目,复制要克隆的链接
在客户端(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上面刷新
选中lamp.sh,然后修改
在客户端(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 #推到
原因:没有配置远程的窗口,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分支下的内容。
原因:两个文件的修改的内容不一样。把这两个文件内容,设置成一样的
解决办法:
[root@localroot gitroot]# vim 2.txt #修改2.txt文件
[root@localroot gitroot]# git checkout aming
[root@localroot gitroot]# git merge aming
[root@localroot gitroot]# git commit -a #查看一些提示信息
[root@localroot gitroot]# git add 2.txt
[root@localroot gitroot]# git commit -m "ch 2.txt"
再一次合并
[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
原因:你在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分支
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,本地和远程分支的名称要一致
实例:
创建新的项目名
格式化
另一种克隆方法:在命令行下格式化:把这个项目,克隆岛本地上,在本地操作,同步到远程上面
创建分支
把仓库克隆到本地
[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
标签管理
标签类似于快照功能,可以给版本库打一个标签,记录某个时刻库的状态。也可以随时恢复到该状态。
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
[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 //推送指定标签到远程
[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
在客户端虚拟机(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
这样的提示说明没问题,说明验证超成功了。不允许登陆
在新建的虚拟机(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
原因:没有选择branch
解决版本:设置一个仓库,push的时候加上分支
[root@localroot sample]# git push origin master
再做一个变更
[root@localroot sample]# echo "sidhfksd" > 222.txt
[root@localroot sample]# git add 222.txt
[root@localroot sample]# git commit -m "add 22.txt"
[root@localroot sample]# git push
做一个测试
[root@localroot sample]# cd ..
[root@localroot ~]# cd /tmp/
把刚才的测试,项目仓库克隆下来,把代码推送到服务端
[root@localroot tmp]# git clone git@192.168.133.132:/data/gitroot/sample.git
[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"
[root@localroot sample]# git push
[root@localroot sample]# cd /root/sample/
[root@localroot sample]# ls
222.txt mysqld
[root@localroot sample]# git pull #拉取222.txt
[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
实例:
在虚拟机(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
[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
查看是否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
添加公钥
进入管理员区域
[root@localroot ~]#
[root@localroot ~]#
[root@localroot ~]#
常见问题:
1、
-
是不是每创建一个项目,都需要用svnadmin create xxx 进行初始化操作? conf目录下的三个文件是独立还是通用的?
-
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