git教程

Git 教程

鲁迅曾经说过:“任何事情都有两面性,既有好的一面也会有坏的一面”,就像git,它既简单又复杂,为什么简单呢?因为常用的命令也就那么几个,多使用几次就能轻松掌握。复杂的是它的原理及更深入的实现机制。当然对于大部分人来说,时间是宝贵的,把有限的时间用在对我们有利的事情上才是正确的选择,所以本教程也是讲述git的工作日常使用,并不是对git底层的深入探索,看完本篇教程只能算是会使用git,但想成为git专家,那还远远不够,也不需要。

一、Git是什么?

git是一个分布式的版本控制工具

什么是分布式?

分布式顾名思义就是指服务分散部署在不同的机器上,与之对应的就是集中式。分布式的架构使得git代码安全性更高,因为每个人电脑中都有完整的版本库,都有最新的代码。

image-20200928222900435

什么是版本控制?

版本控制(Revision control)是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的软件工程技术。

Git的诞生

linux之父linus早期因为没有版本控制工具,对于世界各地Linux贡献者提交的代码,只能手工方式进行合并代码,在Linux发展了十年之后,代码量已经大到Linus无法用手工方式合并代码了,于是使用了BitMover公司为Linux社区免费提供的版本控制系统BitKeeper,后来因为Linux社区的samba软件开发者Andrew试图破解BitKeeper,被BitMover公司及时发现,于是收回了Linux社区的免费使用权。Linus花了两周时间用C写了分布式版本控制系统——Git,于是Git就这样诞生了,如果不是BitMover公司的收回,可能现在我们就没有免费好用的git了。

二、为什么使用Git?

Git优势

  • 大部分操作在本地完成,不需要联网
  • 完整性保证
  • 尽可能添加数据而不是删除和修改数据
  • 分支操作非常快捷流畅
  • 与Linux命令全面兼容

为什么使用版本控制工具

在没有使用版本控制工具以前,在写的代码中想要删除一部分或者一个文件,但又担心以后想恢复找不回来怎么办?于是只好复制这个文件做一个备份记录下来,但久了就会产生很多文件,过了一周,想要再次找回被删除的文件,此时已经记不清是在哪里删除的了,郁闷。并且和团队协同开发时,共享代码麻烦,需要将他人的代码拷贝到自己电脑上然后对比修改的部分再进行添加,实在是要命!

于是你想,如果有一个软件,不但能自动帮我记录每次文件的改动,还可以让同事协作编辑,这样就不用自己管理一堆类似的文件了,也不需要把文件传来传去。如果想查看某次改动,只需要在软件里瞄一眼就可以,岂不是很方便?

于是版本控制工具应运而生,他的主要功能

  • 协同修改
    • 多人并行不悖的修改服务器端的同一个文件。
  • 数据备份
    • 不仅保存目录和文件的当前状态,还能够保存每一个提交过的历史状态。
  • 版本管理
    • 在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空 间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文件系统快照的方式
  • 权限控制
    • 对团队中参与开发的人员进行权限控制
    • 对团队外开发者贡献的代码进行审核——Git 独有
  • 历史记录
    • 查看修改人、修改时间、修改内容、日志信息。
    • 将本地文件恢复到某一个历史状态。
  • 分支管理
    • 允许开发团队在工作过程中多条生产线同时推进任务,进一步提高效率。

三、如何使用Git?

在 window 安装Git

官网下载安装程序:https://git-scm.com/downloads,按照默认安装即可

image-20200928231224359

安装完成后,配置名称邮箱,在任意文件夹中右键选择Git bash Here进入命令行

image-20200928231443617

输入以下命令配置代码提交时显示的名字和邮箱

git config --global user.name "Your Name"
git config --global user.email "email@example.com"

注意:这里设置的名称和邮箱与登录远程仓库的账号、密码没有任何关系

Git工作原理

从右往左看

image-20200929090455244

  • workspace:工作区 ,就是你在电脑里能看到的目录,比如一个项目文件夹
  • index:暂存区 ,用于保存需要commit的文件,暂存区的意义是它将你准备提交的内容分批整体处理
  • Repository:本地仓库 ,工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库即本地仓库
  • Remote:远程仓库

git 暂存区的意义:https://blog.csdn.net/qq_36383623/article/details/103090793

文件状态流转

上面介绍了文件在不同区域的流转,咱们还需要了解一下文件本身的状态,以及不同命令对文件状态的影响。理解这几个状态直接的流转,有助于看清 Git 本质。

  • 没有被add过的文件叫untracked

  • add之后文件处于staged状态等待commit

  • commit之后文件处于unmodified状态

  • 当unmodified的文件被修改则会变为modified状态

  • modified之后的文件add之后将继续变为staged状态

  • unmodifed的文件还有一种可能是已经不再需要了,那么可以remove它不再追踪变为untracked状态

image-20200930083824118

Git常用命令

初始化仓库
# 方式一:克隆远程仓库到本地
git clone https://gitee.com
# 方式二:初始化本地仓库
git init

本地仓库初始化后会在目录中生成一个.git的文件夹,里面就是git本地库文件

注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改

设置签名

作用:区分不同开发人员的身份

  • 项目仓库级别:仅在当前本地库范围内有效

    git config user.name "your name"
    git config user.email "name@qq.com"
    

    配置信息保存位置:./.git/config 文件

  • 系统用户级别:登录当前操作系统的用户范围

    git config --global user.name "your name"
    git config --global user.email "name@qq.com"
    

    配置信息保存位置:~/.gitconfig 文件

  • 配置文件优先级

    就近原则:项目级别>系统级别,二者都没有时不允许

本地文件操作
git status
# 查看git工作区状态
git diff
# 显示当前工作区的文件和stage区文件的差异
git add [file name]
# 或
git stage [file name]
# 添加当前工作区所有文件到暂存区
git commit -m "commit message" [file name]
# 提交暂存区文件到本地仓库
查看历史记录
git log
# 多屏显示控制方式
# 空格向下翻页
# b 向上翻页
# q 退出

git log --pretty=oneline
git log --oneline
# 单行显示
git reflog
# 显示每次版本切换的记录,用于回退版本后查看之前的版本号
# HEAD@{移动到当前版本需要多少步}
前进后退

版本前进后退的本质是HEAD指针的移动

  • 基于索引值操作【推荐】

    git reset --hard [局部索引值]
    git reset --hard 5b7f847
    
  • 使用^符号:只能后退

    git reset --hard HEAD^
    # 一个^表示后退一步,n 个表示后退 n 步
    
  • 使用~符号:只能后退

    git reset --hard HEAD~n
    # 表示后退 n 步
    
reset 命令的三个参数对比
  • –soft

    仅在本地库移动 HEAD 指针

  • –mixed

    在本地库移动 HEAD 指针,重置暂存区

  • –hard

    在本地库移动 HEAD 指针,重置暂存区,重置工作区

暂存区、工作区回退
git restore --staged <file>
# 回退已经提交到暂存区的文件到本地工作区
git restore <file>
# 重置本地工作区未提交到暂存区的改变

自git的新版本2.23后,git checkout命令将被替换,新版本引入的是两个新命令 git switch 和 git restore,用以替代现在的 git checkout

git switch 切换分支

git restore 重置文件

删除文件找回

前提:删除前,文件存在时的状态在本地库有记录

git reset --hard [指针位置]
# 删除操作已经提交到本地库:指针位置指向历史记录
# 删除操作尚未提交到本地库:指针位置使用 HEAD
比较文件差异
git diff [文件名]
# 将工作区文件和暂存区比较
git diff [本地库中历史版本] [文件名]
# 将工作区中的文件和本地库历史记录比较
分支管理
什么是分支?

分支是用来将特性开发绝缘开来的。在版本控制过程中,使用多条线来同时推进多个任务,每一条线就是一条分支,例如在初始化后,git就会为我们默认创建一条master分支

每次提交,Git都把提交的版本串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD严格来说不是指向提交,而是指向mastermaster才是指向提交的,所以,HEAD指向的就是当前分支。

image-20201029235558956

每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。

当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:

image-20201030000303807

从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变:

image-20201030000411318

假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并:

image-20201030000533398

通常,合并分支时,如果可能,Git会用Fast forward模式,即上图中这种方式,但这种模式下,删除分支后,会丢掉分支信息。

image-20201030000850948

如果要强制禁用Fast forward模式,Git就会在merge时生成一个新的commit,这样,从分支历史上就可以看出分支信息。

image-20201030001416787

分支的好处
  • 同时并行推进多个功能开发,提高开发效率
  • 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可
分支操作

创建分支

git branch [分支名]

创建并切换分支

git checkout -b [分支名]
git switch -c [分支名]

查看分支

git branch -v

切换分支

git checkout [分支名]
git switch [分支名]

Git社区发布了Git的新版本2.23。在该版本中,有一个特性非常引人瞩目,就是新版本的Git引入了两个新命令 git switch 和 git restore,用以替代现在的 git checkout。换言之,git checkout 将逐渐退出历史舞台。

引用自:https://www.cnblogs.com/tinywan/p/12344267.html

合并分支

git merge [分支名]
# 强制禁用`Fast forward`模式
git merge --no-ff -m "commit message" [分支名]
解决冲突

在合并代码时,由于同时修改了同一个文件的同一行内容,导致合并冲突,这时候需要我们手动修改冲突代码进行提交

image-20201030005841469

如上图,合并dev分支冲突,冲突文件为a.txt

image-20201030010027262

查看冲突的文件可以知道,当前分支master的a.txt文件的内容为master,而dev分支的a.txt文件内容为ccc,所以造成合并冲突,这时候只需要根据自身需要修改a.txt,然后commit冲突就解决了

分支在实际开发中的应用

在实际开发中,我们应该按照几个基本原则进行分支管理:

首先,master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面干活;

那在哪干活呢?干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;

你和你的小伙伴们每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了。

所以,团队合作的分支看起来就像这样:

image-20201030010459637

远程仓库

远程仓库即本地仓库在远程主机上的备份仓库,可以供其他主机下载克隆。

在局域网环境

  • Gitlab服务器

外网环境下

  • Github
  • 码云
Github远程仓库的创建

一、创建前的准备

完成本地git客户端和GitHub服务器的密钥认证,在用户主目录(~)下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsaid_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。

  1. 生成本地密钥对

    ssh-keygen -t rsa -C "youremail@example.com"
    

    邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。

  2. Github端添加本地客户端ssh公钥

image-20201030014815805

二、 开始创建

  1. 在GitHub上新建仓库

image-20201030015158541

  1. 根据本地项目的情况选择合适的命令

image-20201030015823961

我这里是新建的一个仓库,之前本地不存在,则选择第一个

echo "# aaa" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/welitis/aaa.git
git push -u origin main             

操作命令总结

关联一个远程库

git remote add origin git@server-name:path/repo-name.git

关联后第一次推送

git push -u origin master

推送远程库

git push origin master
git reset 和git revert 的区别?

a -> b -> c

c使用git reset 是直接回退到b,git历史记录中不会再存在c这个历史记录,即 a -> b,而git revert是复制要回退的版本到下一记录,即 a -> b -> c -> b,git记录中会保留c这个状态的记录

git diff , git diff --staged 和 git diff HEAD的差别

git diff 显示当前工作区的文件和stage区文件的差异

git diff --staged 比较暂存区和已提交的本地仓库的不同

git diff HEAD 比较 HEAD指针所处区域和本地仓库的不同,即工作区被tracking文件和本地仓库的不同

为什么 Git diff HEAD 不会显示新建文件的改变?

因为git diff 只比较已经被git tracking 的文件和本地仓库中的不同,不会比较未被tracking的文件,要想能够比较,需要使用 git add 命令使新建文件被tracking

工作常见问题

在Gitlab新建了一个仓库,如何将本地代码提交到Gitlab上?

本地代码做了一些修改提交到了本地仓库,拉取远程仓库时和本地产生了冲突如何解决?

代码发布后发现出现了问题,如何回退远程仓库代码?

自己分支的代码需要合并到主分支进行提交,出现错误如何解决?

如何让一个被git管理的文件不再被控制?

git rm -r --cached ignoreFile(想要忽略的文件) 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/497806.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HarmonyOS 应用开发之UIAbility组件启动模式

UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景&#xff0c;系统提供了三种启动模式&#xff1a; singleton&#xff08;单实例模式&#xff09;multiton&#xff08;多实例模式&#xff09;specified&#xff08;指定实例模式&#xff09;…

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 node_exporter &#xff1a;主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求&#xff1a;1台主服务器 n台从服务器 &#xff08;被监控的linux虚机&am…

利用机器学习打造反电信诈骗系统

利用机器学习打造反电信诈骗系统 技术与功能数据集与模型可视化分析与词云结语 随着互联网的普及&#xff0c;电信诈骗日益猖獗&#xff0c;给人们的生活和财产安全带来了巨大的威胁。为了有效应对这一挑战&#xff0c;我们开发了一款基于机器学习的反电信诈骗系统&#xff0c;…

基于单片机音乐喷泉制作设计资料

**单片机设计介绍&#xff0c;基于单片机音乐喷泉制作设计资料 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机音乐喷泉制作设计资料概要主要包括以下几个关键部分&#xff1a;系统概述、硬件设计、软件设计以及实现过…

网络空间测绘系统的商业应用

随着网络空间的不断发展和扩展&#xff0c;网络安全已经成为当今社会面临的重要挑战之一。为了有效应对网络安全威胁&#xff0c;网络空间测绘系统应运而生&#xff0c;成为网络安全领域的重要工具。 网络空间测绘系统不仅能够帮助安全研究人员进行研究和管理&#xff0c;还能为…

IoTeX(IOTX) 推出首个DEPIN数据平台,蓝筹项目合作进入新时代。

首先来了解一下什么是IoTeX(IOTX) 2024年1月25日&#xff0c;作为由IoTeX驱动的首个DEPIN类别优先数据平台&#xff0c;与蓝筹DePIN项目Helium、Akash、Theta、DIMO、Pocket、Drife、WiFi Map和Streamr合作推出。这一官方发布标志着DePIN&#xff08;去中心化物理基础设施网络&…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 一、简单介绍 二、简单闪烁效果实现原理 三、简单闪烁效果案例实现简单步骤 四、注意事项 一、简单…

戴尔电脑Dell SupportAssist占用内存高,卸载Dell SupportAssist

咨询戴尔客服了解到&#xff0c;SupportAssist是机器出厂自带的一款应用&#xff0c;主要的功能是可以检查驱动更新以及做一些硬件方面的健康检测&#xff0c;有时候后台运行可能会导致进程占用内存比较大&#xff0c;导致访问被的应用崩溃。 咨询卸载不影响之后&#xff0c;然…

前端学习-CSS基础-Day3

一、CSS三大特性 1.1层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则&#xff1a; 1.样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&a…

【MagicDrive环境配置】新手配俩星期版

1.创建一个新的环境conda create -n newdrive python3.8 2.激活该环境conda activate newdrive 3.下载MagicDrive源码 git clone --recursive https://github.com/cure-lab/MagicDrive.git&#xff0c;如果出现时间超时八成是网的问题&#xff0c;直接自己下载解压就好 3.我的…

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

AI新工具 又一个开源大模型DBRX击败GPT3.5;根据音频和图像输入生成会说话、唱歌的动态视频

✨ 1: AniPortrait 腾讯开源&#xff1a;根据音频和图像输入生成会说话、唱歌的动态视频 AniPortrait 是个先进的框架&#xff0c;专门用来生成高质量的、由音频和参考肖像图片驱动的动画。如果你有视频&#xff0c;也可以用来实现面部的再现&#xff08;Face reenactment&am…

京东云搭建幻兽帕鲁Palworld多人游戏联机服务器教程,1分钟开服

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程&#xff0c;非常简单&#xff0c;京东云推出幻兽帕鲁镜像系统&#xff0c;镜像直接选择幻兽帕鲁镜像即可一键自动部署&#xff0c;不需要手动操作&#xff0c;真正的新手0基础部署幻兽帕鲁&#xff0c;阿腾云atengyun.…

Jmeter调用测试片段 —— 模块控制器

可以使用模块控制器调用测试片段。模块控制器提供了一种在运行时将测试片段替换为当前测试计划的机制。测试片段可以位于任何线程组中。 1、打开一个Jmeter窗口&#xff0c;添加好线程组、用户定义变量、模块控制器、测试片段、察看结果树。 2、用户定义变量同样定义好访问ip及…

【二十七】【算法分析与设计】归并(1),912. 排序数组,归并排序,递归函数的时间复杂度计算,LCR 170. 交易逆序对的总数

912. 排序数组 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 提示&#xff1a; 1 < …

学习vue3第十二节(组件的使用与类型)

1、组件的作用用途 目的&#xff1a; 提高代码的复用度&#xff0c;和便于维护&#xff0c;通过封装将复杂的功能代码拆分为更小的模块&#xff0c;方便管理&#xff0c; 当我们需要实现相同的功能时&#xff0c;我们只需要复用已经封装好的组件&#xff0c;而不需要重新编写相…

镜视界 | DevSecOps CI/CD 管道中数字供应链安全的集成策略

目录 前言 数字供应链&#xff08;DSC&#xff09;的定义 数字供应链安全的重点内容和风险因素 CI/CD管道的安全目标和可信实体 将数字供应链安全集成到CI/CD管道中 结语 本文字数&#xff1a;7715&#xff0c;阅读时长&#xff1a;19分钟 1.前言 在敏捷开发的模式下&…

Idea2023.3.6版本无法启动设置界面-settings界面打不开无反应---IntelliJ Idea工作笔记013

先说一下网上有,把某个文件删除的 有说是因为汉化问题的 可以看到,其实都不是,这样弄就好了,很简单 Please report thisjava.lang.ClassCastException: class [Lcom.intellij.execution.filters.CompositeInputFilter$InputFilterWrapper; cannot be cast to class java.uti…

AcWing-动态求连续区间和

1264. 动态求连续区间和 - AcWing题库 所需知识&#xff1a;树状数组 树状数组的表现形式&#xff1a;&#xff08;不会画图从别的大佬那里摸过来的&#xff09; 树状数组为分组管理&#xff0c;点与点之间有联系&#xff0c;并非像普通数组一样每个点之间相互独立 树状数组…

Swagger添加JWT验证(ASP.NET)

文章目录 JWT1、解析2、配置JWT JWT 1、解析 1&#xff09;客户端向授权服务系统发起请求&#xff0c;申请获取“令牌”。 2&#xff09;授权服务根据用户身份&#xff0c;生成一张专属“令牌”&#xff0c;并将该“令牌”以JWT规范返回给客户端 3&#xff09;客户端将获取到的…