目 录
一、Git的优势... 2
二、搭建一个简单的Git服务器... 3
服务器配置... 3
客户端... 7
权限管理... 8
三、Git常用命令... 9
创建版本库... 9
时光穿梭机... 9
版本回退... 9
工作区和暂存区... 9
管理修改... 10
撤销修改... 10
删除文件... 11
远程仓库... 11
添加远程仓库... 11
远程库克隆. 12
分支管理... 12
四、学习链接... 12
先来看看为什么要用Git。为什么不用cvs,svn这些呢?
1、 分布式版本控制系统,没有中央服务器,不需要联网
2、 安全性
3、 强大的分支管理
先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。
集中式版本控制系统最大的毛病就是必须联网才能工作。
首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件A,你的同事也在他的电脑上改了文件A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。
在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。
Git极其强大的分支管理,把SVN等远远抛在了后面。
为什么要搭建Git服务器呢?我的理解是虽然现在有很多代码托管的服务器,例如Github,但是它是公开的,任何人都可以查看获取。
由于没有多台机器,所以就利用虚拟机和阿里云服务器模拟搭建Git服务器。
说明:以下基于假设团队采取各个客户端的公钥都发送到服务器的密钥存储文件的这种形式。
搭建环境
虚拟机中Ubuntu 16.04 作为客户端
阿里云CentOS 7.2 作为服务器
假设你已经装好了Ubuntu或其他Linux操作系统。这里对Git服务器的搭建和使用方法做基本介绍。
1 在服务器安装git
yum install -y git # CentOS下的安装git命令,按照
git --version # 查看git版本确认安装成功
安装完成后,还需要最后一步设置,在命令行输入:
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"
因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。
注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。
查看服务器IP
ifconfig
这里用命令查看的是私有IP。
由于我用的是阿里云作为服务器,所以可以登录阿里云官网查看公网IP(注意不是私有IP)。
2. 创建新用户gitUser管理git使用者
cd /home # 切换到home目录
adduser gitUser #添加新用户gitUser
passwd gitUser # 设置用户gitUser的密码,后面从git仓库中远程下载时需要
3. 切换到用户gitUser及创建公钥存储文件
su gitUser #切换用户
mkdir .shh #创建.ssh文件夹
cd .ssh/
touch authorized_keys #创建公钥存储文件,ssh免密登录
4. 检查并安装ssh
ps -e | grep ssh #检查是否安装过,如果只出现一个ssh
yum install -y openssh-server #CentOS下的命令
sudo apt-get install openssh-server #Ubuntu下的命令
5. 开启ssh服务
service ssh start
6. 生成密钥
ssh-keygen -t rsa # 密钥有两种类型,-t 选择类型,参数rsa代表rsa类型密钥
运行后一直按Enter,生成密钥 , id_rsa(私钥) 和 id_rsa.pub(公钥)默认存放在/root/.ssh下,.ssh文件是隐藏的 可以切换到该文件夹下查看
7. 将客户端的公钥拷贝到服务器中的存储文件夹中
这一步在客户端进行,也就是我的虚拟机
scp ~/.ssh/id_rsa.pub yyq@服务器IP地址:/home/gitUser/pub
说明:上述命令通过scp将公钥id_rsa.pub传输到服务器的/home/gitUser/pub目录下,传输完后可以在服务器的该目录下看到一个名为id_rsa.pub文件
远程传输命令: scp(secure copy)是一个基于SSH协议在网络之间进行安全传输的命令,其格式为“scp[参数] 本地文件 远程帐户@远程 IP 地址:远程目录”。
默认端口号:22
scp 不仅能够通过网络传送数据,而且所有的数据都将进行加密处理。
第一次使用scp会有一个警告和询问,输入yes就好了。
8 回到服务器
cat /home/gitUser/pub/id_rsa.pub >> /home/gitUser/.ssh/authorized_keys
说明:上述命令将公钥内容写到授权文件中,这样一来,再次从客户端远程登录gituser的时候就不需要再输入密码了。
9.初始化git仓库
git init --bare projectNo1.git #初始化git仓库命令
客户端通过git clone 命令获取远程仓库的工程项目,进行修改等操作,然后通过push上传到远程仓库
git clone gitUser@服务器IP地址:/home/gitUser/codeRepo/projectNo1
说明:git clone 用户名@服务器IP地址:工程项目路径
执行完命令后。在当前目录下会得到该工程项目的副本。然后可以在本地进行修改等操作
SSH警告
当你第一次使用Git的clone或者push命令连接GitHub时,会得到一个警告:
The authenticity of host 'github.com (xx.xx.xx.xx)' can't be established. RSA key fingerprint is xx.xx.xx.xx.xx. Are you sure you want to continue connecting (yes/no)?
这是因为Git使用SSH连接,而SSH连接在第一次验证Git服务器的Key时,需要你确认Git的Key的指纹信息是否真的来自Git的服务器,输入yes回车即可。
Warning: Permanently added 'github.com' (RSA) to the list of known hosts.
这是Git告诉你已经把GitHub的Key添加到本机的一个信任列表里了。
这个警告只会出现一次,后面的操作就不会有任何警告了。
还有一个比较重要的问题是权限。 没有深入,先放这儿了。
git init #初始化一个Git仓库
添加文件到Git仓库,分两步:
1)git add
2)git commit -m
git status:查看工作区的状态。
如果git status告诉你有文件被修改过,git diff可以查看修改内容。
HEAD指向的版本就是当前版本,使用命令git reset --hard commit_id,可以穿梭到指定的版本。
穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。
Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。
我们把文件往Git版本库里添加的时候,是分两步执行的:
第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
可以简单理解为:需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
Git跟踪修改:每次修改,如果不用git add到暂存区,那就不会加入到commit中。
git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销。就是让这个文件回到最近一次git commit或git add时的状态
git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。
git rm #用于删除一个文件
Git是分布式版本控制系统,同一个Git仓库,可以分布到不同的机器上。怎么分布呢?最早,肯定只有一台机器有一个原始版本库,此后,别的机器可以“克隆”这个原始版本库,而且每台机器的版本库其实都是一样的,并没有主次之分。
找一台电脑充当服务器的角色,每天24小时开机,其他每个人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送到服务器仓库里,也从服务器仓库中拉取别人的提交。
由于你的本地Git仓库和GitHub仓库(也可以是自己的Git服务器)之间的传输是通过SSH加密的。
git push -u origin master # 把本地库的内容推送到远程
origin为远程库的名字。加上了-u参数,Git不但会把本地的master分支内容推送的远程新的master分支,还会把本地的master分支和远程的master分支关联起来,在以后的推送或者拉取时就可以简化命令。
关联远程库,使用git remote add origin git@server-name:path/repo-name.git
关联后,使用git push -u origin master第一次推送master分支的所有内容,此后每次本地提交后,只要有必要就可以使用命令git push origin master推送最新修改.
git clone 用户名@服务器IP地址:工程项目地址
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000