git原理与使用

目录

    • 引入
    • 基本操作
    • 分支管理
    • 远程操作
    • 标签管理

引入

假设你的老板要你设计一个文档,当你设计好了,拿给他看时,他并不是很满意,就要你拿回去修改,你修改完后,再给他看时,他还是不满意,经过多次修改,他觉得还是你之前的第三次修改后的文档好,最终决定采用第三次修改后的文档,但因为前面你都是在一个文档上修改的,意味着前面修改的文档内容都被覆盖了,也就无法完成老板的任务
同上,吸取了之前的教训后,你明白了要保存前面的副本,因为老板可能会采纳之前的文档,所以每一次修改,你都存一份副本,这样,就能在最终选用文档时,拿出成果。
同上,上面的想法听起来确实很合理,一般情况下,也能解决问题,但是,在软件开发中,随着版本的不断增多,维护好版本是很有挑战的,那就需要我们知道每个版本各自修改的内容,才能更好地维护,而上面的生成副本的方式无法知晓当前版本在上一个版本的基础上修改了哪些内容(内容很多的情形),这种方式也就不适用了!此时,git应运而生!!!
git,是一个版本控制器,它是记录每次的修改以及版本迭代的一个管理系统,比如在文本文件的某一行前面添加了一行内容,也能清楚的找出这种修改。

基本操作

创建本地仓库
仓库本质上就是进行版本控制的一个文件目录,用git init命令创建,下图中的.git是用来跟踪管理仓库的

在这里插入图片描述
配置git
用下面两个两个命令可以配置用户名和邮箱地址,这点很重要!!!其中的global表示全局,即带了这个选项,在所有仓库中都会使用你配置的这个用户名和邮箱地址,不带,则只在当前仓库有效
注意:命令必须在仓库内执行!!!
git config [–global] user.name “Your Name”
git config [–global] user.email “email@example.com”
查看配置
用git config -l命令查看配置信息
删除配置信息
git config [–global] --unset user.name
git config [–global] --unset user.email

在这里插入图片描述

认识工作区、暂存区、版本库
git关注的是修改,即增加、更新、修改,而修改的工作区内容会写入对象库的一个新的git对象中,文件要被git跟踪管理,就必须得进行add和commit操作,完成这两步后,文件才会被添加到仓库管理

在这里插入图片描述
add操作
git add 文件(文件名)/目录(目录名)/所有文件(.)
commit操作
git commit -m 日志信息,即提交暂存区的所有文件
commit后,可以用git log来查看提交的日志信息
如下图,是提交工作区的内容到版本库的示例流程,如果没有配置用户名和邮箱信息,就无法commit,会提示要你配置,配置完成后,再commit就可以了,而日志中的黄色的那一长串字符串,则是commit id

在这里插入图片描述
如果想看简单一些的日志,可以带–pretty=oneline选项

在这里插入图片描述
如下图,index就是暂存区,add后的内容都是添加到这里的

在这里插入图片描述
HEAD是默认指向master分支的指针

在这里插入图片描述
master保存的是当前最新的commit id

在这里插入图片描述
objects,保存了git维护的所有修改
如下图,查看object时,它由两部分构成,前两位是文件夹名称,后面的38位则是文件名称

在这里插入图片描述
在这里插入图片描述
用git cat-file -p commit id查看版本库对象的内容

在这里插入图片描述
修改文件
如下图,用git status查看工作区中状态,显示还没有添加和提交

在这里插入图片描述
三天前修改的文件,到今天,我们可能就已经不记得修改了哪些内容,此时就可以用到git diff来查看修改了哪些内容。a 和 b表示从之前的a文件,修改后变成了b文件,相当于同一个文件的不同版本,-1表示改动前第一行,+1,2表示改动后第一行起连续两行的内容

在这里插入图片描述
版本回退
如果你发现之前做的工作,出现了一些问题,需要解决,就得回到某一个历史版本,这时,就能用到git reset [–soft || --mixed || --hard] [HEAD]
HEAD,表示当前版本
HEAD^,表示上一个版本
HEAD^^,表示上上一个版本
也能直接使用commit id,表示回退到指定版本
mixed,表示回退到某个历史版本的暂存区,版本库也变了,但工作区不变,且这是个默认选项,即不指定时,就是mixed

soft,表示回退到某个历史版本的版本库,工作区和暂存区不变
hard,表示回退到某个历史版本的工作区,暂存区和版本库都变,慎重使用这个选项,因为是回退工作区,可能内容就找不回来了
以hard为例,进行讲解
如下图,从version3回退到version2了,工作区文件的内容也回退了

在这里插入图片描述
假如我突然后悔了,想回到version3版本,但发现根本做不到,因为我们没有version3的commit id,此时,只能借助git reflog命令来尝试补救了
如下图,我们借助git reflog命令找到了version3的部分commit id,但也能代表目标版本!!!

在这里插入图片描述
从下图,可以看出,版本回退非常的迅速,只需要修改指针即可!

在这里插入图片描述
撤销修改
当我们觉得当前写的代码太糟糕了,想恢复到上一个版本,这时就需要用到类似于word等工具的撤销功能,分为三种情形
没有add,可以直接用git checkout – 文件名进行撤销

在这里插入图片描述
已经add,但没有commit,可以使用git reset HEAD 文件名,将add的回退到工作区,然后再用如上的方式撤销

在这里插入图片描述
已经add,已经commit,则能采用git reset --hard HEAD^,前提是你没有push到远程仓库
删除文件
用git rm命令,可以删除工作区和暂存区中的内容,然后再commit提交即可

在这里插入图片描述

分支管理

假设你能创建自己的分身,那你就可以让自己的分身去做与自己不同的事情,比如它去学习Java,而你学习C++,在某个时间点,你们俩合并,此时,你就能既学会了Java,也学会了C++,极大地提高了你的学习效率。分支便是如此,便于团队协作,提高工作效率!!!
创建分支
用git branch来查看分支,git branch 分支名来创建分支,* 在哪儿表示HEAD指针当前指向哪一个分支,最后的cat,证明两个分支指向同一个提交

在这里插入图片描述
在这里插入图片描述

如下图,也可以用git checkout -b 分支名命令来创建并切换分支

在这里插入图片描述

切换分支
用git checkout 分支名来切换分支

在这里插入图片描述
如下图,在dev分支上创建了ReadMe文件,并写入hello world,但在master分支上却看不到,这是因为创建新分支后,master分支和dev分支是相互独立的,就如同,你并不知道你的分身干了什么事情!要想知道,就必须得将dev合并到master上

在这里插入图片描述
在这里插入图片描述

合并分支
用git merge 要合并到当前分支的分支名,fast-forward代表快进模式,也就是直接把master指向dev的当前提交

在这里插入图片描述
在这里插入图片描述

删除dev分支
当合并完成后,dev分支也就没用了,如下图,用git branch -d 分支名来删除分支,注意,不能在当前分支下删除当前分支!!!

在这里插入图片描述
如果dev分支没有被合并
可以用git branch -D 命令来删除dev分支

在这里插入图片描述

合并冲突
分支在合并时,是有可能发生冲突的,如下图所示,dev分支,将11111写入ReadMe文件,并添加提交,master分支,将2222写入ReadMe文件,并添加提交,将dev分支合并到master分支时,就发生了冲突,因为git无法确定要保存哪一个,就如同C++中的菱形继承中的二义性问题

在这里插入图片描述
要想解决合并冲突问题,就需要我们手动修改冲突的内容,选择其中一个,然后再添加提交即可!

在这里插入图片描述
在这里插入图片描述
用git log --graph --pretty=oneline --abbrev-commit命令可以查看合并情况

在这里插入图片描述
分支管理策略
fast-forward模式合并,删除分⽀后,查看分⽀历史时,会丢掉分⽀信息,看不出来最新提交到底是merge进来的还是正常提交的,但在合并冲突部分,解决合并冲突,就能知道是merge进来的还是正常提交的!
要想不以fast-forward模式合并,可以采用 git merge --no-ff -m “日志信息” 分支名,来合并

在这里插入图片描述
当我在dev分支上开发时,突然发现master分支上有个bug需要解决,而我才开发到一半,没办法提交,这时,就需要保存工作区现场,可以用git stash命令,来讲工作区信息隐藏,用git stash list可以查看刚才的隐藏信息保存在哪个分支上,用git stash pop命令来恢复现场信息,并将stash删除

在这里插入图片描述
建议:当我们建立分支去写代码要合并时,可以先将master分支合并到当前分支,如果发生合并冲突,就可以在当前分支解决,从而不会影响master

远程操作

远程仓库
如下图,是在gitee上新建远程仓库的步骤,Readme文件是一些说明,可以自己去填写,便于别人使用,比如软件的安装步骤等等,而Issue则可以用来提bug等等,Pull Request在远程合并分支时使用, 比如你在dev分支开发完,需要合并到master分支,就需要填写Pull Request申请单

在这里插入图片描述
而要想本地与远程建立联系,就必须先将仓库拷贝到本地,即使用git clone 下面的url

在这里插入图片描述
在本地查看远程仓库,可以用git remote命令,想查看详细信息,可以带-v选项,远程仓库的默认名称是origin,下面显示了拉取和推送的地址,表明可以向远程仓库推送信息,也能获取远程仓库的信息

在这里插入图片描述
向远程仓库推送,可以用git push <远程主机名> <本地分⽀名>:<远程分⽀名>来推送,如果本地分支名和远程分支名相同,则可以省略冒号及它后面的,如下图,我删除了本地仓库的文件,同时也想把远程的也给删掉,就用到了push操作

在这里插入图片描述
在这里插入图片描述
拉取远程仓库

拉取远程仓库内容和推送一样,只不过要把push改为pull,如下图,先在远程仓库创建了一个file.txt文件,并写入hello world,在本地pull后,就能把远程仓库的内容拉取到本地仓库中

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
配置Git
在上面创建仓库时,有一个添加ignore文件,可以勾选,就会在远程仓库生成该文件,该文件用于添加提交文件时,可以忽略指定的部分文件,比如写入了账号密码信息的文件,我不想推送,让别人看到,我就不提交,但文件太多了,add 指定文件太麻烦,就只能add . ,所以就有了ignore文件的产生,直接在该文件中写入你想忽略的文件即可,如下图所示。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果是使用的*.txt,来忽略所有txt后缀文件,而又要某个.txt文件不被忽略,就能在该文件前面加个!xxx.txt,表示不忽略。git add -f可以强制添加文件,但不建议使用
给命令配置别名
如下图,这条命令太长了,写起来太麻烦,就可以对其起别名

在这里插入图片描述
如下图,用git config --global alias.别名 ‘命令’

在这里插入图片描述

标签管理

因为commit id太长了,很难记住,所以我们可以用标签来作为commit的别名,这样也方便后续使用
可以用git tag 标签名来创建一个标签,git tag查看标签

在这里插入图片描述
如下图,可以看出,默认打的标签是打在最新的一次commit上的

在这里插入图片描述
如下图,给指定commit打标签,用git tag 标签名 commit id

在这里插入图片描述
如下图,用git show 标签名查看标签信息

在这里插入图片描述
如下图,可以带-a选项,对标签进行说明

在这里插入图片描述
在这里插入图片描述
如下图,可以用-d选项,来删除标签。

在这里插入图片描述
如下图,要推送至远程,可以用git push origin 标签名

在这里插入图片描述
在这里插入图片描述
如下图,删除标签,先在本地删除,再推送至远程仓库

在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫相关

目录 初识爬虫 爬虫分类 网络爬虫原理 爬虫基本工作流程 搜索引擎获取新网站的url robots.txt HTHP协议 Resquests模块 前言&#xff1a; 安装 普通请求 会话请求 response的常用方法 简单案例 aiohttp模块 使用前安装模块 具体案例 数据解析 re解析 bs4…

每次执行@Test方法前都执行一次DB初始化(SpringBoot Test + JUnit5环境)

引言 在执行单元测试时&#xff0c;可以使用诸如H2内存数据库替代线上的Mysql数据库等&#xff0c;如此在执行单元测试时就能尽可能模拟真实环境的SQL执行&#xff0c;同时也无需依赖线上数据库&#xff0c;增加了测试用例执行环境的可移植性。而使用H2数据库时&#xff0c;通…

C#程序的启动显示方案(无窗口进程发送消息) - 开源研究系列文章

今天继续研究C#的WinForm的实例显示效果。 我们上次介绍了Winform窗体的唯一实例运行代码(见博文&#xff1a;基于C#的应用程序单例唯一运行的完美解决方案 - 开源研究系列文章 )。这就有一个问题&#xff0c;程序已经打开了&#xff0c;这时候再次运行该应用程序&#xff0c;…

16 Springboot——登录功能实现

16.1 修改index.html中表单跳转的地址 将action的地址改为user/login&#xff0c;意思是点击提交按钮后&#xff0c;就会跳转到user/login地址&#xff0c;然后只要用Controller类的RequsetMapping去接这个地址就行了。 <body class"text-center"><form cl…

Spring 是如何解决循环依赖问题的?

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 例如&#xff1a;项目场景&#xff1a;示例:通过蓝牙芯片(HC-05)与手机 APP 通信&#xff0c;每隔 5s 传输一批传感器数据(不是很大) 问题描述 我们都知道&#xff0c;如果在代码中&#xff0c;将两个…

记录一次因为代码混淆导致的安卓app崩溃的事件

最近公司布置了一个新任务&#xff0c;给一个旧的安卓app增加一个新功能。 功能是替换加密算法&#xff0c;新的算法库由第三法提供&#xff0c;通过jni调用底层C库。 按照项目需求&#xff0c;修改了代码&#xff0c;调试测试阶段也都运行正常。结果发布的时候&#xff0c;测…

视频网站如何选择国外服务器?

​ 视频网站如何选择国外服务器? 地理位置&#xff1a;选择靠近目标用户群体的国外服务器位置是至关重要的。若用户主要集中在中国以外的地区&#xff0c;因您应选择位于用户所在地附近的服务商&#xff0c;以确保视频的传输速度。 带宽和速度&#xff1a;选择带宽足够且方便升…

【论文阅读】对抗溯源图主机入侵检测系统的模仿攻击(NDSS-2023)

作者&#xff1a;伊利诺伊大学芝加哥分校-Akul Goyal、Gang Wang、Adam Bates&#xff1b;维克森林大学-Xueyuan Han、 引用&#xff1a;Goyal A, Han X, Wang G, et al. Sometimes, You Aren’t What You Do: Mimicry Attacks against Provenance Graph Host Intrusion Detect…

基于kubeadm部署K8S集群

目录 基于kubeadm部署K8S集群 一、环境准备 1、主机初始化配置 2、配置主机名并绑定hosts&#xff0c;不同主机名称不同 3、主机配置初始化 二、部署docker环境 1、三台主机上分别部署 Docker 环境 2、镜像加速器&#xff08;所有主机配置&#xff09; 三、部署kubern…

Maven基础总结

前言 Maven 是一个项目管理工具&#xff0c;可以对 Java 项目进行构建、依赖管理。 基本要求掌握 配置Maven环境直接查。 得会在IDEA创建Maven的java项目吧、会创建Maven的web项目吧、会创建多模块项目吧。 得会配置插件pligin、依赖dependency吧 一、Maven四大特性 1、…

【springboot项目】在idea中启动报错合集

一、IDEA中报错 “Error running ‘Application‘: Command line is too long.“ 的解决办法 报错详情&#xff1a; Error running Application: Command line is too long.Shorten command line for Application or also for Spring Boot default configuration.报错原因&am…

【香瓜说职场】建立公司(2017.07.25)

自从17年4月份开始辞职创业&#xff0c;已经3个多月了。跟大家分享一下创业经历。 一、我的合伙人 我的合伙人是我的客户。我给他上过蓝牙教学课、帮他做了个蓝牙自拍器&#xff08;叫orbit 360&#xff0c;已在售&#xff0c;百度能搜到&#xff09;&#xff0c;历经一年多。双…