乐趣区

版本控制系统Git笔记

git 介绍

Git 是一个开源的 分布式版本控制系统 ,用于敏捷高效地处理任何或小或大的项目,它最初是由 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件并且它采用了 分布式版本库 的方式,不必服务器端软件支持。

git 官网
git 的官网:https://git-scm.com/

git 的功能
Git 作为一个版本控制工具,它具备的功能如下:

  • 协同修改:多人可以并行不悖地修改服务器端的同一文件;
  • 数据备份:可以保存文件或者目录的当前状态,也可以保存每一个提交过的历史状态;
  • 版本管理 :Git 采取了 文件系统快照 的方式,在保存每一个版本的文件信息的时候做到不保存重复数据,以节约存储空间,提高运行效率。
  • 权限控制:对开发团队的人员进行权限控制,对团队开发者贡献的代码进行审核;
  • 历史记录:可以查看修改人员、修改时间、修改内容、日志信息,可以将本地文件恢复到某一个历史状态;
  • 分支管理:允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。

git 的优势

  1. 大部分操作都在本地完成,不需要联网;
  2. 完整性保证;
  3. 尽可能添加数据而不是删除或修改数据;
  4. 分支操作非常快捷流畅;
  5. 与 Linux 命令完全兼容。

git 的安装

Linux 系统安装

1. 环境说明:使用的是 Centos7 系统,防火墙为关闭状态。

[root@moli_linux1 ~]$ rpm -qa centos-release
centos-release-7-5.1804.el7.centos.2.x86_64
[root@moli_linux1 ~]$ uname -a
Linux moli_linux1 3.10.0-862.6.3.el7.x86_64 #1 SMP Tue Jun 26 16:32:21 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@moli_linux1 ~]$ getenforce
Disabled
[root@moli_linux1 ~]$ systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)

2. yum 安装 git
CentOS 系统中自带了 git 包,可直接使用 yum 命令进行安装

[root@moli_linux1 ~]$ rpm -qa git
git-1.8.3.1-20.el7.x86_64 # 自带的 git 版本为 1.8.3
[root@moli_linux1 ~]$ yum install -y git # 进行安装

3. 编译安装
如果觉得自带的 git 版本过低,需要安装较新版本的 git 软件,可以使用编译安装的方法。
首先,去 github 上下载源码包,地址:https://github.com/git/git/re…


访问即可看到多个版本的 git 包,这里我选择 git.2.21.0 版本的源码包,选择 tar.gz 格式,进行下载。
下载到 CentOS 系统后,进行编译安装:

# 安装依赖包
yum install curl-devel expat-devel gettext-devel  openssl-devel zlib-devel
# 卸载 Yum 安装的 git
yum remove git
# 编译安装
tar -zxf git-2.21.0.tar.gz
cd git-2.21.0
make configure
./configure --prefix=/usr
make  
make install  

编译成功后,输入git --version,有输出版本信息即表示成功。

[root@moli_linux1 ~]$ git --version
git version 2.21.0

window10 安装

使用 git 之前的简单配置

Git 软件提供了一个叫做 git config 的工具,专门用来配置或读取相应的工作环境变量。
定义的这些环境变量,决定了 git 在之后工作的各个环节的工作方式和行为。而存放这些环境变量的配置文件可以存在在三个地方:

  • /etc/gitconfig文件:系统中对所有用户都普遍适用的配置。若使用 git config时用 --system选项,读写的就是这个文件。
  • ~/.gitconfig 文件:用户目录下的配置文件只适用于该用户。若使用 git config 时用 --global 选项,读写的就是这个文件。
  • 当前项目的 Git 目录中的配置文件(也就是工作目录中的 .git/config 文件):这里的配置仅仅针对当前项目有效。每一个级别的配置都会覆盖上层的相同配置,所以 .git/config 里的配置会覆盖 /etc/gitconfig 中的同名变量。

配置 git

[root@moli_linux1 ~]$ git config --global user.name "mori" # 配置 git 的使用用户
[root@moli_linux1 ~]$ git config --global user.email "xxx@qq.com" # 配置用户邮箱
[root@moli_linux1 ~]$ git config --global color.ui true # 配置语法高亮
[root@moli_linux1 ~]$ git config --list # 查看 git 的配置
user.name=mori
user.email=xxx@qq.com
color.ui=true

生成的配置文件

[root@moli_linux1 ~]$ cat ~/.gitconfig 
[user]
    name = mori
    email = xxx@qq.com
[color]
    ui = true

说明:这里使用了 –global 选项,更改的配置为当前用户家目录的.gitconfig 文件,之后所有的 git 项目都会使用这个配置文件的环境变量。

git 基本概念

git 的结构包括工作区、暂存区以及版本库。

  • 工作区:具体来说就是一个工作的目录
  • 暂存区:一般存放在 “.git 目录下 ” 下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
  • 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是 Git 的版本库。
  • 远程库:一般是在代码托管中心的版本库

Git 基本操作

1. 创建 Git 仓库

命令:
git init: 初始化一个 git 仓库
git status:查看工作区,暂存区状态

    # 创建目录
    mkdir git_test
    # 进入目录
    cd git_test
    # 初始化
    git init
    # 查看本地库状态
    git status

除了创建仓库外,还可以克隆一个仓库,使用命令 git clone url
选项说明:
url:Git 仓库, 可以克隆本地也可以克隆远程库,比如克隆 996.icu 项目到本地

git clone https://github.com/996icu/996.ICU.git

也可以将克隆下来的仓库改名

 git clone https://github.com/996icu/996.ICU.git 996.icu

2. 添加文件到缓存区

命令:
git add [filename]: 将工作区的“新建 / 修改”添加到暂存区。
选项说明:
filename:可选参数,指定文件名会添加这个文件到暂存区

touch README.md
git add README.md
git add . # 添加 Git 仓库的所有文件

3. 提交文件

命令:
git commit -m "commit message" [filename]:将暂存区的内容提交到 Git 仓库
- m 选项是注释,提交内容时的说明。

git commit -m "首次提交,版本为 1.0" README.md

如果不加 -m 选项,执行 git commit 会弹出 vim 编辑器让你进行编写注释,如果想跳过注释可直接敲:

git commit -a README.md

4. 查看历史记录

git 在提交或者更新版本后,想版本回退,回顾提交历史便可以使用 git log 查看历史记录。
命令:
git log: 查看 Git 仓库的提交历史

[root@moli_linux1 git_test]$ git log
commit 3afbcb6bf263261c4c57ef399f3e5f11127dded8 (HEAD -> master)
Author: mori <xxx@qq.com>
Date:   Thu Apr 25 15:28:22 2019 +0800

    修改了 index.html 文件

commit 779f37bbb3c81827b7ee17e3d30b01c7b3f849ac
Author: mori <xxx@qq.com>
Date:   Thu Apr 25 15:01:57 2019 +0800

    the first commit

可以使用命令 git log --pretty=oneline 查看简洁的历史记录

 [root@moli_linux1 git_test]$ git log --pretty=oneline
3afbcb6bf263261c4c57ef399f3e5f11127dded8 (HEAD -> master) 修改了 index.html 文件
779f37bbb3c81827b7ee17e3d30b01c7b3f849ac the first commit      

更加简洁的历史记录:git log --online

[root@moli_linux1 git_test]$ git log --oneline
3afbcb6 (HEAD -> master) 修改了 index.html 文件
779f37b the first commit

查看历史记录的另外一个命令:git reflog

[root@moli_linux1 git_test]$ git reflog
3afbcb6 (HEAD -> master) HEAD@{0}: commit: 修改了 index.html 文件
779f37b HEAD@{1}: commit (initial): the first commit

5. 版本的回滚前进

Git 服务程序中有一个叫做 HEAD 的版本指针,当用户申请还原数据时,其实就是将 HEAD 指针指向到某个特定的提交版本,但是因为 Git 是分布式版本控制系统,为了避免历史记录冲突,故使用了 SHA- 1 计算出十六进制的哈希字串来区分每个提交版本,另外默认的 HEAD 版本指针会指向到最近的一次提交版本记录,而上一个提交版本会叫 HEAD^,上上一个版本则会叫做 HEAD^^,当然一般会用 HEAD~5 来表示往上数第五个提交版本。

进行版本的前进后退使用命令:git reset [选项参数] ..

示例:

基于哈希字串进行版本前进后退:

git reset --hard 3afbcb6

基于 ^ 符号,只能进行后退,一个 ^ 表示后退一步,n 个 ^ 后退 n 步:

git reset --hard HEAD^ # 向后退一个版本
git reset --hard HEAD^^ # 向后退两个版本

基于 ~ 符号,只能进行版本后退:

git reset --hard HEAD~n # n 是数字,表示后退 n 步    

git reset命令除了 --hard 参数还有 --soft--mixed参数,它们的区别如下:

  • --hard:在本地库移动 HEAD 指针,重置暂存区,重置工作区
  • --soft:仅仅在本地库移动 HEAD 指针
  • --mixed:在本地库移动 HEAD 指针,重置暂存区

6. 标签使用

如果项目的版本到了一个特殊的阶段,并且你想以特殊的名字给这个版本快照而不是一串长长又难记字符串,那么就可以使用标签了,并且 git 也支持使用标签进行回滚。
命令:

git tag V1.0 # 为当前提交的内容打标签 V1.0
git tag # 查看当前所有的标签
git show V1.0 # 查看 V1.0 标签的详细信息
git tag V1.1 -m "Version 1.1 release is test" # 创建带有说明信息的标签
git tag -d V1.0 # 删除标签

7. 删除文件

对于 Git 仓库的文件,文件的删除需要了解当前文件的状态。

  • 对于没有添加到暂存区的文件直接 rm 删除即可

已经提交到暂存区的数据,

  • git rm --cached filename,该操作将文件移出暂存区,并不会删除当前目录下的数据文件
  • git rm -f filename,该命令会将文件移出暂存区并且将当前目录下的数据文件删除

Git 分支结构

什么是分支?简单来说就是:在版本控制过程中,使用多条线同时推进多个任务。
在 Git 中,初始化一个版本库之后,自身就会有一个 master 分支(也可以叫做主干)。实际开发中,master 分支仅用于发布新版本,实际的开发等操作都在其他分支上,所以 master 应该保持稳定。

使用分支可以同时并行推进多个功能的开发,提高开发效率,各个分支在开发过程中,如果某个分支开发失败并不会对其他分支造成影响,失败的分支删除重新开始即可。

退出移动版