【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.mzph.cn/pingmian/54227.shtml

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

相关文章

回归预测|基于饥饿游戏搜索优化随机森林的数据回归预测Matlab程序HGS-RF 多特征输入单输出 高引用先用先创新

回归预测|基于饥饿游戏搜索优化随机森林的数据回归预测Matlab程序HGS-RF 多特征输入单输出 高引用先用先创新 文章目录 一、基本原理1. 饥饿游戏搜索优化算法&#xff08;HGS&#xff09;简介2. 随机森林&#xff08;RF&#xff09;简介3. HGS-RF回归预测流程1. 初始化2. 随机森…

基于SpringBoot+Vue+MySQL的在线宠物用品商城销售系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着人们生活质量的提升和宠物经济的蓬勃发展&#xff0c;宠物已成为众多家庭不可或缺的一员。宠物市场的需求日益增长&#xff0c;涵盖了食品、用品、医疗、美容等多个领域。基于SpringBootVueMySQL的在线宠物用品商城销售系统…

新发布的OpenAI o1生成式AI模型在强化学习方面迈出了重要的一步

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Unity杂谈】iOS 18中文字体显示问题的调查

一、问题现象 最近苹果iOS 18系统正式版推送&#xff0c;周围升级系统的同事越来越多&#xff0c;有些同事发现&#xff0c;iOS 18上很多游戏&#xff08;尤其是海外游戏&#xff09;的中文版&#xff0c;显示的字很奇怪&#xff0c;就像一些字被“吞掉了”&#xff0c;无法显示…

考研数据结构——C语言实现无向图邻接矩阵

首先&#xff0c;定义了一些基本的数据结构和常量&#xff1a; VertexType 和 EdgeType 分别用于表示图中的顶点和边的权重。MAXVEX 定义了图中最大顶点数为100。INFINITY 用于表示顶点之间没有直接的边相连&#xff0c;这里用65535作为无穷大的表示。 定义了一个图的结构体 MG…

MiniCPM3-4B | 笔记本电脑运行端侧大模型OpenBMB/MiniCPM3-4B-GPTQ-Int4量化版 | PyCharm环境

MiniCPM3-4B&#xff0c;轻松在笔记本电脑上运行大模型&#xff1f; 背景一、选择模型二、模型下载三、模型运行四、总结 背景 2024年9月5日&#xff0c;面壁智能发布了MiniCPM3-4B&#xff0c;面壁的测试结果声称MiniCPM3-4B表现超越 Phi-3.5-mini-instruct 和 GPT-3.5-Turbo-…

卸载完mathtype后,删除word加载项中的mathtype

请参考博客“卸载完mathtype后&#xff0c;word加载项中还是有mathtype的解决方法_怎么删除word加载项里的mathtype-CSDN博客”以及 “安装卸载MathType经验解决MathType DLL找不到的问题——超实用_mathtype dll cannot-CSDN博客” 如果在删除.dotm文件时&#xff0c;删不掉…

随着访问范围的扩大 OpenAI o1-mini 现已向免费用户开放

上周&#xff0c;OpenAI 展示了其最新的大型语言模型&#xff08;LLM&#xff09;–OpenAI o1及其小兄弟 OpenAI o1-mini。该公司在公告中称&#xff0c;Plus 和 Team 用户可在公告发布之日起访问该模型。企业和教育用户将在本周获得该模型&#xff0c;而免费用户最终将获得 o1…

Golang | Leetcode Golang题解之第404题左叶子之和

题目&#xff1a; 题解&#xff1a; func isLeafNode(node *TreeNode) bool {return node.Left nil && node.Right nil }func sumOfLeftLeaves(root *TreeNode) (ans int) {if root nil {return}q : []*TreeNode{root}for len(q) > 0 {node : q[0]q q[1:]if no…

Mac 上,终端如何开启 proxy

前提 确保你的浏览器可以访问 google&#xff0c;就是得先有这个能力 步骤 查看网络的 http/https 还有 socks5 的 port配置 .zshrc 查看 port 点击 wifi 设置 以我的为例&#xff0c;我的 http/https 都是 7890&#xff0c; socks5 是 7891 查看代理的port 以我的软件…

清华团队发布鼻咽癌诊断模型,自动从HE染色图像生成EBER染色图像|文献精析·24-09-18

小罗碎碎念 今天精读的这篇文章于2024年7月22日发表&#xff0c;作者来自清华大学和广西大学。 角色姓名单位名称&#xff08;中文&#xff09;第一作者曾清华大学珠三角研究院医学光学技术研发中心&#xff0c;广州通讯作者何清华大学深圳国际研究生院生物制药与健康工程研究所…

【Django5】django的helloworld

安装django pip install djangoDjango官方中文文档 https://docs.djangoproject.com/zh-hans/5.1/Github链接 https://github.com/django/django创建Django项目 cd到想要创建项目的文件夹下&#xff0c;输入以下命令创建项目 这行代码将会在当前目录下创建一个 mysite 目录 …

算法.图论-并查集上

文章目录 1. 并查集介绍2. 并查集的实现2.1 实现逻辑2.2 isSameSet方法2.3 union方法(小挂大优化)2.4 find方法(路径压缩优化) 3. 并查集模板 1. 并查集介绍 定义&#xff1a; 并查集是一种树型的数据结构&#xff0c;用于处理一些不相交集合的合并及查询问题&#xff08;即所…

JavaDS —— 图

图的概念 图是由顶点集合以及顶点之间的关系组成的一种数据结构&#xff1a;G &#xff08;V&#xff0c;E&#xff09; 其中 V 表示的是顶点集合 &#xff1a; V { x | x 属于某个数据对象集} 是有穷非空集合 E 叫做边的集合 &#xff1a; E {(x, y) | x, y 属于 V} 或者 …

Qt 模型视图(二):模型类QAbstractItemModel

文章目录 Qt 模型视图(二)&#xff1a;模型类QAbstractItemModel1.基本概念1.1.模型的基本结构1.2.模型索引1.3.行号和列号1.4.父项1.5.项的角色1.6.总结 Qt 模型视图(二)&#xff1a;模型类QAbstractItemModel ​ 模型/视图结构是一种将数据存储和界面展示分离的编程方法。模…

Kotlin cancel CoroutineScope.launch的任务后仍运行

Kotlin cancel CoroutineScope.launch的任务后仍运行 import kotlinx.coroutines.*fun main() {runBlocking {val coroutineScope CoroutineScope(Dispatchers.IO)val job coroutineScope.launch {var i 0while (i < Int.MAX_VALUE) {iprintln(i)}}// 2ms 取消协程delay(…

搜索小车运动最短路径python代码实现

一、实验任务 场地中正方格代表障碍物&#xff0c;选取小车运动起点和终点。编程探究小车从起点运动到终点&#xff0c;总共有几种可行的路径&#xff08;路径不含重叠部分&#xff09;&#xff0c;同时找出最短路径并可视化。 二、实验思路 把场地抽象化为69的平面矩阵&…

Deep Learning-Based Object Pose Estimation:A Comprehensive Survey

论文&#xff1a;https://arxiv.org/pdf/2405.07801v3 项目&#xff1a;https://github.com/CNJianLiu/Awesome-Object-Pose-Estimation 年份&#xff1a;2024 方向&#xff1a;姿态估计 1. 目标姿态估计定义 估计图像中目标相对于相机的姿态&#xff0c; 目标姿态估计是增…

YoloV8 trick讲解

1.将 YOLOv5 的 C3结构换成了梯度流更丰富的 C2f结构: C3 C3 模块的设计灵感来自 CSPNet&#xff0c;其核心思想是将特征图的部分通道进行分割和并行处理&#xff0c;目的是减少冗余梯度信息&#xff0c;同时保持较高的网络表达能力。C3 结构与传统的残差结构类似&#xff0c;但…

yolov5/8/9/10模型在VOC数据集上的应用【代码+数据集+python环境+GUI系统】

yolov5/8/9/10模型在VOC数据集上的应用【代码数据集python环境GUI系统】 1.背景意义 VOC数据集被广泛应用于计算机视觉领域的研究和实验中&#xff0c;特别是目标检测和图像识别任务。许多知名的目标检测算法都使用VOC数据集进行训练和测试。VOC挑战赛&#xff08;VOC Challeng…