当前位置: 首页 > news >正文

Git 原理与使用

目录

一. 什么是 Git

二. Git 的安装与配置

三. Git 的原理

1. git 仓库及配置

2. 认识工作区,暂存区,版本库

四. Git 的使用

1. 基本操作

(1)添加文件

(2)版本回退

(3)撤销修改

(4)删除文件

2. 分支管理

(1)创建分支

(2)切换分支

(3)合并分支

(4)删除分支

(5)合并冲突

(6)分支管理策略

(7)bug分支

(8)删除临时分支

3. 远程操作

(1)远程仓库

(2)克隆仓库

(3)远端仓库推送

(4)拉取仓库

(5)配置 Git

(6)给命令配置别名

4. 标签管理

(1)创建标签

(2)操作标签

5. 多人协作

五. 企业级开发模型

总结:


一. 什么是 Git

在我们日常开发中,我们可能面临许多人共同开发程序导致文件版本混乱,多人修改导致文件冲突,误删文件导致无法恢复。而 Git 的出现解决了这些问题,有了 Git 管理文件。我们可以轻松回退版本,也可进行多人同时开发并且降低代码冲突,更好的对大型项目进行梳理划清脉络等等。

二. Git 的安装与配置

在 Linux 下安装 git 就是一行代码的事

centos:

sudo yum -y install git

ubuntu:

sudo apt-get install got -y

三. Git 的原理

1. git 仓库及配置

我们首先需要创建一个 git 本地仓库,使用 git init 命令

我们用 ll -a 指令可以查看当前目录下存在一个 .git 的隐藏文件,这个文件我们不要随便去破坏,容易影响我们正常使用

我们可以用 tree .git/ 命令查看 git 仓库的一些细节

完成了仓库创建后,我们需要对git仓库进行配置,下面这两条命令进行 user 名字和邮箱进行配置,此处 global 的用处是将该用户名和邮箱设置为全局。意味着往后创建的git仓库默认都是该名字和邮箱,若你多个git 仓库并且希望不同用户名和邮箱,那么就不需要加 global

配置完成后,我们可以通过 git config -l 命令来查看当前仓库

若我们希望删除这些配置,可以用 git config [--global] --unset user.name  或者  user.email  命令删除配置。


2. 认识工作区,暂存区,版本库

通常我们编写修改删除代码都在我们的工作区当中;我们将改好的文件可以放入到暂存区当中,暂存区存放准备提交到版本库中的文件;当我们确认文件无误后,可以将文件从暂存区传到版本库当中,此时就形成了一个新的版本,我们也可以在版本库当中追溯到先前的任意一个版本

我们创建版本库时, Git 会为我们创建一个 Master 主分支,用一个 HEAD 指针指向这个主分支。当我们对工作区修改文件进行 git add 操作时,暂存区目录树索引更新,当我们 git commit 时,master 分支会进行更新,将暂存区的目录树写入 master 主分支中。

四. Git 的使用

1. 基本操作

(1)添加文件

首先我们在 .git 目录下创建一个 README 文件,接着使用 git add 文件名 的方式,将文件添加进入暂存区,接着我们用 git commit -m “备注”  ,将该文件进行一个解释备注后存入到 master 分支当中。

到目前为止,我们已经完成了将自己写的代码上传到了仓库当中。我们可以使用 git log --pretty=oneline  的命令查看历史提交记录。

此时我们查看到了历史记录,其中这一串数字就是我们 commit 时产生的 id 版本号,若我们后序版本不断地迭代,但今天我们突然需要这一版的代码,我们可以拿着这串版本号回退找到之前的代码。


Git 对于文件是对于文件的修改进行管理而不是对文件进行管理。现在我们对 README 文件进行修改往里面添加内容。紧接着我们通过 git status 来查看

上面的意思是,我们完成了修改但是还没有进行 add 和 commit 操作进行同步。我们只需要再进行 add 和 commit 操作就可以同步了。

若我们想得知与先前版本哪些地方被修改了,我们可以用 git diff 文件  的方式查看。它会区分暂存区和工作区之间的差异,之后我们再进行对版本库提交就更加安全了。


(2)版本回退

Git 能够管理文件的历史版本,当有一天你发现之前工作出现了很大的问题,需要从某个特定的版本开始,这个时候就可以使用版本回退功能

我们用 git reset 命令可以进行版本回退,回退的本质是将版本库中的内容进行回退,工作区和暂存区的内容是否回退由命令参数决定:

git reset【--soft |  --mixed  |  --hard】【HEAD】

--mixed  为默认选项,使用时可以不带参数。该参数将暂存区的内容退回为指定提交版本内容,工作区文件保持不变。

--soft  对于工作区和暂存区的内容不变,将版本库回退到某个指定版本

--hard  暂存区和工作区退回到指定版本。若工作区当中有未提交的代码不要使用这个命令,容易造成代码丢失。

HEAD  版本:

可以直接写成 commit id 表示指定退回的版本

HEAD 表示当前版本,HEAD^ 表示上一个版本,HEAD^^  表示回退两个版本

HEAD~0 表示当前版本,HEAD~1 表示上一个版本,HEAD~2 表示上两个版本


下面我们对 README 进行三次版本修改

若我们当前想从版本 3 回退到版本1中,该如何操作呢?

我们用 git reset --hard  版本号  的方式回退到了版本 1 中

若我们不清楚该文件的版本号,或者版本号找不到了,我们可以通过 git reflog 的方式来查找先前的本地命令。

其中 00f4980 ,就是 commit id 的一部分,我们也可以通过该 id 来找回我们的目标版本


Git 的版本回退速度非常快,在 Git 内部存在一个 master 分支中的 HEAD 指针,refs/heads/master  文件里保存当前 master 分支的最新 commit id。当我们在回退版本的时候,Git 仅仅是给 refs/heads/master 中存储一个特定的 version

各个版本就像一串珠子一样,我们通过 HEAD 指针指向来指向不同的 version 版本


(3)撤销修改

当我们在工作区当中想撤回到我们上一个版本的代码,该如何操作呢?

1. 首先对于工作区的代码还没有进行 add 操作

我们可以用 git checkout -- 文件  的方式回退到最进一次 add 或 commit 时的状态。切记 -- 后面需要添加空格!!!!


2. 对于已经 add 但没有 commit 的,我们可以用 git reset --mixed  HEAD README  进行拉回

3. 对于已经 add 并且也 commit 了的代码,我们可以用 git reset --hard HEAD^  的方式回退到上一个版本,不过这个代码还不能推送到远程端,若推送到远程端那就麻烦了。


(4)删除文件

当我们删除文件时,除了在自己的工作区当中删除,还需要在版本库中进行删除。

我们删除文件时,无非是两种情况,第一种情况是我们删错了,第二种情况是我们确实需要删除文件。我们来分别讨论

当我们发现删除错文件后,我们可以用 git checkout -- 文件  的方式,回退到最近一次add操作的文件。

对于第二种情况,我们首先用 git rm 文件  将文件从暂存区和工作区当中删除,接着用 git commit  -m  “备注”  的方式对版本库进行同步

这样文件就从版本库当中删除了


2. 分支管理

一个 git 仓库中至少存在一个分支也就是 主分支 master ,它就像一条时间线,随着我们不断的提交代码,时间线慢慢的往前推移,而 HEAD 指针指向master 分支,我们可以操控 HEAD 指针回退到先前的时间结点,也就是穿越回之前的时空。而分支呢就相当于又开辟了另一个时空,它与主分支不相干,但当在一定的结点时,可以进行主分支和分支之间进行合并,也就是两个时空在某一时刻同步了。此时,主分支同时拥有了两个分支的内容。

(1)创建分支

首先我们使用 git branch 查看当前本地所有分支,接着我们用 git branch 分支名  创建新的分支。

当前我们已经完成了 dev 分支的创建,此时的 dev 分支和 master 分支指向同一个结点

(2)切换分支

我们使用 git checkout 分支名 来进行切换分支,再用git branch 来查看分支切换

其中分支名后面的 * 表示当前所在分支。

当我们在 dev 分支修改了内容,并且进行 add 和 commit 操作,回到 master 主分支的时候确看不见修改的内容

为什么会出现这样的现象呢?

原因是 master 指向了前面的结点,而 dev 指向的是后面的结点,它们并没有同步在一块。

(3)合并分支

为了能在 master 分支上看见 dev 修改的东西,我们需要在 master 上进行分支合并

首先切换到 master 分支上,接着我们输入指令 git merge 分支名  就可以完成分支合并

(4)删除分支

当我们完成合并分支后,dev 分支对于我们来说没有用处了,那么我们就可以删除该分支,删除某个分支时不能在要删除的分支下删除,需要切换到其他分支。我们用 git branch -d  分支名  的方式就可以完成分支删除

我们通常将任务编写用多个分支来进行,最后在合并到主分支中

(5)合并冲突

我们首先在 master 分支上的 TEST 文件修改内容进行提交,此时转换到 dev 分支上修改内容并且提交,此时再回到 master 分支上修改内容进行提交,完成后,我们在对分支进行合并,此时就会发生合并冲突,编译器会显示告诉我们有些不同的地方,此时需要我们手动进行修改,然后再提交,此时就解决了冲突。

我们先在 master 上修改文件

再切换到 dev 上修改文件,进行提交

完成修改后,切换会 master 主分支上,再次修改文件内容,然后我们将 dev 分支进行合并,此时就会出现合并冲突

我们 cat 一下文件,此时 <<<<<<<< 到 ======== 直接就是存在冲突的部分,我么需要手动进行修改后再次提交就完成了冲突解决

我们画图来解释这个过程

两边都进行了修改,导致两个分支不同步

解决代码不重合的问题后,再次提交,此时两个分支就完成了合并,冲突解决


(6)分支管理策略

我们先前进行的分支合并都是 Fast forward 模式下的,这样合并之后会将两个分支的最新结点合并成一个结点,也就是说在 dev 分支上不会备份一份出来,这就很容易导致版本丢失。我们通常不建议使用 Fast forward 模式进行合并,我们推荐使用 git merge --no-ff -m “备注”  分支名  的形式进行分支合并。--no-ff  表示禁用快速模式,并且创建一个新的 commit ,我们用图来解释。


(7)bug分支

当我们在分支上进行代码书写的时候,此时发现主分支上有一个地方出现了 bug ,我们可以重新创建一个新的分支,然后在新的分支上修改主分支上的代码,完成工作后,再与主分支进行合并。此时我们当前分支正在进行代码开发,我们需要将当前分支储藏起来

我们使用 git stash 命令储藏工作区信息,将来我们可以在某个时间点重新拿回信息。

接着我们切换回 master 主分支上,创建一个新的分支 dev2 ,进行临时修复 bug ,完成修复后,返回到 master 主分支进行合并,删除 dev2 分支即可。

此时我们回到先前分支的工作区,使用 git stash list 命令查看先前储藏的内容。再使用 git stash pop 命令进行现场恢复

此时,在 master 分支上已经完成了 bug 的修复,但是在当前的分支上还是使用的原先的代码,如果我们此时在主分支上再进行合并,容易导致出错,我们应该在当前分支,拉取主分支内容进行合并。在完成当前分支代码后,再切换回主分支进行分支合并。

(8)删除临时分支

若我们的分支在进行开发的过程中,产品经理突然说不需要当前功能了,那么我们需要对该分支进行删除,但是该分支不能合并到 master 分支上,所以不能用 git branch -d 分支  的方式删除。我们首先切换回主分支,用 git branch -D 分支名  的方式表示强制删除该分支

3. 远程操作

我们先前的所有操作都是在我们本地计算机中进行的,而 Git 是分布式版本控制系统。分布式管理系统中存在着一个“中央服务器”,若其中任意一个人损失了文件都可以通过“中央服务器”来找回内容。

(1)远程仓库

远程仓库是多人团队开发的基础设施,用于进行代码管理,版本追溯等。下面我们用 Gitee 来创建远程仓库。

首先找到下载 Gitee ,进行注册,找到新建仓库按钮

点击新建仓库按钮,输入你的仓库名称

完成仓库创建后,点击初始化文档

点击管理,可以对仓库进行设置

点开代码,上面有一个分支按钮,上面默认只有一个 master 分支


(2)克隆仓库

我们将远端仓库进行克隆下载,然后到我们的本地仓库进行 git clone

此时存在着两种协议,一种是 SSH 协议,SSH 协议使用了公钥加密和公钥登陆机制,安全性较高。另一种是 HTTPS 方式,没有要求可以直接克隆下来。这里我们直接使用 HTTPS 的形式,将网址复制下来后,git clone 克隆     

(3)远端仓库推送

首先,我们要确保之前设置的全局 nameemail Gitee 上配置的一致。我们先创建文件,add 和 commit 后,再使用 git push 命令,此时就将本地仓库内容推送到远程仓库里了。

git push 会默认传递当前分支与远程仓库存在追踪关系的分支;如果没有设置追逐关系,那么就会传递给同名的分支

如果说,我们要将本地分支上传到远程分支,我们可以用 git push 远程主机名 本地分支名:远程分支名   的方式传递。


(4)拉取仓库

若我们在远程仓库当中修改了文件,但是在本地没有修改文件,此时我们需要进行远程和本地同步操作。

使用指令 git pull  命令拉取远程仓库到本地仓库中


(5)配置 Git

在我们进行仓库创建的时候,存在着一个 .gitignore 文件,该文件用于屏蔽某些特定的文件,让他们不参与版本控制,可以保证我们的仓库不冗余,仓库更加简洁

如果我们想上传被 .gitignore 文件屏蔽的类型,可以使用 git add -f 文件  进行强制上传

(6)给命令配置别名

有些时候,git 命令特别的长,我们可以对命令进行别名方便我们的操作。例如现在我们想将 git  status  简化为  git  st

其中添加了 global  意味着所有的仓库对于该别名都生效。

4. 标签管理

标签 tag ,简单理解就是给 commit  一个标识,相当于起一个别名。例如真对某个版本我们可以起一个  v1.0  的标签,标签的用处就是用来替代  commit  id   的,相较于  id   ,标件可读性更强更高。

(1)创建标签

首先我们需要切换到打标签的分支上,使用命令  git  tag  标签名   的方式打一个新标签。我们使用  git  tag  可以查看所有标签。在默认情况下,我们打的标签会打在最新  commit  上的文件当中。若我们希望对指定文件打标签,我们可以  git  tag  标签   文件id   的方式对特定文件进行标签。

使用 git show  标签名  的方式可以查看标签文件信息


(2)操作标签

如果我们希望删除标签  可以使用  git  tag  -d   标签名   的方式删除

标签默认是存在本地的,若希望上传到远程仓库中,需要将标签进行 push 操作

上传到远程仓库中的标签若希望删除标签,那么需要先在本地删除,然后再进行 push  操作进行远程同步即可


5. 多人协作

我们依据远程仓库为主服务器,像每个开发成员分配相同的一份代码,用户通过 clone  来将远端服务器拷贝到每个用户当中。完成多人开发

我们点开远程仓库的管理,找到仓库管理员开发者

我们可以进行用户邀请,这里有三种邀请方式

接着我们在远端创建分支,在通常情况,我们是不能在 master 主分支上进行开发的,因为容易导致主分支的混乱,通常都是在分支上进行开发,开发完成后再进行合并。

我们在远端创建完成分支,在本地仓库进行 pull 拉取就能同步远端仓库了


通常情况下,我们开发一个程序时,每个人会负责一个分支,我们会在分支上进行开发,开发完成后再合并到主分支当中。当有一天,我们的同事生病没有来上班,那么我们只需要切换到我们同事所开发的分支上,进行开发,后续只需要在同事电脑进行本地拉取,就能完成同步操作。

五. 企业级开发模型

在一个大型企业项目开发部署往往是进行精细划分的

软件开发工程师负责代码规划写代码等工作,测试工程师测试代码,运维工程师需要部署维护代码发布上线等。那么就需要各个板块进行合作协商,那么 git 的重要性就体现出来了。


对于开发人员来说,我们需要了解几个常用的开发环境

开发环境是专门用于日常开发的服务器,一般会打开所有的错误报告和测试工具,是最基础的环境;测试环境是开发环境到生产环境的过度环境,我们需要对其进行测试;在测试环境后,我们要进行预发布环境部署,这是为了避免线上和线下的差异;最后就是生产环境进行部署。


有了环境概念后,对于开发人员来说,一般会针对不同的环境来设计分支

master 分支

master 分支为只读且唯一分支,我们会将 release 分支实现代码后进行合并到 master 分支中。master 分支不可删除,我们可以对 master 的一些重要结点进行标签记录

release 分支

release 分支是预发布分支,基于本次线上所有的 feature 分支合并到 develop 分支之后,基于 develop 分支创建。该分支主要提供给测试人员,用于进行测试。

develop 分支

基于 master 分支创建的只读且唯一分支,始终保持最新完成以及 bug 修复后的代码,通常都是由 feature 分支对其进行合并

feature 分支

开发人员用于对新特性新功能进行开发

hotfix 分支

用于修复分支或进行分支补丁,主要用于线上版本进行 bug 修复。


总结:

Git 作为主流的分布式版本控制系统,能高效追踪代码全量历史变更,支持多人并行开发。本地仓库完整可离线操作,结合远程仓库实现协作同步,分支管理灵活,可快速回溯版本,是团队开发与个人项目管理的必备工具,深刻改变了代码管理模式。


文章转载自:

http://BwtfpWRT.nxzsd.cn
http://KdxrKFOm.nxzsd.cn
http://tK9uc8uv.nxzsd.cn
http://EdGdczN6.nxzsd.cn
http://arxcljfL.nxzsd.cn
http://sK1NYwp4.nxzsd.cn
http://prvzOyQf.nxzsd.cn
http://Aa7JeZvo.nxzsd.cn
http://l6MfPPx3.nxzsd.cn
http://UqUGGRsQ.nxzsd.cn
http://PFyuINPv.nxzsd.cn
http://o3OpyihU.nxzsd.cn
http://NaO5bdcG.nxzsd.cn
http://eCqZdc9q.nxzsd.cn
http://dE4tDrTK.nxzsd.cn
http://z3oZvKsv.nxzsd.cn
http://QTj6qXlw.nxzsd.cn
http://L1Wuc3ZS.nxzsd.cn
http://o59w4V8c.nxzsd.cn
http://5UwG4r1W.nxzsd.cn
http://TyrRvzIz.nxzsd.cn
http://klk8jGP7.nxzsd.cn
http://YV6WoQ5G.nxzsd.cn
http://Jl6cfewM.nxzsd.cn
http://gQL1NuUU.nxzsd.cn
http://bHeJe5q4.nxzsd.cn
http://2ue7FThY.nxzsd.cn
http://Aaqz947k.nxzsd.cn
http://VDuIvvrI.nxzsd.cn
http://Ze4lGTs7.nxzsd.cn
http://www.dtcms.com/a/386669.html

相关文章:

  • 什么是向量数据库
  • 利用postgres_proto和pgproto测试postgres协议访问duckdb
  • 拼多多-----anti_content逆向分析
  • 【一文了解】Unity的协程(Coroutine)与线程(Thread)
  • 贪心算法在网络入侵检测(NID)中的应用
  • 数据搬家后如何处理旧 iPhone
  • [react native招聘]
  • IDE工具RAD Studio 13 Florence重磅发布:64 位 IDE + AI 组件全面升级!
  • session存储
  • Another Redis Desktop Manager 的 SCAN 使用问题与风险分析
  • MATLAB绘制一个新颖的混沌图像(新四翼混沌系统)
  • AI起名工具
  • typeScript 装饰器
  • 【算法磨剑:用 C++ 思考的艺术・单源最短路进阶】Bellman-Ford 与 SPFA 算法模板精讲,突破负权边场景
  • 单元测试:驱动模块与桩模块在自顶向下和自底向上的策略中的作用
  • SpringBoot MVC 快速入门
  • Nature Communications 北京大学联合德国马普所在触觉传感器方面取得进展,实现机器人指尖超分辨率力感知
  • 解决一次 “Failed to load model because protobuf parsing failed”:从现象到根因与修复
  • 从ppm到ppb:全面解读浓度单位转换的诀窍
  • 贪心算法应用:霍夫曼编码详解
  • NLP Subword 之 BBPE(Byte-level BPE) 算法原理
  • 【nodejs】Windows7系统下如何安装nodejs16以上版本
  • Part05 数学
  • 每天五分钟深度学习:深层神经网络的优势
  • PCGrad解决多任务冲突
  • 第十一章:游戏玩法和屏幕特效-Gameplay and ScreenEffects《Unity Shaders and Effets Cookbook》
  • Choerodon UI V1.6.7发布!为 H-ZERO 开发注入新动能
  • 科教共融,具创未来!节卡助力第十届浦东新区机器人创新应用及技能竞赛圆满举行
  • 食品包装 AI 视觉检测技术:原理、优势与数据应用解析
  • 【深度学习计算机视觉】05:多尺度目标检测之FPN架构详解与PyTorch实战