说到Git,作为程序员的你,在项目开发中一定会使用到或将来也一定会使用到的,但是我相信,很多在使用Git的人,都只是停留一些简单的操作上,比如提交(commit)、拉取(pull)、推送(push)。

而对于Git的工作原理,如何解决Git的版本冲突以及如何使用Git进行源码管理等问题可能并没有太深的认识,那么接下来,我们从最基础的开始,一起由浅入深来探讨一下。

什么是Git?

  • Git目前最流行和最强大的开源分布式版本控制管理系统。

  • Git作者是Linus Torvalds,这个名字是不是听着很熟,没错,是Linus Torvalds也是Linux操作系统的作者。

  • Git的作者因为很讨厌集中式版本控制管理系统,所以才会想开发分布式版本管理系统,这才有Git的诞生。

  • Git开发的初衷也是为了方便Linux社区更好地管理和维护Linux系统的代码。

Git和SVN的比较

GitSVN之间的比较,也可以看作是分布式版本管理系统集中式版本管理系统的比较,Git是分布式版本管理系统,而SVN是集中式版本管理系统。

从版本库存储的位置进行比较

对于集中式版本管理系统而言,版本库是放在远程服务器上的,开发人员通过与服务器上的版本库连接进行代码版本提交,如果无法连接到服务器上,根本没有办法进行代码的版本管理,如:

图1:SVN客户端与服务器示意图

而分布式版本管理系统,代码提交与版本管理都可以本地进行,不必连到服务器就可以进行各种版本管理操作。

只有当我们觉得需要与其他人同步代码时,才需要连到其他版本库进行同步操作,如下图所示:

图2:Git开发者之间交互示意图

学习难度上进行比较

Git虽然非常强大好用,但其学习难度比SVN大,虽然上手很容易,只需要学习git add,git commit,git pushgit pull,但要真正学会且能很好地应用于复杂的项目开发管理,其学习周期还是比较长的,而SVN则相对比较容易掌握。

从版本库大小进行比较

Git的版本库是存储在我们的本地,所以会占用我们本地的存储空间,另外,由于Git版本库包含每个文件的的副本,因此相比集中式的版本控制管理系统,也会占用更多的存储空间。

区分Git、GitLab、GitHub

Git是分布式版本控制系统,通过Git提供的工具集,我们可以管理本地版本库,并可以将代码提交到远程版本库或拉回其他人提交的版本。

Github是基于Git的在线Web代码托管服务,我们可以在Github上创建自己的公有或私有的版本库(私有库要钱的),并可以通过Web页面进行管理,而在我们本地还可以通过Git与之交互,将代码提交到Github上面的远程版本库中与团队其他成员共享。

如果我们对自己的项目源代码的安全性要求更高呢?这时候我们需要搭建自己的代码托管服务,这时候GitLab便是很好的选择了。

GitLab是一套用于搭建我们自己的私有Web代码托管服务项目,通过使用GitLab,我们可以在自己的服务器上搭建与Github一样的Web代码托管服务器,同样,GitLab也提供一样的Web页面管理操作。

最小化配置

如果你完成了Git的安装,那么在使用Git之前你需要完成一个小小的配置,就是配置用户信息。

Git的所有配置使用git config命令来完成,而用户信息只需要配置user.nameuser.email即可,如下:

# 配置用户名
git config --global user.name '你的用户名' # 配置邮箱
git config --global user.email '你的邮箱'
复制代码

上面git config命令用参数--global指定的配置为全局配置,也就是对所有版本库都会生效,除了--global外,git config命令还可以通过--local-- system两个参数来指定配置的级别。

参数 说明
--global 全局有效
--system 对当前所有登录的用户有效
--local 对当前版本库有效

如果有相同的配置,通过--local指定的配置优先大于--system,而--system的优先级大于--global

查看配置

git config后面跟上--list参数可以查看Git配置,再指定--global,--system,--local,可以查看不同级别的配置,如:

查看全局配置
git config --list --global
复制代码
查看用户级别配置
git config --list --system
复制代码
查看当前版本库配置
git config --list --local
复制代码

如果指定--local时,当前执行命令的目录必须在一个版本库下,否则会报以下的错误:

fatal: --local can only be used inside a git repository
复制代码

版本库管理

版本库是Git中最重要的概念,在一个版本库中,包含了当前项目所有的提交。

创建本地版本仓库

安好Git之后,便可以通过Git提供的命令来创建版本库了,通过版本库,将添加到版本库里面的文件进行版本管理。

先创建目录,再创建版本库

# 创建空目录
$ mkdir test
# 进入空目录
$ cd test
# 初始化版本库
$ git init
复制代码

我们也可以将上面的的步骤简化为:

$ git init test
$ cd test
复制代码

克隆远程版本仓库

上面我们通过git init命令在本地初始化一个版本库,一种这种称为裸库,而有时候,我们会直接通过git clone命令将远程的版本库克隆到本地,如:

git clone https://www.github.com/test/test.git
复制代码

通过这种方式,我们可以将远程版本库中项目克隆到本地,当我们参与一些老的项目时,一般就是采用这种方式来创建本地的版本库。

工作目录、版本库(stage)、暂存区(repository)

通过上面的两种方式,我们已经在本地创建好了版本库,接下来我们就可以开始将自己的文件添加到版本库了。

首先我们在工作目录创建名为test.txt的文件,内容可以随意,比如:

这是我添加到版本库中的第一个文件
复制代码

这时候我们通过git status命令查看工作目录的状态,如下所示:

$ git status
On branch master No commits yet Untracked files:
(use "git add <file>..." to include in what will be committed) test.txt nothing added to commit but untracked files present (use "git add" to track)
复制代码

可以看到,Git提示我们要执行git add <file>操作,这是将文件到添加Git的暂存区,我们执行一下:

# 下面三个命令都可以将test.txt添加到暂存区
git add test.txt
git add .
git add all
复制代码

再使用git status查看状态,如下表示已经添加到暂时区了。

$ git status
On branch master No commits yet Changes to be committed:
(use "git rm --cached <file>..." to unstage) new file: test.txt
复制代码

接下来便是将暂存区中的文件提交到版本库了,使用git commit命令,后面的-m表示提示说明。

git commit -m "添加test.txt文件"
复制代码

提交后,结果如下:

[master 23811d4] 添加test.txt文件
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 test.txt
复制代码

上面结果提示中,23811d4表示本次的提交的ID,这个ID是实际上是由40个十进制数字组的SHA1散列值,上面结果中显示只是这个提交ID的前7位值。

这里需要明确几个概念,那就是工作区暂存区版本库,该项目所有目录,我们称为工作区,而在该目录下,会生成一个.git的隐藏目录,这个目录我们称为版本库暂存区(stage)Git独有的概念,暂存区版本库的一部分,这三者之间的关系,我们如下图所示:

如果想把文件从暂存区移除,可能使用下面的命令:

git rm --cached test.txt
复制代码

分支管理(branch)

我们知道在Git中,每个提供都会产生一个40位十六进制数字组成的SHA1散列值,而由这些值串成的一条时间线,便是分支,在上面的演示中,我们一直在Gitmaster分支上。

masterGit的默认分支,除了master外,我们任意创建自己的分支,分支总是向指最新的提交(commit),而在Git版本库中,还保留着一个指针HEAD,默认指向当前分支,所以分支、HEAD与commit的关系是HEAD是一个指针,指向当前分支的最新提交(commit),并且将HEAD保存在.git/HEAD文件当中。

通过下面的图,我们可以更好地理解不同分支,提交与HEAD的关系:

创建分支

git branch命令后面跟上分支名可以基于当前的分支再创建一个新的分支,如:

git branch deveolp
复制代码

查看分支

git branch
复制代码

执行结果如下:

  develop
* master
复制代码

也可以使用下面的方式查看分支列表

$ git show-branch
! [develop] develop
* [master] develop
--
+* [develop] develop
复制代码

检出分支

通过git branch命令创建好分支后,Git并不会帮我们检出该分支,我们可以使用git checkout命令检出该分支,这样便可以在该分支下进行开发了,如:

$ git checkout develop
复制代码

如果检出的分支不存在,则会报错,比如我们检出不存在的dev分支,会报如下所示的错误:

error: pathspec 'dev' did not match any file(s) known to git
复制代码

如果在检出分支不存在时,想基于当前分支直接创建分支,也可以在git checkout跟上参数-b,如:

git checkout -b dev
复制代码

这样便可以直接创建分支了,当然,如果分支已经存在,也会报错,比如:

git checkout -b develop
复制代码

由于我们创建了develop,因此会报出以下错误:

fatal: A branch named 'develop' already exists.
复制代码

删除分支

对于不想的分支,可以使用git branch -d命令进行删除,如:

git branch -d develop
复制代码

强制删除

git branch -D develop
复制代码

合并分支

当我们开发完成后,从develop合并到master,这时的操作应该切到master分支下,在master执行合并命令。

git merge develop
复制代码

简单的标签管理(Tag)

Git支持打标签(tag)的操作,标签有时候也称为里程碑,当我们开发到一定阶段有一定的成果,我们可以在当前分支上打上一个标签,比如说我们在开发到某个阶段时,在分支打上v1.0的标签,表示1.0版本已经完成。

查看所有的标签

在打标签之前,我们先看一下如何查看所有的标签,如:

$ git tag
v1.0
v1.1
v1.2
v2.3
复制代码

上面的命令会简单显示所有的一个简单的标签列表,如果想查看标签的说明,可以这样

$ git tag -n1
v1.0 develop
v1.1 develop
v1.2 develop
v2.3 develop
复制代码

使用通配符查看本地标签

$ git tag -l v1.*
v1.0
v1.1
v1.2
复制代码

创建标签

创建标签有以下几种方式:

git tag <tag_name> [commit_id]
git tag -a <tag_name> [commit_id]
git tag -m message <tag_name> [commit_id]
git tag -s <tag_name> [commit_id]
git tag -u <key> <tag_name> [commit_id]
复制代码

不带commit_id,创建没有说明的tag:

git tag v1.0
复制代码

使用-a参数添加标签说明,这种方式会打一个vim编辑器让我们输入说明:

git tag -a v1.1
复制代码

在某个commit之上打标签

git tag v1.2 c22be11
复制代码

删除标签

Git标签不允许修改,如果我们对某个标签不满意,可以删除标签,再重新创建,删除标签语句如下:

git tag -d v1.2
复制代码

忽略特殊文件

在项目开发时,有一些文件我们不想添加到怎么版本库中进行版本控制,比如IDE自动生成的配置文件、项目数据库配置文件或者编译后生成的临时目录等等。

这时候我们可以在工作目录中添加.gitignore文件来指要忽略哪些目录或文件,并将.gitignore文件添加到版本库,因为.gitignore文件需要进行版本控制。

当然,除了通过.gitignore文件指定忽略文件外,也可以通过命令行直接指定。

忽略文件的位置

工作区根目录

在工作区根目录创建.gitignore文件是最常用的方式,这种方式可以控制整个项目的文件。

工作区子目录

在某个子目录上创建.gitignore文件来覆盖上层目录中.gitignore的忽略规则对当前目录的影响。

全局配置

当我们在工作区创建忽略文件后,如果我们通过push操作把项目推送到远程版本库,那么忽略文件同样也要推送上去,这里别的开发者也会得到同样的的忽略规则,如果有时候忽略规则只是我们本地独有的,不想与别人共享,那我们可以通过下面的方式,配置一个全局的

git config --global core.excludesfile ~/.gitignore
复制代码

.git/info/exclude

.git/info/exclude也可以添加忽略规则,这种方式并不常用,与全局.gitignore文件一样,这种方式也是本地独有,并不会与其他开发者共享。

Git 忽略规则优先级

既然可以通过这么多种方式来指定.gitignore文件,那么不同的.gitignore就有不同的优先级,其优先级由高到低如下所示:

  • 从命令行中读取可用的忽略规则最高

  • 当前目录定义的规则

  • 父级目录定义的规则,依次递推,直到工作区根目录

  • .git/info/exclude文件中定义的规则

  • core.excludesfile中定义的全局规则

忽略文件的语法

#:#用于注释说明

*:通配符,表示任何个字符。

?:表示一个任何字符。

!:表示不忽略该文件或目录

//位置一行开始位置时,表示忽略这个目录下的文件,不忽略其他子目录的同名文件,如果/位置一行的最后位置,则表示只忽略目录,而同名文件不忽略。

[abc]:可选的字符范围

示例

# 这是一行注释
a* #忽略任何以a开头的文件和目录
!action # 不忽略action文件
/verdor #忽略根目录下的verdor文件
复制代码

忽略文件只对未跟踪文件有效

忽略文件只对未跟踪的文件有效果,如果某个文件已经被提交到版本库了,这时候再把文件添加了忽略文件中,也不会有效果了。

小结

其实,无论你是不是一名程序员,都可以把Git作为管理一个自己文档或代码的工具,通过使用Git,我们可以更高效地管理和组织自己的项目和文档,在不断地修改和变更中,也不害怕文档的丢失。

作者:张君鸿
链接:https://juejin.im/post/5ddbeed9e51d45230a3306cc
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

想要学好Git,应该掌握哪些基础知识?的更多相关文章

  1. 什么才是java的基础知识?

    近日里,很多人邀请我回答各种j2ee开发的初级问题,我无一都强调java初学者要先扎实自己的基础知识,那什么才是java的基础知识?又怎么样才算掌握了java的基础知识呢?这个问题还真值得仔细思考. ...

  2. 适合小白/外行的git与github最基础最浅显教程

    首先声明,这是适合小白/外行/初学者/学生看的最基础最简单的git与github教程,已经能使用svn,git等工具的朋友请不要看这篇文章来浪费时间了. 想进一步学习git的,推荐去廖雪峰博客学习. ...

  3. 想要学好C/C++,我到底要看多少书才能成为一个合格的C/C++工程师?

    如何学好C语言 这可能是很多朋友的问题,我以前也有这样的感觉,编程编到一定的时候,发现能力到了瓶颈,既不深,也不扎实,半吊子.比如:你长期地使用Java和.NET ,这些有虚拟机的语言对于开发便利是便 ...

  4. git常用情景和基础命令

    git常用情景和基础命令 将项目克隆到本地 --xxx是git的地址 git clone xxxx 或者初始化git(github提供滴) --新建一个readme.md文件 echo "# ...

  5. git bush的一些基础命令

    git bush的一些基础命令(不区分大小写) 通过命令创建本地仓库 首先自己需要手动建一个文件夹用于本地仓库 进行如下输入,使用cd跳转到刚刚创建的文件夹中 之后再输入 git init 即可创建 ...

  6. 想入门Web安全,这些基础知识都学会了吗?

    毕业季已经正式告一段落,这届毕业生都找到心仪的工作了吗? 正在实习期或者试用期的职场新人,是否在岗位上做的风生水起? 工作了一两年,从未升职加薪的菜鸟,还愿意继续原地踏步吗? 在校学生.IT从业者.毕 ...

  7. 任何国家都无法限制数字货币。为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用  c.分布式算法的实现 d.数据存储技术 e.拜占庭算法 f.权益证明POW,POS,DPOS 原因一: 点对点网络设计 其中点对点的P2P网络是bittorent ,由于是点对点的网络,没有中心化,因此在全球分布式的网

    任何国家都无法限制数字货币.为什么呢? 要想明白这个问题需要具备一点区块链的基础知识: 区块链使用的大致技术包括以下几种: a.点对点网络设计 b.加密技术应用  c.分布式算法的实现 d.数据存储技 ...

  8. (转)JAVA AJAX教程第二章-JAVASCRIPT基础知识

    开篇:JAVASCRIPT是AJAX技术中不可或缺的一部分,所以想学好AJAX以及现在流行的AJAX框架,学好JAVASCRIPT是最重要的.这章我给大家整理了一些JAVASCRIPT的基础知识.常用 ...

  9. 如何学习FPGA?FPGA学习必备的基础知识

    如何学习FPGA?FPGA学习必备的基础知识 时间:2013-08-12 来源:eepw 作者: 关键字:FPGA   基础知识       FPGA已成为现今的技术热点之一,无论学生还是工程师都希望 ...

随机推荐

  1. Qt编写的项目作品3-输入法V2018

    一.功能特点 未采用Qt系统层输入法框架,独创输入切换机制. 纯QWidget编写,支持任何目标平台(亲测windows.linux.嵌入式linux等),支持任意Qt版本(亲测Qt4.6.0到Qt5 ...

  2. Django 表关系的创建

    Django 表关系的创建 我们知道,表关系分为一对多,多对多,一对一 我们以一个图书管理系统为背景,设计了下述四张表,让我们来找一找它们之间的关系 Book与Publish表 找关系:一对多 左表( ...

  3. Mac Docker Desktop "Mounts denied: EOF."解决方法

    环境 系统: Mac OS Catalina Docker Desktop: 问题描述 在Mac环境下创建容器时用"-v"参数挂载目录出现"docker: Error r ...

  4. shell脚本监测进程并重启

    本人实例: #!/bin/bash ps -ef | grep elastic | grep -v grepif [ $? -ne 0 ]thenecho "start process... ...

  5. 数据结构与算法 C++ 视频教程(4 套)百度网盘

    为了大二有实力参加算法比赛,大一暑假我选择了留校,提前学习了一下数据结构和算法,这是我找的一些视频资源,分享给大家! 分别是 慕课网 玩转算法与数据结构.慕课网 玩转算法面试.慕课网 玩转数据结构 从 ...

  6. selenium规避网站监测

    规避网站监测 ​ 现在不少大网站有对selenium采取了监测机制.比如正常情况下我们用浏览器访问淘宝等网站的window.navigator.webdriver的值为undefined.而使用sel ...

  7. Tensor--tensorflow的数据类型

    在tensorflow2.0版本之前,1.x版本的tensorflow的基本数据类型有计算图(Computation Graph)和张量(Tensor)两种,但tensorflow2.0之后的版本取消 ...

  8. 如何通过 SSH/Telnet 用 root 权限登录群晖

    出于系统安全原因,对 Synology NAS 的 root 访问有限.如果您获取 root 权限,请在命令行界面中用任何属于Local Administrators群组的帐户证书登录 DSM(如Pu ...

  9. win10c盘被下满文件解决办法

    今天更新系统,发现一个巨坑,好不容易软件配置的环境,开始以为是病毒,重装后在弄发现还是这个问题.经过两天的亲测解决办法: win7 svchost.exe占用内存和CPU很高,电脑很卡的解决方法:ht ...

  10. LTC

    LTC 即 L2C,Leads To Cash,从线索到现金的企业运营管理思想,是以企业的营销和研发两大运营核心为主线,贯穿企业运营全部流程,深度融合了移动互联.SaaS技术.大数据与企业运营智慧,旨 ...