前言

曾经听到过这样一句话:不会git就不要敲代码了。细细品味确实有其中的道理,可能是当事人代码被强行覆盖后的叹息吧!

因此,为了避免这种情况,接下来我们就一起来好好学习git的相关知识吧!不怕你不会,就怕你不看!

一、git的三个分区

  • 工作区(working directory
  • 暂存区(stage
  • 版本库

它们之间的关系为:

通过git status查看git状态时,红色的文件表示在工作区绿色的文件表示在暂存区

工作区中的文件只要通过git add命令添加进了Git仓库,就会被追踪。

暂存区也称为index,不过常使用stage表示。

二、git常用命令

创建版本库 版本控制 远程协作 查看信息
git init git add git pull git help
git clone git commit git push git log
* git rm * git diff

三、git配置

1.git config

可以通过三个地方的三个文件设置git配置参数,分别代表三个不同的作用域:

  • /etc/gitconfig:作用域:一台计算机(操作系统)上的所有用户,几乎不会使用,优先度低于--global;设置方法:

    1. git config --system
  • ~/.gitconfig:作用域:计算机中的某用户创建的所有项目,常用,优先度低于--local;设置方法:

    1. git config --global
  • .git/config :作用域:某一特定的版本库,不常用,是最具体的,优先度最高;设置方法:

    1. git config --local

可使用git config 查看相关操作命令以及提示:

2.user.nameuser.email

添加配置

user.nameuser.email指的是用户名和邮箱,这些两个配置会被添加到提交信息中,可以搭配上述命令配置到三种作用域中:

  • 仓库配置:通过--local命令配置,作用域为当前版本库,配置写入.git/config文件中,优先度第一;
  1. git config --local user.name "张三"
  2. git config --local user.email test1@git.com

以上为配置特定版本库(mygit)的用户和邮箱:这样配置就可以通过两个版本库来进行多人操作的模拟;

  • 用户配置:通过--global命令配置,作用域为当前系统用户,配置写入~/.gitconfig文件,优先度第二;
  1. git config --global user.name "张三哥哥"
  2. git config --global user.email test2@git.com

  • 系统配置:通过--system命令配置,作用域为当前操作系统所有用户,配置写入/etc/gitconfig文件,优先度第三;这里需要管理员身份运行git bash才有修改权限:
  1. git config --system user.name "张三爸爸"
  2. git config --system user.email test3@git.com

查看配置
  • 直接查看配置文件(可通过cat指令查看):

    • 仓库配置.git/config

    • 用户配置~/,gitconfig

    • 系统配置/etc/gitconfig

  • 通过git config --list可以批量查看配置信息:

  • 通过git config user.name/email查看:

可以看到输出的配置信息是仓库配置张三,验证了仓库配置的优先级最高

修改配置

删除config配置

  1. git config --unset <参数名>

首先设置错误参数,随后查看该配置:

删除该配置:

修改user.name/email配置

  • 可以通过添加配置的方式对原有配置进行覆盖,从而达到修改的效果:

  • 通过--unset命令删除指定的配置信息:

我们以该方式继续删除用户配置--global user.name张三哥哥,和仓库配置--local user.emailtest1@git.com

此时再次通过git config user.name/email查看配置信息user.name/email

可以发现user.name显示的是系统配置:张三爸爸user.email显示的是用户配置:test2@git.com,验证了用户配置优先级第二和系统配置优先级第三

3..gitignore

作用

我们可以通过git提供的.gitignore文件配置不被git跟踪的文件。被添加到.gitignore文件中的文件名,将不会被git追踪。如下图中的新增文件setting.properties

可见在.gitignore(注意文件是官方规定好了的不能随便乱改)文件中添加了文件名setting.properties后,git便不再追踪setting.properties这个文件了;

应用场景

通常用来忽略本地开发中的下列文件:

  • .idea.settings.classpath等无用配置;
  • 系统自动生成的文件:各种IDE的配置文件,项目依赖文件等;如vue-cli创建项目中node_modules目录下的各种依赖文件;
  • 编译生成的中间文件,可执行文件;
  • 敏感的配置文件和本地不想提交的脚本文件等;
实战演示

只要与.gitignore中内容相匹配的目录或文件就会被git忽略;再如:

.gtiignore文件非常重要,一般放在创建项目的根目录上

注意在.gitignore文件中一行写一个文件名;.gitignore文件也支持正则表达式比如:

  • *.a:忽略所有以 .a 结尾的文件;
  • !lib.a:表示除了lib.a文件,其余都会被忽略;
  • /TODO:仅仅忽略项目根目录下的TODO文件,不包括subdir/TODOTODO为示例文件);
    • 可以通过/*/TODO使一层目录下的TODO文件被忽略;
    • 通过 /**/TODO 使所有层目录下的TODO文件都被忽略;
  • build/ 表示忽略build目录下的所有文件;
  • doc/*.txt 表示忽略doc目录下所有的.txt文件,包括doc/notes.txt 但不包括 doc/server/.arch.txt
    • doc/*/*.txt 会忽略doc目录及其任何一个子目录下的所有.txt文件,比如doc/bin/2.txt/ * 表示一层目录);
    • doc/**/*.txt 则会把doc任何一层目录及其子目录下的.txt文件忽略;即 /**/ 两颗星表示所有层目录;

以下为某个使用vue-cli3创建项目下的.gitignore文件内容:

  1. .DS_Store
  2. node_modules
  3. /dist
  4. # local env files
  5. .env.local
  6. .env.*.local
  7. # Log files
  8. npm-debug.log*
  9. yarn-debug.log*
  10. yarn-error.log*
  11. # Editor directories and files
  12. .idea
  13. .vscode
  14. *.suo
  15. *.ntvs*
  16. *.njsproj
  17. *.sln
  18. *.sw?
配置技巧

其实我们不需要每次都手写一遍.gitignore文件,可以通过这个网站自动生成不同语言项目的忽略文件:http://gitignore.io/

在输入框中输入相关语言标签,就可以自动生成忽略文件列表。可以将它作为参考,选择其中需要的添加到.gitignore文件中:

.gitignore失效

原因:.gitignore只能忽略那些原来没有被追踪(untrack)的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。

解决方案:清除git本地缓存,将文件转变为untrack状态,然后再提交:

  1. git rm -r --cached .
  2. git add .

四、查看状态

1.git status

查看工作区的状态,该命令经常使用;每执行一条指令后,都应使用该命令查看工作区和暂存区的状态红色表示对文件的更改还没提交到暂存区;绿色表示已提交到暂存区;

五、工作区 ->暂存区

1.git add <file>

工作区中的文件提交到暂存区

  • git add test.txt:将工作区中的test.txt提交到暂存区;
  • git add test.txt test2.txt:将工作区中的test.txttest2.txt提交到暂存区;
  • git add .:将当前目录及其子目录下的所有文件从工作区提交到暂存区中;

六、暂存区 ->版本库

1.git commit -m '注释'

将暂存区中的文件提交到版本库,一定要添加注释,否则不让提交:当注释很短时采用-m方式(mmessage的意思):

2.git commit

当注释很长时,可以直接执行git commit,进入vim编辑器界面,在此处编写较长的注释,添加完注释后,通过wq保存并退出即可:

3.git commit -am '注释'

表示添加当前目录下所有已被git追踪的文件到暂存区中并提交,即相当于是git add .git commit 两步操作的合成。

该方式只适用于已被git追踪的文件(即文件至少提交过一次),当文件第一次提交到暂存区时(此时该文件并未被git追踪)不可以使用该命令,而是要分开写,否则会报错:

七、工作区<-暂存区

简单来说,就是将git status指令显示出来的文件,从绿色变为红色,大概有如下三种方法:

1.git rm --cached <file>

删除缓存区中的<file>文件,并将其还原到工作区。该指令需要对暂存区删除的文件进行一次提交操作,所以建议用第二种方法;

2.git restore --stage <file>

通过该指令,将文件从缓存区中移动到工作区,这里的参数--stage写成--staged效果是一样的:

小贴士:可以使用tab键补全命令;

3.git reset HEAD <file>

将文件从缓存区中移到工作区,作用与方法2一样:

八、撤销操作

这里指的是撤销工作区中对文件的操作,包括新增、修改、删除等,配合着前面第七点所讲的指令使用。大概有以下两种方法:

1.git checkout -- <file>

可以撤销工作区中对flie文件的改动操作(包括删除):注意--后面要跟上空格:如果修改已经通过git add提交到暂存区,该指令无效。

2.git restore <file>

可以撤销工作区中对file文件的操作,效果与方法1相同;

九、日志

git的日志记录了git仓库对文件的所有操作,主要分为三大类:分支的提交日志、文件的修改日志git操作日志。通过查看这些日志信息,可以很好地了解git仓库的历史记录,并根据需要进行版本回退。

1.查看提交日志

使用的主要命令为git log,通过添加不同的参数,可以显示不同形式的提交日志,下面主要介绍其中常用的几种:

git log

查看版本库的提交(commit)历史:

  • 提交历史是倒叙的,最新的提交排在最前面;

  • Git的提交idcommit id)是一个摘要值,这个摘要值实际上是通过sha1算法计算出来的不重复字符串。由此保证了每次提交id的唯一性;

  • Author显示的是提交时优先级最高的配置,比如提交时有--local配置就显示它,没有就显示--global的配置;如上图中:第二次提交时使用的是修改过后的config李四,也就是优先级更高的--local配置;

git log -n

可以查看最近的n次的提交历史,比如通过git log -3 查看最近3次的提交历史:

git log --graph

以图形化的形式显示提交历史:

git log --pretty=oneline

以一行的形式显示提交历史:

git log --graph --abbrev-commit

通过--abbrev-commit对提交信息进行简化:

还可以结合--pretty=oneline进行简写:

  1. git log --pretty=oneline --abbrev-commit

git log --pretty=oneline:"%h - %an, %ar : %s"

还可以按照规定的格式显示日志内容:%h:表示commit id%an:表示提交人;%ar:表示提交时间;%s:表示提交信息;

git log --all --decorate --oneline --graph

该命令比较厉害,是StackOverflow上网友组装的命令,可以一次性查看所有分支及其提交记录,非常实用:

如上图所示,三个分支devmastertest以及每个分支的提交记录都一次性显示出来了。由于该命令十分常用,但是又很长,不好记忆。所以,我们可以给该命令设置别名(alias),比如取该命令的首字母组成别名dog,在全局下进行配置:

  1. git config --global alias.dog 'log --all --decorate --oneline --graph'

设置好别名之后,就可以通过git dog来执行这条指令了。有关别名的内容,之后会详细进行讲解。

2.查看修改日志

git blame file_name

如图所示,通过该命令可以清楚查看指定的文件的每次修改。包括修改用户,修改时间等;

3.查看操作日志

git reflog

通过该指令可以详细地查看,每次操作所在提交节点的commit id,以及在此提交节点上所执行的操作(指令);并且是倒叙显示的,即最近一次操作的序号为{0}

git log:只能显示当前分支的提交历史,如果进行版本回退,会丢失较后版本的提交信息,如下图所示:

可以看到通过reset进行版本回退,丢失了4th commit的提交信息,此时可通过git reflog查看操作日志的相关操作信息来回到最新的版本。

总结:

  • 总体上来说,操作日志包含了修改日志和提交日志,是最全的git日志;

  • 注意:不是通过git命令,而是手动修改文件,这些修改记录不会被git日志记录。所以,推荐使用git指令进行操作;

第一讲:Git分区,配置与日志的更多相关文章

  1. git第一节----git config配置

    @查看git的版本 git --version @查看git配置信息 git config --list config list分全局和局部,在根目录下执行git config --list显示为全局 ...

  2. x64汇编第一讲,Vs系列配置x64环境与x86环境

    目录 x64汇编环境配置 一丶x64环境配置 1.1 VS系列编译器配置X64Asm开发环境. 二丶Vs配置X86汇编环境. x64汇编环境配置 一丶x64环境配置 现在windows系统都是64位了 ...

  3. Git常规配置与基本用法

    Git环境配置 一. 全局配置 1. 配置文件 git全局配置文件.gitconfig默认在当前系统用户文件夹下,window可运行%USERPROFILE%查找,Mac系统在cd ~查找. 具体配置 ...

  4. 基于java配置log4j日志详解

    1.Log4j 1.1了解Log4j Log4j是Apache的一个开源项目,通过使用log4j,我们可以控制日志信息输送的目的地可以是控制台.文件.GUI组件,我们也可以控制每一条日志的输出格式,通 ...

  5. 【Azure 事件中心】为应用程序网关(Application Gateway with WAF) 配置诊断日志,发送到事件中心

    问题描述 在Application Gateway中,开启WAF(Web application firewall)后,现在需要把访问的日志输出到第三方分析代码中进行分析,如何来获取WAF的诊断日志呢 ...

  6. Git 常用配置和使用

    Git:是一个分布式的源代码管理工具,Linux内核的代码就是用Git管理的所以它很强,也很快, 和 Vss/SVN比起来 本地Git初始化配置及其使用: 1. 初始化本地Git库:打开Git Bas ...

  7. Nginx日志配置及日志切割

    日志配置 日志对于统计排错来说非常有利的.本文总结了nginx日志相关的配置如access_log.log_format.open_log_file_cache.log_not_found.log_s ...

  8. 32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用

    32位汇编第一讲x86和8086的区别,以及OllyDbg调试器的使用 一丶32位(x86也称为80386)与8086(16位)汇编的区别 1.寄存器的改变 AX 变为 EAX  可以这样想,16位通 ...

  9. PE文件格式详解,第一讲,DOS头文件格式

    PE文件格式详解,第一讲,DOS头文件格式 今天讲解PE文件格式的DOS头文件格式 首先我们要理解,什么是文件格式,我们常说的EXE可执行程序,就是一个文件格式,那么我们要了解它里面到底存了什么内容 ...

随机推荐

  1. [poj1062][最短路]昂贵的聘礼

    (最近总是有想让我的小博客更加充实的冲动,遇见一个不平常的题就想写下来.今天这个题姑且算是同学推荐的好题,很有意思,志之) 题目 题面 年轻的探险家来到了一个印第安部落里.在那里他和酋长的女儿相爱了, ...

  2. Effective Go中文版(更新中)

    原文链接:https://golang.org/doc/effective_go.html Introduction Go是一种新兴的编程语言.虽然它借鉴了现有语言的思想,但它具有不同寻常的特性,使得 ...

  3. CentOS7系统更换软件安装源

    1.备份你的原镜像文件,以免出错后可以恢复. cp /etc/yum.repos.d/CentOS-Base.repo{,.backup} # 或者 mv /etc/yum.repos.d/CentO ...

  4. js小数计算引起的精度误差问题

    我记得刚开始学js的时候学到浮点有举例0.1+0.2 它的计算结果是: 0.1+0.20.30000000000000004 很神奇的一个计算,js是弱语言,在精度上没做处理: 我就自己定义了加减乘除 ...

  5. SSM整合搭建(二)

    本页来衔接上一页继续来搭建SSM,再提一下大家如果不详细可以再去看视频哦,B站就有 之后我们来配置SpringMVC的配置文件,主要是配置跳转的逻辑 先扫描所有的业务逻辑组件 我们要用SpringMV ...

  6. C#中无边框窗体拖动

    //定义一个bool变量标识是否拖动窗体 private bool isMove = false; //记录鼠标的位置 private Point point; 定义的变量 /// <summa ...

  7. [Microsoft Teams]使用连接器接收Azure Devops的通知

    1. 什么是连接器 连接器(connector)是Teams中频道的一个接受消息的功能,官方的解释如下: 连接器允许用户订阅来自 web 服务的接收通知和消息. 它们公开服务的 HTTPS 终结点,通 ...

  8. SQLServer——MASTER..spt_values

    常常见到这个表,人家用得天花乱坠的. 自己select一看却莫名其妙的. 如上, 这个表主要用来保存一些枚举值, 据说是从sybase继承过来,许多函数和存储过程可以看到它的身影.也可以叫系统常量表吧 ...

  9. Spring Boot(十三):整合Redis哨兵,集群模式实践

    前面的两篇文章(Redis的持久化方案, 一文掌握Redis的三种集群方案)分别介绍了Redis的持久化与集群方案 -- 包括主从复制模式.哨兵模式.Cluster模式,其中主从复制模式由于不能自动做 ...

  10. Unity 游戏框架搭建 2019 (八) 关于导出 UnityPackage 功能的小结

    导出 UnityPackage 功能到这里要告一段落了,相信认真看的童鞋都有收获.笔者在写教程之前纠结了很久.到底是先给出一坨工具代码,然后再逐个讲解比较好,还是一篇一个知识点比较好.后来想通了.工具 ...