【Git原理与使用】版本管理与分支管理(1)

目录

一、基本操作

1、初识Git

2、Git安装[Linux-centos]

3、Git安装[ Linnx-ubuntu]

4、创建git本地仓库

5、配置Git

6、认识工作区、暂存区、版本库

7、添加文件

8、查看历史提交记录

9、查看.git文件目录结构

10、查看版本库对象的内容

11、小结(在本地的.git仓库中,有几个文件或者目很特殊)

12、修改文件

13、版本回退

14、撤消修改

15、删除文件

二、分支管理

1、master主分支

 2、HEAD

3、创建分支

4、切换分支

5、合并分支

6、删除分支

7、合并冲突

8、合并模式

9、分支策略

10、bug分支

11、删除临时分支

三、远程操作

1、理解分布式版本控制系统

2、远程仓库

3、新建远程仓库

4、克隆远程仓库

5、向远程仓库推送

6、拉取远程仓库

7、忽略特殊文件

8、给命令配置别名

四、标签管理

1、理解标签

2、创建标签

3、操作标签


一、基本操作

1、初识Git

(1)随着版本的不断增多,维护好版本是很有挑战的。各自的版本修改的内容是什么我们是不知道的,但是可以借助版本管理控制器Git。

(2)版本管理控制器:记录每次的修改以及版本迭代的一个管理系统。

(3)Git可以控制电脑上所有格式的文档,但是只能跟踪文本文件的改动,而图片视频等二进制文件到底改了没有,版本控制器系统不知道(修改图片也就只知道图片从100KB到120KB大小变化)Git是目前最主流的版本控制器,是开放源代码的代码托管工具。

2、Git安装[Linux-centos]

(1)查看是否安装git: git

(2)安装Git: sudo yum -y install git   【yum就相当于是centos应用商店,-y表示同意所有要求】

(3)查看Git安装的版本:git --version

3、Git安装[ Linnx-ubuntu]

(1)查看是否安装git: git

(2)安装git: sudo apt-get install git -y【apt-get也相当于是ubantu的应用商店】

(3)卸载:sudo apt-get remove git -y

(4)查看git安装的版本:git --version

4、创建git本地仓库

(1)仓库是进行版本控制的一个文件目录:我们想要对文件进行版本控制,就必须先创建一个仓库出来

(2)创建gi本地仓库git init,注意命令要在文件目录下执行。

(3).git目录是Git来跟踪管理仓库的,不要手动修改这个目录里面的文件,改乱了就把Git仓库给破坏了

5、配置Git

(1)当安装git后首先要做的事情就是设置你的用户名称和email地址,这是非常重要的,配置命令为:

//设置用户名称

git config [--global] user name "zhangsan"

//设置email地址

git config [--global] user email "247xxxxx@ qq.com"

其中--global是可选项,使用了该选项,表示这台机器上所有git仓库都会使用这个配置。

(2)查看设置命令为:

git config -l

(3)删除对应的配置命令为:

git config [--global]  --unset  user.name

PS:使用--global新增的配置,在删除时同样需要使用--global

6、认识工作区、暂存区、版本库

(1)解释:

①工作区:本地上写的代码或文件的目录暂存区。

②暂存区(stage/index):一般存放在.git目录下的index文件中,有时称作索引,是因为存放的是commit id【每次提交的内容都会有commit id】

③版本库:又名仓库(repository)。工作区有一个隐藏目录.git,它不算工作区,而是git的版本库。版本库中的所有文件都可以被git管理起来。

(2)三者关系

①在创建git版本库时,就会自动创建一个唯一的master分支,以及指向master分支的一个HEAD指针

②通过新增或粘贴进目录的文件,并不能称之为向仓库中新增文件,而只是在工作区新增了文件。比须要通过git add(进暂存区)和git commit命令(进版本库)才能将文件添加到仓库中进行管理

③修改的工作区内容会写入对象库的一个新的git对象中。

7、添加文件

(1)git add file/dir  添加文件/目录

(2)git add .   【注意这个“.”】 添加当前目录下的所有文件改动到暂存区

(3)git commit -m  “第一次提交”       提交暂存区全部内容到本地仓库中

(4)git commit [file] -m “第一次提交”          指定文件到本地仓库中

PS:-m选项,要跟上描述本次提交的信息,记录提交细节

8、查看历史提交记录

git log [--pretty=oneline]

9、查看.git文件目录结构

tree  .git/

10、查看版本库对象的内容

git  cat-file -p  comnit-id 

11、小结(在本地的.git仓库中,有几个文件或者目很特殊)

①index:暂存区,git add后会更新该内容

②HEAD:默认指向master分支的一个指针

③refs /heads/master:文件里保存当前master分支的最新的commit id

④objects:包含了创建的各种版本库对象以及内容,可以简单理解为放了git维护的所有修改 

12、修改文件

(1)Git跟踪并管理的是修改,而非文件

(2)vim ReadMe    #编辑

        cat ReadMe   #查看

(3) git status    #查看当前仓库的状态

13、版本回退

(1)执行git reset命令用于回退版本,可以指定退回某一次提交的版本。“回退”本质是要将版本库中的内容进行回退,工作区或暂存区是否回退由命令参数决定

(2)git reset命令语法格式:git reset [--soft | --mixed l --hard ]  [HEAD]

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

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

③--hard参数将暂存区与工作区都退回到指定版本。切记工作有未提交的代码时不要用这个命令,因为工作区会回滚

14、撤消修改

(1)对于工作区的代码,还未add

①直接vim文件名删代码(不推荐,易出错)

git checkout -- 文件名        #恢复到上一次add或commit,丢弃工作区的修改

(2)已经add.但未commit

git reset 回退命令使用--mixed参数,可以将暂存区的内容退回为指定版本,但工作区会不变。然后再丢弃工作区的修改

(3)已经add,也commit

回退上一个版本:git reset --hard HEAD^

15、删除文件

不仅要删工作区中的,还需要考虑版本库中是否删除。

git rm files

git commit -m "deleted files"

使用git rm将文件从暂存区和工作区中删除,并且commnit.




二、分支管理

1、master主分支

在版本回退里,每次提交,Git都把它们串成一条时间线,这条时间线就可以理解为是一个分支,截止目前只有一条时间线,在git里,这个分支叫主分支,即master分支

 2、HEAD

HEAD指向master,master指向最新一次提交

3、创建分支

git branch           #查看当前本地所有分支

git branch dev    #新建分支dev 

4、切换分支

 git checkoout dev     #切换到dev分支

5、合并分支

(1)为了在master主分支上能看到新的提交就将dev分支合并到master分支

git merge dev   #在master分支上合并dev分支

(2)Fast-forward代表“快进模式”,也就是直接把master指向 dev的当前提交,所以合并速度非常快,当然也不是每次合并都能Fast-forword

6、删除分支

(1)合并完成后,dev分支对于我们来说就没用了,那么dev分支就可以被删除,但如果当前正处于某分支下,就不能删当前分支,可以在其他分支下删除。

(2) git branch -d dev      #删除dev分支

7、合并冲突

(1)实际分支合并的时候,并不是想合并就能合并成功的,有时候可能会遇到代码冲突的时候。

(2) dev分支下修改ReadMe文件时,又在master分支修改了同样的ReadMe文件,此时的合并就可能发生冲突。发现Readme文件有冲突后,可以直接查看文件内容,要说的是git会用<<<<<,=======,>>>>来标记出不同分支的冲突内容,重要此时我们需要手动调整密码,并再次提交修正后的结果

(3)用带参数的git log也可以看到分支的合并情况,具体如下:

git log  --graph  --pretty=oneline  --abbrev-commit

8、合并模式

(1))通常合并分支时,如果可能,git会采用fastforward模式。在这种模式下,删除分支后,查看历史个分支历史时,会丢掉分支信息,看不出最新提交到底是merge进来的还是正常提交的

不使用fast forward模式:

git merge  --no-ff  -m   "merge dev2" dev2

(2)普通模式合并,合并后的历史有分支,能看出来曾经做过合并。

9、分支策略

(1)可供多人协作开发,开发完毕后合并到master主分支

(2)在实际开发中,几个基本原则进行分支管理

①master分支应该是非常稳定的,也就是仅用来发布新版本,平时不能在上面改代码

②开发人员有自己独有的开发分支,可往dev分支上合并

10、bug分支

(1)假如我们现在正在dev2分支上进行开发,开发到一半,突然发现master分支上面有bug,需要解决。在git中,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除 

(2)可现在dev的代码在工作区中开发了一半,还无法提交,怎么办呢?git提供了git stash命令,可以将当前的工作区信息进行储藏,被储藏的内容可以在将来某个时间恢复出来,再使用git status查看工作区,就是干净的(除非有没有被git管理的文件),因此可以放心地创建分支来修复bug

(3)储藏dev2工作区之后,由于我们要基于master分支修复bug,所以需要切回master分支,再新建临时分支来修复bug

git cheekout master    #切回到master

git checkout -b fix_bug    #新建并切换到fix-bug分支

③    #修复bug

④   #重新add,commit

修复完成后,切换到master分支,并完成合并,最后删除fix_bug分支

git checkout master

git merge --no-ff  -m "merge fix-bug branch"  fix-bug

至此,bug的修复工作已经完成了,还要继续回到dev2分支进行开发。

git checkout dev2

git status

git stash list   #查看工作现场

git stash pop   #恢复现场同时会把stash删除

git stash apply   #恢复现场不删除stash内容,可用git stash drop

你可以多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令

git stash  apply  stash@{0}

11、删除临时分支

(1)软件开发中,总有无穷无尽的新的功能要不断添加进来。添加一个新功能时,你肯定不希望因为一些实验性质的代码把主分支搞乱了,所以,每添加一个新功能,最也新建一个分支,将其称为feature分支,在上面开发完成后合并,最后,删除该feature分支。

(2)如果我们今天正在开发某个feature分支开发了一半后,被产品经理叫停。feature分支白干,就地销毁,这时使用传统的git branch -d命令删除分支是不行的。会提醒未合并!必须使用 git branch -D dev3强制删除




三、远程操作

1、理解分布式版本控制系统

(1)上述所有内容(工作区、暂存区、版本库等)都是在本地,而9it其实是分布式版本控制系统!

(2)分布式版本控制系统可以简单理解为我们每个人的电脑上都是一个完整的版本库,这样你工作时,就不need联网了,因为版本库就在你自己的电脑上。

(3)分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,有了这个“中央服务器”的电脑,这样就不怕本地出现什么故障了(比如运气差、硬盘坏了,代码丢失,包_括git的所有内容)

2、远程仓库

(1)qit是分布式版本控制系统,同一个git仓库,可以分布到不同的机器上。实际情况是找一台电脑充当服务器的角色,每天24H开机,其他人都从这个“服务器”仓库克隆一份到自己的电脑上,并且各自把各自的提交推送 到服务器仓库里,也从服务器仓库中拉取别人的提交

(2)github是提供git仓库托管服务的,所以只要注册一个qithub账号,就可以免费获得9i4远程仓库。github是国外的网站,速度比较慢,可用gitee码云来托管代码

3、新建远程仓库

按照自己的需求创建就好

4、克隆远程仓库

(1)克隆/下载远程仓库到本地,需要使用git clone命令,后面跟上我们远端仓库的链接。

(2)SSH协议和HTTPS协议是git最常使用的两种数据传输协议。SSH协议使用了公钥加密和公钥登录机制,体现了其实用性和安全性,使用此协议需要将我们的公钥放上服务器,由git服务器进行管理。使用HTTPS方式时,没有要求可以直接克隆下来

①HTTPS方式

git clone  hoops://gitee.com/

②使用SSH方式

a、创建ssH_key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id-rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,需要创建SSHkey:

ssh  -keygen  -t  rsa  -C "247xxxxxxx@qq.com" 顺利的话,可以在用户主目录里找到.ssh目录,里面有id-rsa和id-pub两个文件,这两个文件就是ssh-key的密钥对,id_rsa是私钥,不能泄露。

ls  -a  .ssh/

b.添加自己的公到远程仓库

c.git clone   ssh链接

(3)当我们从远程仓库克隆后,实际上git会自动把本地的master分支和远程的master分支对应起来,并且远程仓度库的默认名称是origin。在本地我们可以使用 git remote命令,来查看远程库的信息

git remote -v

5、向远程仓库推送

将本地仓库的内容提交到远程仓库

git push<远程主机名>  <本地分支名>:<远程分支名>

git push <远程主机名>  <本地分支名>     #如果本地分支名与远程分支名相同,则可以省略冒号

git push origin master       #将本地的master分支推送到origin主机的master分支

6、拉取远程仓库

(1)若远程仓库是要领先于本地仓库一个版本,为了使本地仓库保持最新的版本,我们需要拉取下远端代码,并合并到本地。git提供了git pull命令

(2) git pull <远程主机名>  <远程分支名>:<本地分支名>

git pul <远程主机名>   <远程分支名>      #如果远程分支是与当前分支同名,则冒号后的可省

7、忽略特殊文件

(1)在日常开发中,我们有些文件不想或者不应该提交到远端,比如保存了数据库密码的配置文件,那怎么让git知道呢?在git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,git就会自动忽略这些文件

(2)但如果你就是想添加某个被.gitignore忽略文件,则使用git add -f [filename]强制添加。but不推荐因为破坏了.gitignore的规则

8、给命令配置别名

将git statns 简化为git st,对应的命令为:

git config --global  alias.st  status

alias是别名的意思




四、标签管理

1、理解标签

标签tag,可以简单的理解为是对某次commit的一个标识,相当于起了一个别名。例如,在项目发布某个版本的时候,针对最后一次commit起一个v1.0这样的标签来识别里程碑的意义。

2、创建标签

(1)在git中打标签是非常简单的,首先,切换到需要打标签的分支上,再打标签。默认会打在最新提交的commit上

git tag v1.0   #给最新一次commit打上v1.0的标签

git tag   #查看所有标签

(2)打在指定的commit

git log  --pretty=oneline --abbrev-commit   t#历史记录

git tag v1.0 cbce3fo        #给commit id为cbce3fo打上标签

(3)标签不按时间顺序列出,而是按字母排

(4)git show [tagname]   #查看标签信息

(5)git还提供可以创建带有说明的标签,用-a指定标签名,-m指定说明文字

git tag -a [tagname]  -m  "xxx"  commit_id 

3、操作标签

(1)在本地删标签:git tag -d v2.0

(2)在远程删标签:

        ①标签已经推送到远程了   git push origin [tagname]

        本地很多标签一次性推送: git push originame  --tags

        ②先本地删除 git tag -d v2.1

        ③再删远程的 git push origin:refs/tags/v1.0

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

VS code EXPLORER 中不显示指定文件及文件夹设置(如.pyc, __pycache__, .vscode 文件)

VS code EXPLORER 中不显示指定文件及文件夹设置 引言正文方法1打开方式1打开方式2 方法2 引言 VS code 号称地表最强轻量级编译器&#xff0c;其最大的优势在于用户可以根据自己的需求下载适合自己的 extension。从而定制个性化的编译器。然而&#xff0c;本人今天遇到了一个…

鹰眼降尘监测

鹰眼系统检测原理根据应用领域的不同而有所差异。以下是朗观视觉小编整理的几个主要应用领域及其检测原理的概述&#xff1a; 1. 体检领域 在体检领域&#xff0c;鹰眼通常指的是一种全身扫描仪器&#xff0c;如法国鹰眼检测全身扫描系统。该系统根据生理反馈信号的单向导通&a…

基于ssm的快餐店点餐系统设计与实现

需要项目源码请联系我&#xff0c;目前有各类成品 毕设 javaweb ssh ssm springboot等等项目框架&#xff0c;源码丰富。 专业团队&#xff0c;咨询就送开题报告&#xff0c;活动限时免费&#xff0c;有需要的朋友可以来留言咨询。 一、摘要 进入二十一世纪以来&#xff0c;计…

深度学习自编码器 - 收缩自编码器(CAE)篇

序言 在深度学习的浪潮中&#xff0c;收缩自编码器&#xff08; Compressive Autoencoder, CAE \text{Compressive Autoencoder, CAE} Compressive Autoencoder, CAE&#xff09;作为自编码器的一种高级形式&#xff0c;正逐步崭露头角。收缩自编码器在保留自编码器核心功能—…

QT For Android开发-打开PPT文件

一、前言 需求&#xff1a; Qt开发Android程序过程中&#xff0c;点击按钮就打开一个PPT文件。 Qt在Windows上要打开PPT文件或者其他文件很容易。可以使用QDesktopServices打开文件&#xff0c;非常方便。QDesktopServices提供了静态接口调用系统级别的功能。 这里用的QDesk…

高效开发,从暗藏玄机的文件系统开始

4G-Cat.1模组的文件系统关乎数据传输速度、存储效率&#xff0c;以及数据安全性等等诸多因素&#xff0c;在应用开发中极为重要。 本期&#xff0c;我们来学习合宙Air201的实用示例——文件系统的使用 Air201文件系统的使用 合宙Air201资产定位模组——是一个集成超低功耗4G通…

深入探索迭代器模式的原理与应用

&#x1f3af; 设计模式专栏&#xff0c;持续更新中 欢迎订阅&#xff1a;JAVA实现设计模式 &#x1f6e0;️ 希望小伙伴们一键三连&#xff0c;有问题私信都会回复&#xff0c;或者在评论区直接发言 迭代器模式 &#x1f4bb; 迭代器模式 (Iterator Pattern) 是一种行为设计模…

saltstack高级用法

一、saltstack的高级用法 一、job管理 1、job简介 Jid&#xff1a;job id&#xff0c;格式为%Y%m%d%H%M%S%fmaster在下发指令消息时&#xff0c;会附带上产生的Jid&#xff0c;minion在接收到指令开始执行时&#xff0c;会在本地的cachedir&#xff08;默认是/var/cache/salt/…

力扣 2824.统计和小于目标的下标对数目

文章目录 题目介绍解法 题目介绍 解法 题目相当于从数组中选两个数&#xff0c;我们只关心这两个数的和是否小于 target&#xff0c;由于 abba&#xff0c;无论如何排列数组元素&#xff0c;都不会影响加法的结果&#xff0c;所以排序不影响结果的数量。 排序后&#xff1a; …

CDH Hive集群的create/drop慢问题,在200s 多一点处理分析

现象&#xff1a; CREATE TABLE test911 (SN String,PN_CODE String); Total time spent in this metastore function was greater than 1000ms : createTable_(Table, )200091 Hive集群的 create/drop 操作时间基本都稳定在 200s 多一点。 分析&#xff1a; HMS会实时向Sentr…

实战OpenCV之图像阈值处理

基础入门 图像阈值处理是一种二值化技术&#xff0c;它基于预设的阈值&#xff0c;可以将图像中的像素分为两大类&#xff1a;一大类是背景&#xff0c;另一大类是前景或目标对象。这个过程涉及将图像中的每个像素值与阈值进行比较&#xff0c;并根据比较结果决定保留原始值还是…

jmeter得到的文档数据处理

通过前面jmeter得到的输出文档&#xff0c;这里是txt文档&#xff0c;里面包含了很多条数据&#xff0c;每条数据的结构如下&#xff1a; 【request】 uuid&#xff1a;xxxxxxx timestamp&#xff1a;xxxxxxxx No.x question&#xff1a;xxxxxxx 【response】 code&#…

防火墙配置变更管理

在任何组织中&#xff0c;当涉及到网络安全时&#xff0c;频繁地更换防火墙是必要的&#xff0c;实施简化的防火墙更改管理策略模板可以减少管理时间&#xff0c;还可以减少每次变更引入新的安全性或合规性问题的可能性。典型的防火墙变更管理流程将包括以下步骤&#xff1a; …

排序----插入排序

一开始把第一个元素看成是有序的&#xff0c;然后从第二个元素开始拿出来与前面的数据比较&#xff0c;若前面的数据小&#xff0c;就把前面的数据不断后移&#xff08;注意要把拿出来的那个元素提前保存下来&#xff09;&#xff0c;直到遇到比自己小的元素&#xff0c;然后插…

大语言模型-教育方向数据集

大语言模型-教育方向数据集 编号论文数据集1Bitew S K, Hadifar A, Sterckx L, et al. Learning to Reuse Distractors to Support Multiple-Choice Question Generation in Education[J]. IEEE Transactions on Learning Technologies, 2022, 17: 375-390.Televic, NL, https…

Java 每日一刊(第12期):面向对象

“任何复杂的程序&#xff0c;都可以通过分解成若干个简单的问题来解决。” 前言 这里是分享 Java 相关内容的专刊&#xff0c;每日一更。 本期将为大家带来以下内容&#xff1a; 类对象类与对象的关系Java 中的三种变量类型OOP 的三大特性 类 类 是对现实世界中某类事物…

AntFlow系列教程之流程拒绝

这是开源项目AntFlow的一个系统入门使用教程.AntFlow是一款开源免费的企业级低代码工作流引擎.仿照钉钉设计,极大降低流程设计、开发和维护成本。详细介绍请查看历史文章&#xff1a;AntFlow开源仿钉钉低代码工作流平台集成RuoYi版本来啦 流程拒绝和流程同意提交的参数是一样的…

基于milvus数据库的RAG-Demo

1.上传文本并将文本向量化 import os from django.conf import settings from langchain.document_loaders import TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter, CharacterTextSplitter from langchain.vectorstores import Chroma from l…

【JAVA入门】Day47 - 线程

【JAVA入门】Day47 - 线程 文章目录 【JAVA入门】Day47 - 线程一、并发和并行二、多线程的实现方式2.1 继承 Thread 类的方式2.2 实现 Runnable 接口的方式2.3 利用 Callable 接口实现 三、Thread 类中常见的成员方法四、线程的调度和优先级4.1 抢占式调度4.2 优先级4.3 守护线…

如何不终止容器退出Docker Bash会话

如何不终止容器退出Docker Bash会话 💖The Begin💖点点关注,收藏不迷路💖 当通过docker exec进入Docker容器的bash会话后,如果想退出但不停止容器,可以使用快捷键组合: 按下Ctrl+P然后紧接着按下Ctrl+Q。 这个操作会让你从bash会话中“分离”出来,但容器会继续运行…