文章

Git

1.Git

  • 分布式:取中心化,没有中央处理服务器,每个人的电脑都是完整的一个版本库,每个电脑都是独立连接的;
  • 有能力高效管理类似Linux内核一样的超大规模项目(进度和速度)

2.Git与SVN

  1. 传统的SVN

SVN是集中式版本控制系统

版本库是集中放在中央服务器的,而开发人员工作的时候,用的都是自己电脑,所有首先要从中央服务器下载最新的版本,然后开发,开发完后,需要把自己开发的代码提交到中央服务器。

image-20230113231605160

  1. Git是分布式版本控制系统

Git是目前世界上最先进的分布式版本控制系统

所有版本信息仓库全部同步到本地的每个用户,这样就可以在本地查看所有版本历史,可以离线在本地提交,只需在联网时push到相应的服务器或其他用户那里。由于每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据,但这增加了本地存储空间的占用。

image-20230113232604918

3.Git下载和安装

下载连接:Git

image-20230113233522092

选择对应的电脑型号进行下载

查看git版本

git --version

image-20230113233659679

4.Git-工作流程

工作流程如下:

  1. 从远程仓库中克隆代码到本地仓库
  2. 从本地仓库中checkout代码然后进行代码修改
  3. 在提交前先将代码提交到暂存区
  4. 提交到本地仓库,本地仓库中保存修改的各个历史版本
  5. 修改完成后,需要和团队成员共享代码时,将代码push到远程仓库

image-20230113234020397

5.Git-命令(Mac为例)

仓库的主要作用就是:

  • 记录版本的信息以及记录远程仓库的地址信息

获取git仓库通常有两种方式:

  • 本地仓库
  • 远程仓库克隆

本地仓库创建

  1. 首先在创建一个文件夹

image-20230114002049166

  1. 在终端对应的路径下输入git init

image-20230114002710170

image-20230114002458552

mac访达查看隐藏文件夹快捷键Command + Shift + .

  1. 点击查看.git文件

image-20230114005127449

目录 描述
config 该文件主要记录针对该项目的一些配置信息,例如是否一bare方式初始化、remote的信息等,通过git remote add命令增加的远程分支的信息就保存在这里
objects Git中的文件和一些操作都会以git对象来保存,git对象分为BLOB、tree和commit三种类型,例如git commit便是git中的commit对象,而各个版本之间是通过版本树来组织的,比如当前的HEAD会指向某个commit对象,而该commit对象又会指向几个BLOB对象或者tree对象
HEAD 改文件指明了git branch(当前分支)的结果,比如当前分支是master,则该文件就会指向master,但是并不是存储一个master字符串,而是分支在refs中的白哦是,例如:ref:refs/heads/master
idnex 该文件保存了暂存区域的信息。该文件某种程度就是缓冲区(staging area),内容包括它指向的文件的时间戳、文件名、shal值等
Refs 该文件夹指向数据(分支)的提交对象的指针

远程仓库克隆

可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地

git clone 远程git仓库地址

Git-配置环境-配置开发者

设置用户信息(全局配置好了后续就不需要再配置,而局部每次都要配置)

#全局配置
git config --global user.name "名字"
git config --global user.email "邮箱"

#局部配置
git config user.name "名字"
git config user.email "邮箱"

只有局部配置,name和email才会在.git中config体现

image-20230114011138584

然后添加到缓存区:

git add .

然后版本区:

git commit -m "init"

查看配置信息:

git config --list
git config user.name
git config user.email

总结:

  • 全局配置对未来所有的git管理的项目都是用这个签名作为作者的名字和邮箱
  • 局部配置的优先级高于全局配置
  • 配置只会在本地仓库生效,远程仓库会自动使用远程的昵称

git add/commit 添加/提交命令

image-20230114012039274

在对应的目录下创建txt文本,这里创建了2个txt

image-20230114012535717

现在对修改a,删除b,新增d,使用git status进行查看当前状态

image-20230114013057555

然后将修改的部分放入缓存区git add .(红色为修改部分工作区,绿色为缓存区部分)

image-20230114013222356

形成版本git commit -m "修改a,删除b,新增d",形成版本

image-20230114013404898

查看日志

git log

image-20230114013907001

日志缩小版

git log --pretty=oneline

image-20230114014053390

再缩小版

git log --oneline

image-20230114014155630

Git checkout/reset 撤销修改

文件存在工作区

修改d文件的内容

image-20230114015718024

image-20230114015753385

image-20230114015806337

文件存在缓存区

先回退版本

#HEAD^从上到下第一个^有几个就是几个,等价于HEAD~1
git reset HEAD^
git reset HEAD~1

git reset --hard "指定版本号"

image-20230114022328464

总结:

  1. 撤销工作区修改,使用git checkout --<file>
  2. 撤销暂存区修改,分两步
    1. 使用git reset HEAD<file>来撤销暂存区修改
    2. 使用git checkout --<file>来撤销工作区修改

6.Git-.gitignore文件忽略

概述

一般我们总会有些文件无法纳入git的管理,也不希望它们总出现在未跟踪文件列表,通常都是自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。在这种情况下,我们可以在工作目录中创建一个名为.gitignore的文件(文件名固定不能更改),列出要忽略的文件模式,下面是一个实例。

bin/:忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略bin文件,但是git中不会存在空的文件夹,所有等价于/bin
/bin:忽略根目录下的bin文件
/*.c:忽略cat.c,不葫芦build/cat.c
debug/*.obj:忽略debug/io.obj,不忽略debug/common/io.obj和tools/debug/io.obj
**/foo:忽略/foo,a/foo,a/b/foo等
a/**/b:忽略/foo,a/x/b,a/x/y/b等
!/bin/run.sh:不忽略bin目录下的run.sh文件
*/log:忽略所有的.log文件
config.go:忽略当前路径的config.go文件

.gitignore规则不生效

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

解决方法就是先把本地缓存删除(改变成为track状态),然后再提交:

git rm -r --cached .
git add .
git commit -m "updata .gitignore"

7.Git-添加远程仓库 git remote

(这里不再叙述如何创建gitee)(GitHub使用方式和gitee一致)

image-20230114124352501

填好仓库名称,点击创建

image-20230114124458773

得到这样的一个页面,回到之前在本地创建的文件,现在将之前的文件进行跟gitee仓库进行关联

git remote add origin 仓库地址

image-20230114124857895

打开.git文件中config查看

image-20230114124928601

然后进行下一步

git push origin master

我在这里按照git push origin master之后报错src refspec master does not match any,解决办法为现在终端创建一个远程master分支git checkout -b master,然后再进行推送git push origin master

git checkout -b master
git push origin master
git branch

image-20230114125743325

image-20230114130105306

你也可以进行删除关联地址更换其他的

git remote rm origin 远程仓库地址
git remote add origin 新的仓库地址

克隆

在本地新建一个文件夹,然后终端进入该文件夹

image-20230114130534105

在gitClone中的d.txt文件进行了新增

image-20230114130904614

返回到gitee,就能查看到

image-20230114131059092

现在需要在gitproject中同步gitClone更新的东西

image-20230114131300989

然后在gitproject目录下进行终端操作git pull origin master

image-20230114131413339

就类似于文件的 上传–中转–下载

8.Git-分支Branch

  • 查看分支
  • 创建分支
  • 切换分支
  • 推送至远程仓库分支
  • 合并分支
  • 删除分支

查看分支

列出所有本地分支

git branch

列出所有远程分支

git branch -r

列出所有本地分支和远程分支

git branch -a

image-20230114153807097

创建分支

创建一个分支

git branch 分支名

切换分支

git checkout 分支名

创建分支并且切换分支

git checkout -b 分支名

image-20230114154143877

推送至远程仓库分支

git push origin 分支名

合并分支

现在是master为主分支,v2.0位其他分支,现在要把v2.0合并到master,就

先切换到master分支下,然后写入以下指令

git merge v2.0

image-20230114160923868

然后在master分支上,重新进行add/commit操作,最后在push

删除分支

先创建一个分支git branch v3.0,然后push到仓库git push origin v3.0,

目前仓库存在v3.0分支

image-20230114162007221

先删掉本地仓库中的分支git branch -d v3.0,然后再删掉远程仓库中的分支

git push origin --delete v3.0

image-20230114162336338

9.Git分支的应用场景

工作场景如下:

开发某个网站

为实现某个新的需求,创建一个分支

在这个分支上开展工作

正如果在这个时候,突然有紧急事情需要修复,可以按照如下方法来处理:

切换到你的线上分支(production branch)

为这个紧急任务新建一个分支,并在其中修复它

在测试通过之后,切换回线上分支,然后合并这个修复分支,最后将改动推送到线上分支。

切换回你最初工作的分支上,继续工作。

image-20230114170258497

10.Git-标签tag

标签指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态。

  • 列出已有的标签
  • 创建标签
  • 将标签推送至远程仓库
  • 检出标签
  • 删除标签

列出已有的标签

#列出所有tag
git tag
#查看tag信息
git show [tag]

创建新标签命令

git tag [tagName]

将标签推送至远程仓库

git push origin tagName

删除本地tag

git tag -d tagName

删除远程tag

git push origin :refs/tags/[tagName]

image-20230114171410022

License:  CC BY 4.0 test