git 版本控制

版本控制

- 基本概念

        * 版本库

        * 分布式版本控制

- 常用软件

        * 版本控制软件

版本库

典型的客户/服务器系统

        * 版本库是版本控制的核心

        * 任意数量客户端        

        * 客户端通过写数据库分享代码

分布式版本控制

- 集中式版本控制系统

        * 开发者之间共用一个仓库(repository)

        * 所有操作需要联网

- 分布式版本控制系统

        * 每个开发者都是一个仓库的完整克隆, 每个人都是服务器

        * 支持断网操作

- Git基本概念

        * Git仓库 : 保存所有数据的地方

        * 工作区 : 从仓库中提取出来的文件, 放在磁盘上供你使用或修改        

        * 暂存去 : 就是一个文件, 索引文件, 保存了下次将提交的文件列表信息

版本控制软件

- 集中式版本控制软件

         * CVS

        * SVN

- 分布式版本控制软件

        * Git

        * BitKeeper(收费)

git基础

- 服务器设置

        * 安装Git

        * 创建服务器版本仓库

- 服务器操作

        * 客户端访问方式

        * 客户端命令行工具

        * Windows客户端软件

安装git

]#yum -y install git

]#git --version

创建服务器版本仓库

服务器是一台多人协作的中心服务器

init初始化

]#git init /var/git --bare

]#ls /var/git

常用git指令列表

指令 作用

        clone 将远程服务器的仓库克隆到本地    

        config 修改git配置

        add 添加修改到暂存区

        commit 提交修改到本地仓库

        push 提交修改到远程服务器

Git进阶

- HEAD指针

        * HEAD指针概述

        * 移动HEAD指针

- Git分支

        * 分支的基本概念

        * 管理多分支

        * 解决分支冲突

        * 分支与HEAD指针的关系

        * 多分支提交的流程

- Git服务器

        * SSH协议

        * Git协议

        * HTTP协议

- GitHub

        * 简介

        * 使用GitHub

HEAD指针概述

- HEAD指针是一个可以在任何分支和版本移动的指针

- 通过移动指针我们可以将数据还原至任何版本

移动HEAD指针

- 先使用log指令查看版本信息

git log --pretty=oneline

- 使用git reset --hard 版本号, 回到版本号的版本

- 在使用ls查看当前工作目录的资料是否还原

Tips:

HEAD^ #表示上一个版本

HEAD\~数字  #表示回归到前n个版本

默认log仅显示当前到之前的版本信息, --all

分支的基本概念

分支可以让开发分多条主线同时进行, 每条主线互不影响

- 按功能模块分支、按版本分支

- 分支也可以合并

常见的分支规范

- MASTER分支(MASTER是主分支,是代码的核心)

- DEVELOP分支(DEVELOP最新开发成果的分支)

- RELEASE分支(为发布新产品设置的分支)

- HOTFIX分支(为了修复软件BUG缺陷的分支)

- FEATURE分支(为开发新功能设置的分支)

管理多分支

- 查看当前分支

git status

git branch -v

- 创建分支

git branch 分支名

- 切换分支

git checkout 分支名

- 在新的分支上就可以继续修改代码

* 修改文件、创建文件等操作

* 正常add, commit提交版本库

- 合并分支

git checkout 分支名1 #切换到欲要合并到的分支

git merge 分支名2 #将分支2合并到分支1

解决分支冲突

修改了不同分支中相同文件的相同行

系统无法合并分支, 产生了冲突

git checkout hotfix #切换至hotfix分支

vim a.txt

git add a.txt #修改文件并提取

git commit -m "modify a.txt"

git checkout master #切换分支

vim a.txt

git add a,txt

git commit -m "modify a.txt"

git merge hotfix #合并时冲突

自动合并a.txt

冲突(内容) : 合并冲突于a.txt

自动合并失败, 修正冲突然后提交修正的结果

查看有冲突的文件

cat a.txt

<<<<<<< HEAD

one more line    #当前分支内容

=======

new line #其他分支内容

>>>>>>> hotfix

直接修改有冲突的文件, 修改为最终需要的文件内容

修改完成后, 正常add, commit提交, 解决冲突

Git服务器

- SSH协议

密码认证访问:

* 服务器安装git

* 使用git命令初始化版本仓库

* 客户端使用SSH远程访问(可读写权限)

免密码远程Git服务器(密钥授权)

* 客户端生成SSH密钥

ssh-keygen -f /root/.ssh/id_rsa -N '' #不产生交互生成密钥

* 将密钥拷贝给Git服务器

ssh-copy-id Git服务器IP地址

* 测试上传、上传代码到远程服务器

git clone root@服务器IP:/var/git

git push

- Git协议

Git协议访问支持无授权访问(只读)

* 服务器安装git-daemon软件包

yum -y install git-daemon

* 服务器初始化仓库(必须要在/var/lib/git/目录建仓库)

git init --bare /var/lib/git/project

如果不在/var/lib/git下创建, 则要修改 /usr/lib/systemd/system/[email protected]配置文件

修改前内容如下:

ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/git

--export-all --user-path=public_git --syslog --inetd –verbose

修改后内容如下:

ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/git #--base-path后跟要分享的目录

--export-all --user-path=public_git --syslog --inetd –verbose

* 服务器启动Git服务

systemctl start git.socket

* 客户端使用git协议访问(只读)

git clone git://服务器IP/project

- HTTP协议

支持浏览器访问

* 服务器安装gitweb软件包

yum -y install httpd gitweb

* 修改配置文件, 设置仓库根目录

vim +11 /etc/gitweb.conf

$projectroot="/var/lib/git" #添加一行

* 启动httpd服务

systemctl start httpd

案例一 : Git基本操作

本案例要求先快速搭建好一台Git服务器,并测试该版本控制软件,要求如下:

* 安装Git软件

* 创建版本库

* 客户端克隆版本仓库到本地

* 本地工作目录修改数据

* 提交本地修改到服务器

步骤一 : 部署Git服务器(192.168.2.100作为远程git服务器)

1) YUM安装Git软件

yum -y install git

2) 初始化一个仓库

mkdir /var/git

git init /var/git/project --bare

ls /var/git/project

branches  config  description  HEAD  hooks  info  objects  refs

步骤二 : 客户端测试(192.168.2.200作为客户端主机)

1) clone克隆服务器仓库到本地

yum -y install git

git clone [email protected]:/var/git/project

cd project

ls -A

.git #本地仓库

2) 修改git配置

git config --global user.email [email protected]

git config --global user.name "Touchl"

cat /root/.gitconfig

3) 本地工作区对数据进行增删改查(必须要进入仓库操作数据)

echo "init" > init.txt

mkdir demo

cp /etc/hosts demo

4) 查看仓库中的数据的状态

git status

5) 将工作区的修改提交到暂存区

git add .

6) 将暂存区修改提交到本地仓库

git commit -m "注释, 可为任意字符"

git status

7) 将本地仓库中的数据推送到远程服务器(web2数据推送到web1)

git config --global push.default simple

git push

git status

8) 将服务器上的数据更新到本地(web1的数据更新到web2)

备注 : 可能其他人也在修改数据并提交服务器,就会导致自己的本地数据为旧数据,使用pull就可以将服务器上新的数据更新到本地。

git pull

9) 查看版本日志

git log

git log --pretty=oneline

git log --oneline

git reflog

案例二 : HEAD指针操作

沿用案例一,学习操作HEAD指针,具体要求如下:

* 查看Git版本信息

* 移动指针

* 通过移动HEAD指针恢复数据

HEAD指针是一个可以在任何分支和版本移动的指针,通过移动指针我们可以将数据还原至任何版本。每做一次提交操作都会导致git更新一个版本,HEAD指针也跟着自动移动

步骤一 : HEAD指针基本操作

1) 准备工作(多对数据仓库进行修改、提交操作, 以产生多个版本)

echo "new file" > new.txt

git add .

git commit -m "add new.txt"

echo "first" >> new.txt

git add .

git commit -m "new.txt:first line"

echo "second" >> new.txt

git add .

git commit -m "new.txt:second"

echo "third" >> new.txt

git add .

git commit -m "new.txt:third"

git push

echo "123" > num.txt

git add .

git commit -m "num.txt:123"

echo "456" > num.txt

git add .

git commit -m "num.txt:456"

echo "789" > num.txt

git add .

git commit -m "num.txt:789"

git push

2) 查看Git版本信息

git reflog

91ca38a HEAD@{2}: commit: new.txt:789

54873e7 HEAD@{3}: commit: new.txt:456

5768d89 HEAD@{4}: commit: new.txt:123

15280ce HEAD@{5}: commit: new.txt:third

ae497ab HEAD@{6}: commit: new.txt: second

2f68e4f HEAD@{7}: commit: new.txt: first line

cf7aa2a HEAD@{8}: commit: add new.txt

e87537c HEAD@{9}: commit (initial): add some things

git log --oneline

91ca38a new.txt:789

54873e7 new.txt:456

5768d89 new.txt:123

15280ce new.txt:third

ae497ab new.txt: second

2f68e4f new.txt: first line

cf7aa2a add new.txt

e87537c add some things

3) 移动HEAD指针, 将数据还原到任意版本

提示 : 当前HEAD指针为HEAD@{0}

git reset --hard 301c0

git reflog

301c090 HEAD@{0}: reset: moving to 301c0

04ddc0f HEAD@{1}: commit: num.txt:789

7bba57b HEAD@{2}: commit: num.txt:456

301c090 HEAD@{3}: commit: num.txt:123

b427164 HEAD@{5}: commit: new.txt:third

0584949 HEAD@{6}: commit: new.txt:second

ece2dfd HEAD@{7}: commit: new.txt:first line

e1112ac HEAD@{8}: commit: add new.txt

1a0d908 HEAD@{9}: commit (initial): 初始化

cat num.txt                #查看文件是否为123

123

git reset --hard 7bba57b

cat num.txt                #查看文件是否为123,456

123

456

git reflog                #查看指针移动历史

7bba57b HEAD@{0}: reset: moving to 7bba57b

301c090 HEAD@{1}: reset: moving to 301c0

… …

git reset --hard 04ddc0f    #回到最后一次修改的版本

案例三 : Git分支操作

沿用案例二, 学习操作Git分支, 具体要求如下:

* 查看分支

* 创建分支

* 切换分支

* 合并分支

* 解决分支的冲突

你可能感兴趣的:(git 版本控制)