一、概述
1.1git概念
Git是一个开源的分布式版本控制系统,用于敏捷高效处理任意规模的项目,其作者为Linux创造者Linus Torvalds为管理Linux内核而开放的一个开源的版本控制柔软剂与其他版本控制工具例如:CVS,Subversion 等不同,它可采用分布式版本,不必依赖于服务器端软件支持。
1.2Git与SVN区别
Git不仅仅是版本控制系统,也是一个内容管理系统相比与SVN的区别如下:
1.GIT为分布式,SVN则不是;
2.GIT按照元数据形式存储内容,讲所有资源孔子系统都是把文件的元数据隐藏在一个类似.svn,.cvs的文件夹内,而SVN是按文件;
3.GIT分支与SVN不同,分支在SVN内的另一个目录;
4.GIT没有全局版本号,SVN有全局版本号;
5.GIT内容完整性优于SVN,GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
1.3 GIT工作流程
1.克隆Git资源作为工作目录
2.在克隆的资源上添加或修改文件
3.如果他人修改,你可以进行资源更新
4.在提前查看修改
5.提交修改
6.在修改完成后,如果发现错误,可撤回提交并再次修改提交
流程图:
1.4 基本概念
工作区:本地PC可以看到的目录
暂存区:英文名称stage,或index,一般存放在“.git目录”下的index文件(.git/index)中,所以我们把暂存区有时也称作索引(index)
版本库:工作区有一个隐藏的目录.git,此为Git的版本库
图中左侧为工作区,右侧为版本库,在版本库中标记为“index”的区域为暂存区(stage,index),标记为“master”的是master分支所代表的目录树。
图中可以看到“HEAD”实际指向的是master分支的一个“游标”,所以途中的HEAD的地方可以用master来替换。
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 "git rm --cached " 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 "git checkout ." 或者 "git checkout -- " 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 "git checkout HEAD ." 或者 "git checkout HEAD " 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
二、安装配置
2.1 Git安装
yum 安装
yum install git
git --version #查看版本
源码安装
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc-c++ perl-ExtUtils-MakeMaker wget -y
wget https://www.kernel.org/pub/software/scm/git/git-2.7.3.tar.gz
tar xf git-2.7.3.tar.gz
cd git-2.7.3
make configure
./configure --prefix=/usr/local/git
make profix=/usr/local/git
make install
echo "export PATH=$PATH:/usr/local/git/bin" > /etc/profile.d/git.sh #添加环境变量
source /etc/profile.d/git.sh
2.2 Git配置
Git 提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
配置用户信息
git config --global user.name "kaliarch"
git config --global user.email kaliarch@anchnet.com
git config --list #查看配置
2.3 创建仓库
Git 使用 git init 命令来初始化一个 Git 仓库,Git 的很多命令都需要在 Git 的仓库中运行,所以
git init
是使用 Git 的第一个命令。
在执行完成 git init 命令后,Git 仓库会生成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变(不像 SVN 会在每个子目录生成 .svn 目录,Git 只在仓库的根目录生成 .git 目录)。
该命令执行完后会在当前目录生成一个 .git 目录。
使用我们指定目录作为Git仓库。
初始化后,会在 newrepo 目录下会出现一个名为 .git 的目录,所有 Git 需要的数据和资源都存放在这个目录中。
如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
git add *.c
git add README
git commit -m '初始化项目版本'
git clone
三、基础操作
3.1 创建目录初始化
mkdir /workspace
cd /workspace
git init
此时Git仓库就创建完成了,此时为一个空仓库(empty Git repository),可以发现当前目录下有一个隐藏的目录
.git
,此目录为Git来跟踪管理版本库,建议不要修改内部文件,以免Git仓库遭到破坏。
使用git clone
拷贝一个Git仓库到本地,可以进行项目查看与修改
git add 接下来我们执行 git add 命令来添加文件:
git status -s git status 以查看在你上次提交之后是否有修改。
3.2 版本回退
连续添加多个文件后,执行commit
提交后,使用git log
查看不同版本
可以使用--oneline
选项查看历史记录简洁版本,也可用--graph
选项,查看历史中什么时候出现了分支、合并,
也可用--reverse
参数逆向显示所有日志。
添加文件第一步使用git add
是将文件添加进暂存区,第二部git commit
提交更改,实际上为讲暂存区的所有内容提交到当前分支。
git reset HEAD 命令用于取消缓存的内容。
HEAD指向的版本,因此,Git允许回退版本,使用命令git reset --hard commit_id
回退前,可使用git log
查看历史提交记录,以便确回退到那个版本
重新返回回退前的,使用git reflog查看历史命令,回到到未来的某个版本。
Git 跟踪并管理的是修改,而非文件,当使用git add命令后,在工作区的第一次修改给放如暂存区,但是 ,在工作区的第二次修改没放入暂存区,用git commit只负责把暂存区的修改提交,也就是第一次的修改被提交了,第二次的修改未被提交。
3.3 删除文件
直接在工作区删除,对暂存区和版本库没有任何影响。本地删除如果要反映在暂存区中应该用git rm命令,对不想删除的文件执行git checkout -- ,可以让文件在工作区重现。用git rm命令执行删除后,删除动作加入了暂存区,这时执行提交动作就从真正意义上执行了文件删除,不过文件只是在版本库的最新提交中被删除了,在历史提交中尚在。
3.4 移动文件(改名操作)
改名操作相当于对旧文件执行删除,对新文件执行添加
git mv可以由git rm和git add两条命令取代
$ git mv oldname newname 完成改名操作
3.5 恢复删除文件
git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
用命令git reset HEAD file可以把暂存区的修改撤销掉(unstage),重新放回工作区:
一般情况下,你通常直接在文件管理器中把没用的文件删了,或者用rm命令删了:
1.一是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit
2.一种情况是删错了,因为版本库里还有呢,所以可以很轻松地把误删的文件恢复到最新版本:
git checkout -- test.txt
四、分支管理
几乎所有的版本控制系统都存在某种意义上的分支支持,使用分支意味这可以从开放主线来分离出来,可以在不影响主线的情况下继续工作
创建分支:
git branch (branchname)
git checkout -b (branchname)
#创建并切换到该分支下
查看分支
git branch
切换分支
git checkout (branchname)
当切换分支时,Git会用该分支的最后提交快照替换工作目录的内容,所以分支不需要多个目录
合并分支
git merge
当执行git init
时,缺省情况下Git会创建master分支
删除分支
git branch -d (branchname) -D
#强制删除
五、搭建GIT服务器
GitHub就是一个免费托管开源代码的远程仓库。但是对于某些视源代码如生命的商业公司来说,既不想公开源代码,又舍不得给GitHub交保护费,那就只能自己搭建一台Git服务器作为私有仓库使用。
搭建Git服务器需要准备一台运行Linux的机器。
5.1 安装GIT
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel git -y
groupadd git
adduser git -g git
5.2 创建证书登录
收集所有需要登录的用户的公钥,公钥位于id_rsa.pub文件中,把我们的公钥导入到/home/git/.ssh/authorized_keys文件里,一行一个。
如果没有该文件创建它:
cd /home/git/
mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
5.3 初始化Git仓库
首先我们选定一个目录作为Git仓库,假定是/home/gitrepo/runoob.git,在/home/gitrepo目录下输入命令:
su - git
mkdir gitrepo && cd gitrepo
git init --bare kaliarch.git
5.4 克隆仓库
git clone git@172.20.6.11:/home/git/gitrepo/kiliarch.git #172.20.6.11为本地git服务器的地址
注意:git服务器创建git用户,如果使用ssh登录拉去,不可进行git用户的登录shell,确保git客户端的公钥已经写入git服务器的authorized_keys内。
六、远程仓库(github)
注册GitHub帐号后,从本地GIT参考和GitHub仓库建传输是SSH加密的。
创建SSH KEY,在用户主目录下,如果没有.ssh目录及里面的id_rsa.pub文件,需进行公钥创建。
ssh-keygen -t rsa -C "youremail@example.com"
后面的 your_email@youremail.com 改为你在 github 上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车就行。成功的话会在~/下生成.ssh文件夹,进去,打开 id_rsa.pub,复制里面的 key。
回到 github 上,进入 Account => Settings(账户配置)。
在客户端验证是否已经添加成功ssh -T git@github.com
以下命令说明我们已成功连上 Github。
之后登录后点击" New repository "
创建成功后初始化本地
mkdir /dirgit # 创建测试目录
cd /dirgit # 进入测试目录
echo "# project" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:redhatxl/project.git
git push -u origin master
添加远程地址
git remote add origin git@github.com:redhatxl/project.git
添加第二个仓库git remote add origin2 git@github.com:redhatxl/test.git
上传到第二个仓库it push -f origin2
如果你在创建 repository 的时候,加入了 README.md 或者 LICENSE ,那么 github 会拒绝你的 push 。你需要先执行 git pull origin master
执行 git push -u origin master 将本地仓库上传至Github的仓库并进行关联:
以后想在commit后同步到Github上,只要直接执行 git push 就可以。
查看当前远程库
git remote -v
1、从远程仓库下载新分支与数据:
git fetch
2、从远端仓库提取数据并尝试合并到当前分支:
git merge
3、删除远程仓库你可以使用命令:
git remote rm
4、 推送到 Github
git push origin master