版本控制系统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包,这里我选择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

使用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笔记》

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

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应该保持稳定。

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

分支的基本操作

git branch # 查看版本库的所有分支
git branch -v # 查看版本库的所有分支
git branch hot_fix # 创建新的分支hot_fix
git checkout hot_fix # 切换到分支hot_fix
git merge hot_fix # 合并分支

说明:
git branch -v查看所有的版本库分支,分支前面有星号的表示当前处于星号后面的分支

[root@moli_linux1 git_test]$ git branch
  hot_fix
* master  # 当前处于master分支

合并分支之前,必须先切换到接受合并的分支上,比如hot_fix分支想要与master分支合并,那么必须先切换到master分支上,再与hot_fix分支合并。

git checkout master 
git merge hot_fix

分支的冲突与解决

当两个分支分别对同一个文件的同一行作不同的修改,那么当合并分支的时候就会出现冲突。
模拟冲突与解决:
在master分支上操作

[root@moli_linux1 git_test]$ cat test.txt 
aaa
bbb
ccc
edit by master
[root@moli_linux1 git_test]$ git commit -m "write by master" test.txt 
[master 9be685a] write by master
 1 file changed, 4 insertions(+)
 create mode 100644 test.txt

在hot_fix分支上操作


[root@moli_linux1 git_test]$ git checkout hot_fix
切换到分支 'hot_fix'
[root@moli_linux1 git_test]# vim test.txt
[root@moli_linux1 git_test]# cat test.txt
aaa
bbb
ccc
edit by hot_fix

在master分支上合并hot_fix分支,出现错误

[root@moli_linux1 git_test]$ git merge hot_fix
冲突(add/add):合并冲突于 test.txt
自动合并 test.txt
自动合并失败,修正冲突然后提交修正的结果。

冲突的表现如下

[root@moli_linux1 git_test]$ cat test.txt 
aaa
bbb
ccc
<<<<<<< HEAD
edit by master
=======
edit by hot_fix
>>>>>>> hot_fix

HEAD 表示当前分支中有冲突的内容是edit by master
hot_fix上的内容表示该分支有冲突的内容是edit by hot_fix

解决冲突
修改有文件中有冲突的地方,并将冲突的表现<<<HEAD >>>>hot_fix删除,修改到自己满意的程度,保存退出

[root@moli_linux1 git_test]$ cat test.txt 
aaa
bbb
ccc
edit by master
dit by hot_fix

接着执行git add 文件名,然后git commit ,最后再合并,这样冲突就解决了。

[root@moli_linux1 git_test]$ git add test.txt 
[root@moli_linux1 git_test]$ git commit -m "解决冲突"
位于分支 master
无文件要提交,干净的工作区
[root@moli_linux1 git_test]$ git merge hot_fix
已经是最新的。
[root@moli_linux1 git_test]$ 

注意解决冲突时的git commit 时不用加文件名,否则会报错,当然,注释说明是可以的。

    原文作者:mori_d
    原文地址: https://segmentfault.com/a/1190000018987812
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞