Git简介及基础操作

一、简介

Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理,在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,以及备份供后续恢复以前的版本。其主要涉及到四个关键点:

  • 工作区(workspace): 本地电脑存放项目文件的路径
  • 暂存区(staging area): 在使用git管理项目文件的时候,其本地的项目文件会多出一个.git的文件夹,该文件夹被称之为版本库。该文件夹中包含了两个部分,一个是暂存区(stage或者index),顾名思义就是暂时存放文件的地方,通常使用add命令将工作区的文件添加到暂存区里
  • 本地仓库(local repository): .git文件夹里还包括git自动创建的master分支,并且将HEAD指针指向master分支。使用commit命令可以将暂存区中的文件添加到本地仓库中
  • 远程仓库(remote repository): 不是在本地仓库中,项目代码在远程git服务器上,比如项目放在github上,就是一个远程仓库,通常使用clone命令将远程仓库拷贝到本地仓库中,开发后推送到远程仓库中即可

在这里插入图片描述

二、安装

至于Git的安装教程详细可见Mac安装GitWindows安装Git文章


一般Git的配置会有三级,首先会在当前项目的路径下找,未找到则在当前用户配置下查找,最后在Git的安装目录下进查找,如下:

  • .git/config
  • 当前用户目录/.gitconfig
  • git安装目录/etc/gitconfig

三、Git Flow

使用Git之前我们需要来了解一下Git Flow,其可以用来规范团队git操作,让整个项目有一个清晰的流程和规范。
在这里插入图片描述

  • Master分支
    所有在Master分支上的commit都应该打上Tag,一般情况下Master不存在commit,Devlop分支基于Master分支创建,这个分支只能从其他分支合并,不能在这个分支直接修改

  • Develop分支
    这个分支是我们是我们的主开发分支,包含所有要发布到下一个Release的代码,这个主要合并与其他分支,比如Feature、Release分支

  • Feature分支
    这个分支主要是用来开发一个新的功能,一旦开发完成,我们合并回Develop分支进入下一个Release,合并完分支后一般会删点这个Feature分支

  • Release分支
    Release分支基于Develop分支创建,创建完Release分支之后,我们可以在这个Release分支上测试,修改Bug等。测试通过后Release将合并到Master和Develop分支,同时在Master分支上打个Tag记住Release版本号,然后可以删除Release分支了。

  • Hotfix分支
    当我们在Production环境中发现新的Bug时候,我们需要创建一个Hotfix分支, 完成Bug Fix后,我们合并回Master和Develop分支,所以Hotfix的改动会进入下一个Release分支中。


四、Git操作

4.1、创建版本库(git init, git clone <url>)

首先我们在本地新建一个项目,然后我们就可以执行git init命令,来让git开始管理这个文件夹,在同级目录下会出现一个隐藏的.git文件。
在这里插入图片描述
隐藏的.git目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。


另外我们还可以从远程git仓库使用git clone <url>命令复制一个项目,例如:如:git clone git://github.com/rocky/example.git。如果在克隆项目时想要定义新的项目名,可以在clone命令后指定新的项目名:git clone git://github.com//example.git newname;


4.2、检查文件状态(git status)

在提交相关代码时,我们可以先使用 git status 来查看下当前的状态,下面就会提示我们当前一些文件状态,如下:
在这里插入图片描述
这里我们创建一个test.txt文件,再次执行git status进行查看文件状态,如下:
在这里插入图片描述
注意: 在Windows环境下,不要使用自带的记事本编辑文本文件,原因是Microsoft开发记事本的团队使用了一个默认行为来保存UTF-8编码的文件,他们在每个文件开头添加了0xefbbbf(十六进制)的字符,这样会使你遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误等等。


这里提示文件尚未被跟踪,并提示我们可以使用git add <file>...命令进行提交内容,即将其文件添加到暂存区中,这里我们根据提示操作,然后再执行git status进行查看,如下:
在这里插入图片描述
这里从上图中,我们发现文件状态从未跟踪文件变为了要提交文件,说明该文件已经被git所跟踪了,git中文件状态主要分为如下几种状态:

  • 未跟踪的(untracked): 没有加入版本库
  • 被追踪的(tracked): 已经加入版本库
  • 忽略的(ignored): 忽略那些不需要管理的文件夹或文件

4.3、删除暂存(git rm --cached <file>…)

在上述介绍的截图中,还提示我们可以使用git rm --cached <file>...来取消暂存,该命令会删除暂存区的文件,但是会保留本地文件,且本地文件改为未跟踪状态,如下:
在这里插入图片描述
如果在使用git add <file>...命令提交至暂存区后,然后工作区又进行了变动,那么在使用git rm --cached <file>...会被提示文件不同,这里我们需要添加-f参数来强制删除,最后保留下的未跟踪文件是本地文件,即提交暂存后又修改后的那分文件。
在这里插入图片描述
另外如果我们在add后,又将文件进行了commit操作,那么我们再使用git rm --cached <file>...命令操作时,就是删除了暂存区文件,会导致暂存区和本地版本库的不同,需要再执行commit操作,这样才会将本地版本库中的文件也删除,所以这里一般不建议使用git rm <file>...,而是要加上--cached参数,这样会在工作区保留一份数据。
在这里插入图片描述
还有上述中提到的git rm <file>...,该命令也会删除暂存区的文件,但是缺少了--cached参数,就不会保留本地文件,所以一般来说建议使用git rm --cached <file>...命令,如果真确定了该本地文件不要了,手动删除即可。
在这里插入图片描述


4.4、提交本地版本库(git add <file>…, git commit -m “xxx”)

上述介绍中,其实我们已经使用过这两条命令了,首先通过add可以将文件或目录添加到了stage/index暂存区,然后使用commit可以实现将暂存区的文件提交到本地仓库。提交本地仓库可以两个步骤,也可以一个步骤,如下:

  • 两步操作
    git add <file>... ,该命令其实是将文件提交到本地的暂存区,这里参数可以是文件路径,也可以是 . ,或者 -A ,那么这两个参数有什么区别呢?

    • . 代表所有新增、修改文件,不包括删除文件
    • -A 代表新增、修改、删除文件

    在执行完git add后,我们还需要执行 git commit 命令,来将暂存区的文件提交到本地仓库,一般我们会加下-m来添加相关版本描述
    在这里插入图片描述

  • 一步操作
    如果觉得上述的命令太过于麻烦,我们还可以执行命令 git commit -am '版本描述' ,直接将文件提交到本地仓库。
    在这里插入图片描述c
    不过需要注意的是,git commit -am "xxx"命令只能提交已经跟踪过且修改了的文件,无法一步操作提交新文件。


4.5、丢弃修改(git restore <file>…, git restore --staged <file>…)

如果我们在修改了文件内容后,又不想修改了,那么该怎么办呢?再把它删除即可,如果修改的地方比较零散,这里还可以使用git restore <file>...命令,如下:
在这里插入图片描述
不过这里文件首先要是被git跟踪的文件,并且撤销的修改仅仅是针对于工作区的,一旦文件提交至暂存区是无法撤销的,如下:
在这里插入图片描述
从上述测试步骤可以清楚地看出,在提交到暂存区后就无法使用git restore <file>...命令进行撤销了,只能撤销后续未提交至暂存区的修改,那么如果就想撤销暂存区的修改呢,这里可以添加--staged参数来处理
在这里插入图片描述
从上述可以发现,git restore --staged <file>...命令是将暂存区的修改重新放回工作区,然后我们后续再想丢弃工作区的修改,那么执行上述的git restore <file>...即可。


另外除了git restore <file>..命令可以丢弃工作区的修改,还可以使用git checkout -- <file>...命令。


4.6、版本回退(git reset [ --soft --mixed --hard] xxx)

上述介绍了如何丢弃工作区及暂存区的修改,那么如果已经commit到本地版本库中,那么又该如何处理呢,这里我们就可以使用git reset [--soft --mixed --hard] xxx来回退版本,该命令一共有三个参数,如下:

  • git reset --soft xxx:回退到某个版本, 只回退了commit的信息,不会改变暂存区和工作区的状态。如果还要提交,直接commit即可
    在这里插入图片描述
    从上图可以看出,--soft参数仅仅是只修改了本地版本库中的信息,暂存区以及工作区是保持不变的

  • git reset --mixed xxx:此为默认方式,不带任何参数的git reset默认为该参数,它回退到某个版本,会回退了commit及index信息,不会改变工作区的状态。如果还要提交,需要add+commit即可
    在这里插入图片描述

  • git reset --hard xxx:彻底回退到某个版本,本地的源码也会变为上一个版本的内容,会回退了本地版本库、暂存区及工作区。
    在这里插入图片描述

4.7、查看日志(git log, git reflog)

在上述我们进行版本回退时,会执行git log进行查看commit id进行回退,使用该命令可以看到的一大串类似 8450b8… 的是commit id(版本号),如下:
在这里插入图片描述

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--oneline--pretty=oneline参数
在这里插入图片描述
另外我们还可以使用git log --oneline --graph参数来查看日志,这样不仅会简化成一行,同时还会显示分支。


不过git log无法查看到我们进行回退的版本号,比如上述我们进行的回退版本号就无法查看,如果我们回退后又想撤销回退,那么我们首先需要知道之前的版本号,这里我们就需要使用git reflog,该命令会来记录你的每一次命令
在这里插入图片描述


五、忽略文件 .gitignore

一般我们总会有些文件无需纳入Git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。这时我们可以创建一个名为.gitignore的文件,列出要忽略的文件模式。
在这里插入图片描述
然后我们就可以在.gitignore文件中配置需要忽略和排除的文件规则即可,配置规则如下:

# 以'#'开始的行,被视为注释.

# 配置语法:
# 以斜杠“/”开头表示目录
# 以星号“*”通配多个字符
# 以问号“?”通配单个字符
# 以方括号“[]”包含单个字符的匹配列表
# 以叹号“!”表示不忽略(跟踪)匹配到的文件或目录

# 例如:
# 忽略掉所有文件名是foo.txt的文件.
foo.txt
# 忽略指定路径下的foo.js文件
/js/foo.js
# 忽略整个target文件夹
/target/
# 忽略所有生成的 html文件,
*.html
# 跟踪foo.html文件(指定不忽略).
!foo.html
# 忽略所有.o和 .a文件.
*.[oa]

注意: git对于.gitignore配置文件是按行从上到下进行规则匹配的,意味着如果前面的规则匹配的范围更大,则后面的规则将不会生效。

重要: 如果不慎在创建.gitignore文件之前就push了项目,那么即使你在.gitignore文件中写入新的过滤规则,这些规则也不会起作用,Git仍然会对所有文件进行版本管理。简单来说出现这种问题的原因就是Git已经开始管理这些文件了,所以你无法再通过过滤规则过滤它们。所以一定要在项目开始就创建.gitignore文件的习惯,否则一旦push,处理起来会比较麻烦。

如果文件被忽略了,但是有确实想添加该文件,可以用git add -f <file>...强制添加到版本库,不过一般我们不会这么做,我们可以找到该文件被哪条规则命中了,然后再进行修改,可以用git check-ignore -v <file>...命令检查。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值