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

news/2024/9/21 2:07:44/

目录

一、基本操作

1、初识Git

2、Git安装[Linux-centos]

3、Git安装[ Linnx-ubuntu]

git%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93-toc" style="margin-left:80px;">4、创建git本地仓库

5、配置Git

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

7、添加文件

8、查看历史提交记录

git%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84-toc" style="margin-left:80px;">9、查看.git文件目录结构

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

git%E4%BB%93%E5%BA%93%E4%B8%AD%EF%BC%8C%E6%9C%89%E5%87%A0%E4%B8%AA%E6%96%87%E4%BB%B6%E6%88%96%E8%80%85%E7%9B%AE%E5%BE%88%E7%89%B9%E6%AE%8A%EF%BC%89-toc" style="margin-left:80px;">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)查看是否安装gitgit

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

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

3、Git安装[ Linnx-ubuntu]

(1)查看是否安装gitgit

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

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

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

git%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93" style="margin-left:0px;">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]

git%E6%96%87%E4%BB%B6%E7%9B%AE%E5%BD%95%E7%BB%93%E6%9E%84" style="margin-left:0px;">9、查看.git文件目录结构

tree  .git/

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

git  cat-file -p  comnit-id 

git%E4%BB%93%E5%BA%93%E4%B8%AD%EF%BC%8C%E6%9C%89%E5%87%A0%E4%B8%AA%E6%96%87%E4%BB%B6%E6%88%96%E8%80%85%E7%9B%AE%E5%BE%88%E7%89%B9%E6%AE%8A%EF%BC%89" style="margin-left:0px;">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.ppmy.cn/news/1528185.html

相关文章

HTML中的零宽字符

概述 零宽字符是一组在文本中没有可见宽度的字符,它们通常用于处理文本的布局、分隔和合成。下面是一些常见的零宽字符及其详细介绍: 详细介绍 零宽空格 (Zero Width Space, ZWSP) Unicode 码位: U+200BHTML 实体: ​ 或 ​用途: 用于防止文字自动换行。用于在文本中插入不…

pandas:读取各类文件方法以及爬虫时json数据保存

文件的读取与写入 | 常用读文件方法 | 说明 | | -------------- | ---------------- | | read_csv | 读取CSV文件 | | read_excel | 读取Excel文件 | | read_html | 读取网页HTML文件 | | read_table | 通用读取方法 | | 常用写文…

leetcode160相交列表

思路 一开始以为要固定A&#xff0c;然后循环B&#xff0c;这个复杂度也太高了 题解&#xff1a; https://leetcode.cn/problems/intersection-of-two-linked-lists/?envTypestudy-plan-v2&envIdtop-100-liked 代码 /*** Definition for singly-linked list.* publi…

vue node node-sass sass-loader 版本 对应 与 兼容

警告&#xff1a; LibSass 和 Node Sass 已弃用。虽然它们将继续无限期地接收维护版本&#xff0c;但没有计划添加其他功能或与任何新的 CSS 或 Sass 功能兼容。仍在使用它的项目应该转移到 Dart Sass。 sass Sass是一种预处理器脚本语言&#xff0c;可以解释或编译成…

探索Python的Excel世界:openpyxl的魔法之旅

文章目录 探索Python的Excel世界&#xff1a;openpyxl的魔法之旅背景&#xff1a;为什么选择openpyxl&#xff1f;什么是openpyxl&#xff1f;如何安装openpyxl&#xff1f;简单的库函数使用方法场景应用&#xff1a;openpyxl在实际工作中的应用常见bug及解决方案总结 探索Pyth…

华为SMU02B1智能通信电源监控单元模块简介

华为SMU02B1是一款智能通信电源监控单元模块&#xff0c;专为5G嵌入式机框设计&#xff0c;它在通信电源管理领域扮演着重要角色。以下是对该产品的详细介绍&#xff1a; 一、产品概述 主要功能&#xff1a;华为SMU02B1能够监控和管理通信电源系统&#xff0c;提供站点监控功能…

算法练习题27——疫情下的电影院(模拟)

其实思路还好 就是输入有点难搞 Java import java.util.ArrayList; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String input scanner.nextLine();// 去掉输入字符串的方括号if (input.…

oracle 如何查死锁

在Oracle中查看死锁通常涉及查询数据字典视图和动态性能视图。以下是一个基本的查询示例&#xff0c;用于检测和显示最近的死锁&#xff1a; SELECT dd.inst_id, dd.name, o.object_id, o.object_type, s.sid, s.serial#, s.username, p.spid, s.program,d.xidusn,d.xidslot,d…