【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.rhkb.cn/news/427612.html

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

相关文章

JVM常用参数配置

JVM常用参数配置 简单的java命令后面跟上配置参数。 -XX&#xff0c;JVM启动参数的一种类型&#xff0c;属于高级。 &#xff0c;开启的意思 &#xff1a;&#xff0c;设置具体参数 #jvm启动参数不换行 #设置堆内存 -Xmx4g -Xms4g #指定GC算法 -XX:UseG1GC -XX:MaxGCPauseM…

Qt_多元素控件

目录 1、认识多元素控件 2、QListWidget 2.1 使用QListWidget 3、QTableWidget 3.1 使用QListWidget 4、QTreeWidget 4.1 使用QTreeWidget 5、QGroupBox 5.1 使用QGroupBox 6、QTabWidget 6.1 使用QTabWidget 结语 前言&#xff1a; 在Qt中&#xff0c;控件之间…

《深度学习》—— 神经网络模型对手写数字的识别

神经网络模型对手写数字的识别 import torch from torch import nn # 导入神经网络模块 from torch.utils.data import DataLoader # 数据包管理工具&#xff0c;打包数据, from torchvision import datasets # 封装了很多与图像相关的模型&#xff0c;数据集 from torchvi…

分布式事务seata

文章目录 CAP理论BASE 理论seata解决分布式事务seata重要对象XA模式AT模式TCC模式saga模式 CAP理论 CAP理论指出在分布式系统中三个属性不可能同时满足。 Consistency 一致性&#xff1a;在分布式的多个节点&#xff08;副本&#xff09;的数据必须是一样的&#xff08;强一致…

展锐平台的手机camera 系统开发过程

展锐公司有自己的isp 图像处理引擎&#xff0c;从2012 年底就开始在智能手机上部署应用。最初的时候就几个人做一款isp的从hal 到kernel 驱动的完整软件系统&#xff0c;分工不是很明确&#xff0c;基本是谁擅长哪些就搞哪些&#xff0c;除了架构和编码实现之外&#xff0c;另外…

软硬件项目运维方案(Doc原件完整版套用)

1 系统的服务内容 1.1 服务目标 1.2 信息资产统计服务 1.3 网络、安全系统运维服务 1.4 主机、存储系统运维服务 1.5 数据库系统运维服务 1.6 中间件运维服务 2 运维服务流程 3 服务管理制度规范 3.1 服务时间 3.2 行为规范 3.3 现场服务支持规范 3.4 问题记录规范…

【数据结构】排序算法---基数排序

文章目录 1. 定义2. 算法步骤2.1 MSD基数排序2.2 LSD基数排序 3. LSD 基数排序动图演示4. 性质5. 算法分析6. 代码实现C语言PythonJavaCGo 结语 ⚠本节要介绍的不是计数排序 1. 定义 基数排序&#xff08;英语&#xff1a;Radix sort&#xff09;是一种非比较型的排序算法&…

秋招常问的面试题:Cookie和Session的区别

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 《Java代码审…

LeetCode[中等] 3. 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长子串 的长度。 思路&#xff1a;滑动窗口&#xff0c;设置左右指针left与right&#xff0c;maxLength存储长度 利用HashSet性质&#xff0c;存储滑动窗口中的字符 如果没有重复的&#xff0c;那么right继续向…

LeetCode_sql_day28(1767.寻找没有被执行的任务对)

描述&#xff1a;1767.寻找没有被执行的任务对 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…

无人机企业合法运营必备运营合格证详解

无人机企业运营合格证&#xff0c;是由国家相关航空管理部门&#xff08;如中国民用航空局或其授权机构&#xff09;颁发的&#xff0c;用于确认无人机企业具备合法、安全、高效运营无人机能力的资质证书。该证书是无人机企业开展商业运营活动的必要条件&#xff0c;标志着企业…

原生+jquery写自动消失的提示框

<!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>自动消失消息提示</title> <style>/…

信息安全数学基础(9)素数的算数基本定理

前言 在信息安全数学基础中&#xff0c;素数的算数基本定理&#xff08;也称为唯一分解定理或算术基本定理&#xff09;是一个极其重要的定理&#xff0c;它描述了正整数如何唯一地分解为素数的乘积。这个定理不仅是数论的基础&#xff0c;也是许多密码学算法&#xff08;如RSA…

同为TVT设备主动注册协议接入SVMSPro平台

同为设备主动注册协议接入SVMSPro平台 步骤一&#xff1a;进设备网页或者NVR配置界面&#xff0c;进功能面板&#xff0c;网络&#xff0c;平台接入 接入类型&#xff1a;平台软件&#xff0c;勾选启用主动上报 服务器地址&#xff1a;平台服务IP 端口&#xff1a;12009 ID&…

高级算法设计与分析 学习笔记6 B树

B树定义 一个块里面存了1000个数和1001个指针&#xff0c;指针指向的那个块里面的数据大小介于指针旁边的两个数之间 标准定义&#xff1a; B树上的操作 查找B树 创建B树 分割节点 都是选择正中间的那个&#xff0c;以免一直分裂。 插入数字 在插入的路上就会检查节点需不需要…

RabbitMQ 高级特性——持久化

文章目录 前言持久化交换机持久化队列持久化消息持久化 前言 前面我们学习了 RabbitMQ 的高级特性——消息确认&#xff0c;消息确认可以保证消息传输过程的稳定性&#xff0c;但是在保证了消息传输过程的稳定性之后&#xff0c;还存在着其他的问题&#xff0c;我们都知道消息…

Delphi5利用DLL实现窗体的重用

文章目录 效果图参考利用DLL实现窗体的重用步骤1 设计出理想窗体步骤2 编写一个用户输出的函数或过程&#xff0c;在其中对窗体进行创建使它实例化步骤3 对工程文件进行相应的修改以适应DLL格式的需要步骤4 编译工程文件生成DLL文件步骤5 在需要该窗体的其他应用程序中重用该窗…

不会JS逆向也能高效结合Scrapy与Selenium实现爬虫抓取

1. 创建基础的scrapy项目 1.1 基础项目 在pycharm中安装scrapy框架 pip install scrapy 创建项目 scrapy startproject 项目名称 我们现在可以看到整体文件的目录&#xff1a; firstBlood ├── firstBlood # 项目跟目录 │ ├── init.py │ ├── items.py # 封装数…

【网络】高级IO——select版本TCP服务器

目录 前言 一&#xff0c;select函数 1.1.参数一&#xff1a;nfds 1.2.参数二&#xff1a; readfds, writefds, exceptfds 1.2.1.fd_set类型和相关操作宏 1.2.2.readfds, writefds, exceptfds 1.2.3.怎么理解 readfds, writefds, exceptfds是输入输出型参数 1.3.参数三…

数据结构之二叉树遍历

二叉树的遍历 先序遍历 先输入父节点&#xff0c;再遍历左子树和右子树&#xff1a;A、B、D、E、C、F、G 中序遍历 先遍历左子树&#xff0c;再输出父节点&#xff0c;再遍历右子树&#xff1a;D、B、E、A、F、C、G 后序遍历 先遍历左子树&#xff0c;再遍历右子树&#xff0c;…