分布式版本控制系统

一、Git、Github、Gitlab 的区别
Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或大或小的项目。
是Linus Tovalds 为了帮助管理Linux内核开发的一个开放源码的版本控制软件。
Github是在线的基于Git的代码托管服务,Github是2008年由Ruby on Rails编写而成。Github同时提供付费账户和免费账户。这两种账户都可以常见公开的代码仓库,只有付费账户可以创建私有代码仓库。Github解决了这个问题,可以在上面创建免费的私人repo。
二、Git 与 SVN 区别
Git不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。
GIT 与 SVN 区别
  1. GIT是分布式的,SVN不是:这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。
  2. GIT把内容按元数据方式存储,而SVN是按文件:所有的资源版本控制系统都是把文件的元信息隐藏在一个类似svn.cvs等的文件夹里。
  3. GIT分支和SVN的分支不同:分支在SVN中一点不特别,就是版本库中的另外一个目录。
  4. GIT没有一个全局的版本号,而SVN有:目前为止这是跟SVN相比GIT缺少的最大的一个特征。
  5. GIT的内容完整性要优于SVN:GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低版本库的破坏。
三、部署 Git 服务
准备两台虚拟机 centos7.x
192.168.1.120 git-server
192.168.1.121 git-client
 
git-server 的操作
yum install git git-core gitweb -y
useradd git
passwd git
mkdir /git-root/
cd /git-root/

git init --bare shell.git           #初始化操作,其实就是创建了一个库
git init 与 git init --bare 的区别 …… ……
#授权
cd shell.git
chown -R git:git /git-root/shell.git
#切换用户
su - git
ssh-keygen -t rsa
cd .ssh/
cp id_rsa.pub authorized_keys
vim authorized_keys
logout
usermod -s /usr/bin/git-shell git
 
git仓库测试
git-client 的操作
[git@localhost ~]# yum install git -y
[git@localhost ~]# ssh-keygen
[git@localhost ~]# ssh-copy-id git@192.168.1.120
[git@localhost ~]# git clone git@192.168.1.120:/git-root/shell.git    #克隆
[git@localhost ~]# ls
rh shell
[git@localhost ~]# cd shell
[git@localhost shell~]# vim test.sh
[git@localhost shell~]# git add test.sh
[git@localhost shell~]# git config --global user.name "administrator"
[git@localhost shell~]# git config --global user.email admin@example.com
[git@localhost shell~]# git push -u origin master
[git@localhost ~]# git clone git@192.168.1.120:/git-root/shell.git  
四、 Git 工作流程
一般工作流程如下:
  • 克隆 Git 资源作为工作目录。
  • 在克隆的资源上添加或修改文件。
  • 如果其他人修改了,你可以更新资源。
  • 在提交前查看修改。
  • 提交修改。
  • 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git的工作流程示意图:
五、 Git 基本概念
  • 工作区:就是你在电脑里能看到的目录。
  • 暂存区:英文名叫stage或index.一般存放在git目录下index文件(.git/index)中,所以我们把暂存区有时也叫做索引(idenx)。
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
工作区、版本库中的暂存区和版本库之间的关系的示意图:
 
  • 图中左侧为工作区、右侧为版本库。在版本库中标记为"index"的区域是暂存区(stage,index),标记为"master"分支所代表的目录树。
  • 图中可以看出此时对"HEAD"实际是指向 master 分支的一个"游标",所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
  • 图中的 objects 标识的区域为Git的对象库,实际位于".git/objects"目录下,里面包含了创建的各种对象及内容。
  • 当对工作区修改(或新增)的文件执行"git add" 命令时,暂存区的目录树被更新,同时工作区修改(或更新)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
  • 当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master分支会做对应的更新,即 master 指向的目录树就是提交暂存区的目录树。
  • 当执行"git reset HEAD"命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
  • 当执行"git rm --cached <file>"命令时,会直接从暂存区删除文件,工作区则不做出改变。
  • 当执行"git checkout"或者"git checkout --<file>"命令时,会用暂存区全部或指定文件替换工作区的文件,这个操作很危险,会清除工作区中未添加到暂存区的改动
六、Git 客户端安装使用
1、Git 安装配置
yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel
yum install -y git git-all git-core
git --version
2、Git 配置
Git 提供了一个叫做git config 的工具,专门用来配置或读取相应的工作环境变量。
这些环境变量,决定了Git在各个环节的具体工作方式和行为,这些变量可以存放在以下三个不同的地方:
  • /etc/gitconfig 文件:系统中对所有用户都普通适用的配置。若使用 git config 时用--system 选项,读写的就是这个文件。
  • -/.gitconfig 文件: 用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中 .git/config 文件):这里的配置仅仅针对当前项目有效,每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。
2.1、git 用户信息
  配置个人的用户名称和电子邮件地址:(可自定义名称)
git config --global user.name "administrator"
git config --global user.email admin@example.com
  如果使用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所以的项目都会默认使用这个配置的用户信息。
  如果要在某个特定的项目中使用其他名称或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config文件里。
2.2、文本编辑器
  设置Git默认使用的文本编辑器,一般可能会是vi或者vim,如果你有其他偏好,比如Emacs的花,可以重新设置
git config --global core.editor emacs
2.3、差异分析工具
  还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具,比如要改为vimdiff的话:
git config --global merge.tool vimdiff
可以理解kdiff3,tkdiff,xxdiff,emerge,vimdiff,gvimdiff,ecmerge,和opendiff等合并工作的输出的信息。
当然,你也可以指定使用自己开发的工具。
2.4、检查配置信息
  要检查已有的配置信息,可以使用git config --list命令:
git config --list
有时候会看到重复的变量名,那就说明它们来自不同的配置文件(比如/etc/gitconfig和~/.gitconfig),不过最终 Git 实际采用的是最后一个。

[root@localhost .git]# git config user.name  
administrator 
[root@localhost .git]# git config user.name fdd  更改用户名
fdd
3、Git 使用
3.1、ssh 链接
  客户机上上传公钥上传到gitlab的SSH-Keys里,git clone下载和git push上传都没问题,这种方式很安全
3.2、http 链接(两种方式实现)
1.修改代码里 .git/config文件添加登录用户名密码
 
2.执行命令设置登录用户和密码
 
3.设置身份验证
注意:设定本机用户名,绑定邮箱,让远超服务器知道机器的身份
git config --global user.name "user_name"
git config --global user.email "xxxxx.com"
4.本地项目与远程服务器项目之间的交互
  • 如果你没有最新的代码,希望从头开始
git clone git@xxx.git         #这里是项目的地址(可从项目主页复制),将远程服务器的内容完全复制过来
cd BCBInspector_vo1           # colne 之后进入该项目的文件夹
touch README.md               #新建readme文件
git add README.md             #将新建的文件添加到git的暂存区
git commit -m "Its note: add a readmo file"    #将暂存区的文件提交到某一个版本保存下来,并加上注释
git push -u origin  master    #将本地的更改提交到远程服务器
  • 如果你已经有一个新版代码,希望直接本地的代码替换到远程服务器
cd existing_folder             #进入代码存在的文件夹,或者直接在该文件夹打开
git bash git init              #初始化
git remote add origin git@xxx.git        #添加远程项目地址(可从项目主页复制)
git add .                      #添加该文件夹中所有的文件到git的暂存区
git commit -m "note"           #提交所有代码到本机的版本库
git push -u origin master      #将本地的更改提交到远程服务器
  • git 中 clone过来的时候,git不会对本地和服务器的文件,也就不会有冲突。
  • 建议确定完全覆盖本地的时候用clone,不确定会不会有冲突的时候用git pull,将远程服务器的代码download下来
5、常用的 Git 命令
git init               #初始化
git add main.cpp       #将某一个文件添加到暂存区
git add .              #将文件夹下的所有的文件添加到暂存区
git commit -m 'note'   #将暂存区中的文件保存成为某一个版本
git log                #查看所有的版本日志
git status             #查看现在暂存区的状况
git diff               #查看现在文件与上一个提交-commit版本的区别
git reset --hard HEAD      #回到上一个版本
git reset --hard xxxxx    #xxx为版本编号,回到某一个版本
git pull origin master    #从主分支pull到本地
git push -u origin master     #从本地push到主分支
git pull                  #pull默认主分支
git push                  #push默认主分支 ……
6、版本穿梭
6.1、版本回退
#用 git log 命令查看:
#每一个提交的版本都唯一对应一个 commit 版本号
#使用 git reset 命令退到上一个版本
git reset --hard HEAD^

git reflig           #查看命令历史,一遍确定回到那个版本
git reset --hrad commit_id     #比如 git reset --hard 3628164 (怒用全部输入,输入前几位即可)
6.2、分支管理
创建分支
git checkout -b dev                #创建dev分支,然后切换到dev分支
git checkout                       #命令加上-b 参数表示创建并切换。
相当于以下两条命令:
git branch dev git checkout dev
git branch                         #命令查看当前分支
git branch                         #命令会列出所有分支,当前分支前面会标一个*号
git branch * dev  master
git add readme.txt git commit -m 'branch test'     #在dev分支上正常提交

分支切换

git checkout master        #切换回 master分支
git merge dev #把dev分支的工作成果合并到master分支上 git merge #命令用于合并指定分支到当权分支。 #合并后,再查看readme.txt的内容,就可以看到,和dev分支的罪行提交是完全一样的。 git branch -d dev #删除dev分支

原文地址:https://www.cnblogs.com/fengyuanfei/p/14473010.html