测试常用GIT部署环境的命令
前提:linux本地服务器已安装了Git,本地服务器上并没有远程代码,需要两步即可轻松搭建本地的Git仓库,并将远程代码部署到测试环境。
1、确保本地服务器上配置了Git,参考另一篇随笔:【本地Linux服务器上配置Git】即可;
2、在本地服务器上构建一个代码仓库,使用:
git clone git@git.*****.git wedata-framework (wedata-framework为自定义的本地仓库名,建议和远程仓库的保持一致,仓库路径为执行本命令的路径);
执行完后,使用 ls 即可查看到本地仓库,cd wedata-framework进去就可以看到当前部署的分支代码,默认是克隆master,可以使用 git branch 查看到;
至此,代码仓库已经在本地服务器上建好,下面我们要做的就是【开发分支部署】。
【开发分支部署】
这里只要了解Git的基本命令即可;
1、git branch -a //显示所有的分支:本地分支+远程分支(以remotes/origin/开头)
2、git pull //取回远程主机的分支更新;在本地没有分支A时,使用该命令后,可以看到远程分支A,在本地部署了分支A后使用该命令,会将远程仓库A分支更新到本地,如果本地的和远程的没有任何区别,那会显示“Already up-to-date”;
3、git checkout -b A /remotes/origin/A //将远程A分支拷贝到本地,并在本地部署A分支;
不出意外的话,输入命令后会回显说已经checkout到了A分支;
若在此处出现警告,提示需要先提交,如果不提交则可以使用“git reset --hard”和“git pull”,之后可以使用第3步的命令。
git 世界上目前最先进的分布式版本控制系统
1991年,Linus在创建了开源的Linux
2002年,Linux系统已经发展了十年了,代码库之大让Linus很难继续通过手工方式管理了
2005年,(BitMover公司收回Linux社区的免费权限)Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!
2008年,GitHub网站上线了,它为开源项目免费提供Git存储,无数开源项目开始迁移至GitHub,包括jQuery,PHP,Ruby等等。
Q: 集中式和分布式版本控制系统有什么区别呢?
Linus一直痛恨的CVS及SVN都是集中式的版本控制系统(需要从服务器下载,修改后要上传服务器。缺点:互联网上,遇到网速慢的话,可能提交一个10M的文件就需要5分钟,这还不得把人给憋死啊。)
而Git是分布式版本控制系统,每台机器都存的全量代码,都是服务器
Q: 为什么Git比其他版本控制系统设计得优秀,
A: 因为Git跟踪并管理的是修改,而非文件。
Git的杀手级功能之一(注意是之一,也就是后面还有之二,之三……):远程仓库
只要注册一个GitHub账号,就可以免费获得Git远程仓库。
由于你的本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa
和id_rsa.pub
这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh
目录,里面有id_rsa
和id_rsa.pub
两个文件,这两个就是SSH Key的秘钥对,id_rsa
是私钥,不能泄露出去,id_rsa.pub
是公钥,可以放心地告诉任何人。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。另一个办法是自己动手,搭一个Git服务器,因为是你自己的Git服务器,所以别人也是看不见的。这个方法我们后面会讲到的,相当简单,公司内部开发必备。
确保你拥有一个GitHub账号后,我们就即将开始远程仓库的学习。
先从Git官网下载源码,然后解压,依次输入:./config
,make
,sudo make install
这几个命令安装就好了。
git init
命令,初始化一个Git仓库。
添加文件到Git仓库,分两步:
git add
,注意,可反复多次使用,添加多个文件;第一次修改 -> git add
-> 第二次修改 -> git add
-> git commit
git commit -m
,完成。 注意:git add
命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit
就可以一次性把暂存区的 所有修改提交到分支。
no changes added to commit (use "git add" and/or "git commit -a")
git status
命令,随时掌握工作区的状态。如果git status
告诉你有文件被修改过,用git diff
可以查看修改内容。
HEAD
指向的版本就是当前版本(Git在内部有个指向当前版本的HEAD
指针,当你回退版本的时候,Git仅仅是把HEAD从指向你想回退的版本)
git reset --hard commit_id命令,
Git允许我们在版本的历史之间穿梭。
git log命令,
可以查看提交历史,穿梭前,用这个命令查看并确定要回退到哪个版本。
git reflog命令,
要重返未来,
用来记录你的每一次命令,查看命令历史,以便确定要回到未来的哪个版本。
场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file
。
场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD
,就回到了场景1,第二步按场景1操作。
场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考版本回退一节,不过前提是没有推送到远程库。
文件删除:
有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
删除文件
在Git中,删除也是一个修改操作,我们实战一下,先添加一个新文件test.txt
到Git并且提交:
$ git add test.txt
$ git commit -m "add test.txt"
[master b84166e] add test.txt
1 file changed, 1 insertion(+)
create mode 100644 test.txt
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm
命令删了:
$ rm test.txt
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status
命令会立刻告诉你哪些文件被删除了:
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
deleted: test.txt
no changes added to commit (use "git add" and/or "git commit -a")
现在你有两个选择,一是确实要从版本库中删除该文件,那就用命令git rm
删掉,并且git commit
:
$ git rm test.txt
rm 'test.txt'
$ git commit -m "remove test.txt"
[master d46f35e] remove test.txt
1 file changed, 1 deletion(-)
delete mode 100644 test.txt
现在,文件就从版本库中被删除了。
小提示:先手动删除文件,然后使用git rm
另一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- test.txt
git checkout
其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
“有了远程仓库,妈妈再也不用担心我的硬盘了。”——Git点读机
首先,登陆GitHub,然后,在右上角找到“Create a new repo”按钮,创建一个新的仓库learngit
根据GitHub的提示,在本地的learngit
仓库下运行命令:
$ git remote add origin [email protected]:michaelliao/learngit.git
请千万注意,把上面的michaelliao
替换成你自己的GitHub账户名,否则,你在本地关联的就是我的远程库,关联没有问题,但是你以后推送是推不上去的,因为你的SSH Key公钥不在我的账户列表中。
添加后,远程库的名字就是origin
,这是Git默认的叫法,也可以改成别的,但是origin
这个名字一看就知道是远程库。
下一步,就可以把本地库的所有内容推送到远程库上:
$ git push -u origin master
Counting objects: 20, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (15/15), done.
Writing objects: 100% (20/20), 1.64 KiB | 560.00 KiB/s, done.
Total 20 (delta 5), reused 0 (delta 0)
remote: Resolving deltas: 100% (5/5), done.
To github.com:michaelliao/learngit.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
用git push
命令,把本地库的内容推送到远程,实际上是把当前分支master
推送到远程。
首先,登陆GitHub,创建一个新的仓库,名字叫gitskills
:
我们勾选Initialize this repository with a README
,这样GitHub会自动为我们创建一个README.md
文件。创建完毕后,可以看到README.md
文件:
现在,远程库已经准备好了,下一步是用命令git clone
克隆一个本地库:
$ git clone [email protected]:michaelliao/gitskills.git
Cloning into 'gitskills'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 3
Receiving objects: 100% (3/3), done.
你也许还注意到,GitHub给出的地址不止一个,还可以用https://github.com/michaelliao/gitskills.git
这样的地址。实际上,Git支持多种协议,默认的git://
使用ssh,但也可以使用https
等其他协议。
使用https
除了速度慢以外,还有个最大的麻烦是每次推送都必须输入口令,但是在某些只开放http端口的公司内部就无法使用ssh
协议而只能用https
。
每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master
分支。HEAD
严格来说不是指向提交,而是指向master
,master
才是指向提交的,所以,HEAD
指向的就是当前分支。
一开始的时候,master
分支是一条线,Git用master
指向最新的提交,再用HEAD
指向master
,就能确定当前分支,以及当前分支的提交点:
每次提交,master
分支都会向前移动一步,这样,随着你不断提交,master
分支的线也越来越长
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch
切换分支:git checkout
创建+切换分支:git checkout -b
合并某分支到当前分支:git merge
删除分支:git branch -d
电子书:https://git-scm.com/book/zh/v2
廖雪峰Git教程
git常用命令总结--廖雪峰老师Git教程命令总结
Git的基础知识和常用命令
阮一峰写的Git常用命令的博客地址