29.Git版本控制工具

news2024/11/15 15:53:12

1.Git简介

Git是一开源的分布式版本控制系统,提供了存储代码、管理版本历史、分支和合并等功能。

  • 版本控制是指对软件开发过程中各种程序代码、配置文件及说明文档等文件变更的管理,是软件配置管理的核心思想之一。它的主要目的是跟踪和记录软件开发过程中的每个版本,记录每个版本的修改历史、版本号和发布日期等信息,以便更好地管理代码和文档,并帮助开发人员更好地协作和开发软件。

  • 通过版本控制,开发人员可以随时回滚到之前的稳定版本,恢复错误或进行分支开发等操作,以便更好地管理软件开发过程中的变化和风险。

  • 版本控制通常与版本控制系统(Version Control System,VCS)相关联,如Git、SVN等。这些系统提供了存储代码、管理版本历史、分支和合并等功能,帮助开发人员更好地协作和管理软件开发过程中的版本变化。

2.版本控制的发展历史

早期的版本控制系统是本地化管理的,采用某种简单的数据库记录文件的历次更新差异。但随着合作开发和协调工作的需要,集中式的版本控制系统(CVCS)出现了。

不同的开发人员通过客户端连接到集中管理的服务器上,提交或读取最新的文件,比如常用的SVN就是这种工作模式。

2.1 集中化的版本控制系统

集中化版本控制系统,是通过一个集中管理的中央服务器,来保存所有文件修改的历史版本,而协同开发者通过客户端连接到这台服务器,从服务器上同步更新或上传自己的修改。

图片

  • 在集中式的版本控制系统中,管理员可以轻松管控每个开发者的权限,并且维护成本低。

  • 但是这种架构下集中式服务器存在明显的单点故障,如果版本控制服务器宕机,则无法提供服务。

  • 如果服务器数据丢失并且无法恢复,那么整个项目的数据和变更历史也随之丢失。

2.2 分布式版本控制系统

为解决以上问题出现了分布式版本控制系统(DVCS),其基本设计理念是客户端不仅仅提取最新版本的快照,而是把代码仓库完整的镜像下来,相当于在本地有一份完整的数据拷贝。这样,当CVS服务器故障时,通过任何一个本地的镜像仓库就可以恢复数据。同时还可以和不同的远端代码仓库进行交互,设置不同的协作流程。

图片

  • 用户在本地就可以查看所有的历史版本信息,当用户进行修改提交文件的时候,需要进行远程更新或提交。

  • 用户即使离线时页可以进行本地提交,push推送到远程服务器才需要联网。

  • 每个用户都保存了历史版本,所以只要有一个用户设备没问题,就可以恢复数据。

3.Git的相关概念

3.1 工作区域

工作区域说明
Workspace用户电脑本地看到的文件和目录,在Git的版本控制下,构成了工作区。
Index/Stage暂存区,一般存放在 .git目录下,即.git/index,它又叫待提交更新区,用于临时存放未提交的改动。比如:执行git add,这些改动就添加到这个区域。
Repository本地仓库,是一个存放在本地的版本库。
Remote远程仓库,就是远程数据交换的仓库。比如:github,码云等代码托管平台所提供的仓库。

Git的工作流程如下:

1)从远程仓库中克隆代码到本地仓库

2)从本地仓库中checkout代码然后进行代码修改

3)在提交前先将代码添加到暂存区

4)将暂存区的代码提交到本地仓库,本地仓库中保存修改的各个历史版本

5)修改完成后,需要和团队成员共享代码时,将代码push到远程仓库

image-20230726154240620

4.Git下载与安装

Git - Downloadshttps://git-scm.com/download

5.环境配置

当安装Git后首先要做的事情是设置用户名称和email地址,每次Git提交都会使用该用户信息。

5.1 设置用户信息

git config --global user.name "han"

git config --global user.email "han@woniu.com"

5.2 查看配置信息

git config --list

git config user.name

通过上面的命令设置的信息会保存在~/.gitconfig文件中

6.初始化仓库

要使用Git对我们的代码进行版本控制,首先需要获得Git仓库,获取Git仓库通常有两种方式:

        在本地初始化一个Git仓库

        从远程仓库克隆

6.1 在本地初始化一个Git仓库

git init

6.2 从远程仓库克隆

        可以通过Git提供的命令从远程仓库进行克隆,将远程仓库克隆到本地。

        命令形式为:git clone 远程Git仓库地址

git clone https://gitee.com/project.git

        切换进入远程仓库的账号

git config --system --unset credential.helper        

7. 本地仓库的操作

         首先我们在工作区新建一个Hello.java文件。

7.1 加入暂存区

git add Hello.java

7.2 查看文件的状态

git status

git status -s #输出简介信息 

image-20230726161101476

Git中文件有4种状态:

根据一个文件是否已加入版本控制,可以把文件状态分为:

        Tracked已跟踪(被纳入版本控制),而tracked(已跟踪)又包括三种工作状态:

                Unmodified 未修改状态

                Modified 已修改状态

                Staged 已暂存状态

        Untracked未跟踪(未被纳入版本控制)

7.3 移除暂存区

git reset Hello.java # 将暂存区的文件取消暂存

7.4 提交到本地仓库

在提交到本地仓库之前,要先将文件添加到暂存区,然后在commit提交到本地仓库 。

git commit -m "初始化提交Hello.java" hello.java           # 将暂存区的文件提交到本地仓库

7.5 直接提交到本地仓库

        注意:commit -am 只对修改和删除有效,对于新增的文件还是先要执行add操作。

git commit -am "提交修改"         # 不经过暂存区,直接提交本地仓库

7.6 删除文件

git rm Hello.java                                       # 删除文件

7.7 提交删除

git commit -m "delete commit"                           # 将删除的文件提交本地仓库

7.8 忽略列表

        一般我们总会有些文件无需纳入Git 的管理,也不希望它们总出现在未跟踪文件列表。 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。 在这种情况下,我们可以在工作目录中创建一个名为 .gitignore 的文件(文件名称固定),列出要忽略的文件模式。下面是一个示例:

# no .a files
*.a
# but do track lib.a, even though you're ignoring .a files above
!lib.a
# only ignore the TODO file in the current directory, not subdir/TODO
/TODO
# ignore all files in the build/ directory
build/
# ignore doc/notes.txt, but not doc/server/arch.txt
doc/*.txt
# ignore all .pdf files in the doc/ directory
doc/**/*.pdf

7.9 查看日志

git log

  • commit(提交)比较多,git log 的内容在一页显示不完整,满屏放不下的时候,就会显示冒号。

  • 回车(往下滚一行)、空格(往下滚一页)可以继续查看剩余内容。

  • 退出:英文状态下 按 q 可以退出git log 状态。

7.10 回滚操作

git log                   //查看提交历史,找出要回滚到的commit-id

git reset --hard commit-id //回滚到commit-id

git reset --hard HEAD~1   //将最近1次的提交回滚  

8.远程仓库的操作

8.1 从远程仓库克隆

        如果你想获得一份已经存在了的 Git 仓库的拷贝,这时就要用到 git clone 命令。 Git 克隆的是该 Git 仓库服务器上的几乎所有数据(包括日志信息、历史记录等),而不仅仅是复制工作所需要的文件。 当你执行 git clone 命令的时候,默认配置下远程 Git 仓库中的每一个文件的每一个版本都将被拉取下来。

 git clone https://gitee.com/woniuxy2021/myproject.git     # 从远程仓库克隆到本地仓库

8.2 添加远程仓库

        运行 git remote add 添加一个新的远程 Git 仓库,同时指定一个可以引用的简写。

git remote add origin https://gitee.com/p.git # 将本地仓添加一个新的远程Git仓库(关联)

8.3 查看远程仓库

        如果想查看已经配置的远程仓库服务器,可以运行 git remote 命令。 它会列出指定的每一个远程服务器的简写。 如果已经克隆了远程仓库,那么至少应该能看到 origin ,这是 Git 克隆的仓库服务器的默认名字。

git remote                                            # 查看远程仓库
git remote show origin                                # 查看远程仓库输出更详细的信息

8.4 推送到远程仓库

        推送代码到远程仓库的分支

git push origin master     # 将本地仓库的代码推送到远程仓库

8.5 拉取

        git pull 是从远程仓库获取最新版本并merge到本地仓库。

git pull origin master # 从远程仓库中拉取代码(自动合并)

        注意:如果当前本地仓库不是从远程仓库克隆,而是本地创建的仓库,并且仓库中存在文件,此时再从远程仓库拉取文件的时候会报错(fatal: refusing to merge unrelated histories ),解决此问题可以在git pull命令后加入参数—allow-unrelated-histories

git pull origin master --allow-unrelated-histories //加上后面这个选项允许不相关历史提交

8.6 移除远程仓库

        如果因为一些原因想要移除一个远程仓库 ,可以使用 git remote rm命令

git remote rm origin # 将本地仓库跟远程仓库的关联移除

        注意:此命令只是从本地移除远程仓库的记录,并不会真正影响到远程仓库。

9.分支操作

        Git一般都是存在多个分支的,比如:开发分支,回归测试分支以及主干分支等。

        使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。开发人员在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。

        git init 命令会默认创建master分支。

9.1 新建分支

git checkout -b dev 新建一个分支,并且切换到新的分支dev

git branch dev 新建一个分支,但是仍停留在原来分支

9.2 查看分支

 git branch   查看本地所有的分支

git branch -r 查看所有远程的分支

git branch -a 查看所有远程分支和本地分支

9.3 切换分支

        注意:git在切换分支之前要确保当前分支没有未提交的修改,将当前分支内容进行commit之后再切换到其他分支。

git checkout dev 切换到dev分支

9.4 推送到远程仓库分支

 git push origin dev   # 推送至远程仓库分支

9.5 合并分支

        在dev分支上进行开发完成之后,需要把dev开发分支上的代码合并到master主分支上。

        首先切换到master分支

git checkout master

        将dev分支合并到master分支

git merge dev

        将master分支推送到远程仓库

git push origin master

9.6 删除分支

git branch -D <branchname>  删除本地branchname分支

10.IEDA集成Git

10.1 配置Git的路径

image-20230726224542887

10.2 创建工程并添加到Git

image-20230726224808403

image-20230726224858675

image-20230726231923421

10.3 将文件添加到暂存区

10.3.1 添加忽略列表

# .idea目录下面所有的文件
.idea/
# 忽略指定文件
git_test.iml
# 忽略编译后的文件
target/

10.3.2 添加到暂存区

image-20230726232522221

10.3.3 提交文件

image-20230726232628055

image-20230726232832241

10.5 将代码推送到远程仓库

image-20230726233039107

因为是新建的本地仓库,推送到远程仓库的时候,需要定义远程仓库。

image-20230726233146280

image-20230726233320974

image-20230726233757914

10.5 从远程仓库克隆工程到本地

image-20230726234141552

10.6 代码的推送/拉取

A开发者端:

(1)创建Hello.java

(2)添加、提交、推送

B开发者端:

(1)拉取代码

(2)修改代码、添加、提交、推送

(3)A开发者端从远程仓库更新代码

10.7 创建分支并切换分支

image-20230727000800124

image-20230727000832621

10.8 推送分支到远程仓库

        在dev分支上开发代码,并推送到远程仓库。

image-20230727001144366

image-20230727001025836

10.9 合并分支

image-20230727001650729

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

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

相关文章

【2500. 删除每行中的最大值】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元素。如果存在多个这样的值&#xff0c;删除其…

手把手教你写代码——基于控制台的通讯录管理系统(单表)

栏目介绍 本栏目专为入门java学习者设计的一些简单的入门项目 功能介绍 本项目为简单的基于控制台的通讯录管理系统&#xff0c;所需要的环境仅仅为jdk以及mysql&#xff08;版本不限&#xff09;&#xff01;只有一个简单的eclipse软件以及我们的mysql可视化工具&#xff08;视…

企业网关:打开商业大门的关键

企业网关&#xff1a;打开商业大门的关键 在当今数字化时代&#xff0c;企业网关的重要性变得越来越明显。作为连接企业内外的关键枢纽&#xff0c;企业网关不仅提供了安全可靠的网络连接&#xff0c;还为企业提供了更高效的业务运营和更好的客户体验。本文将深入探讨企业网关…

Vue-路由

一、目标 能够说出前端路由工作的过程能够知道如何在vue3中配置路由能够知道如何使用嵌套路由能够知道如何实现动态路由匹配能够知道如何使用编程式导航能够知道如何使用导航守卫 二、目录 前端路由的概念与原理vue-router的基本使用vue-router的高级用法后台管理案例 前端…

linux下的questasim安装和与vivado的关联

一、questasim安装 参考链接 IC验证工具&#xff1a;Ubuntu下Questasim10.7安装&#xff08;64bit&#xff09;全攻略 参考2 易特创芯 linux环境下questasim 10.7的安装总结_limanjihe的博客-CSDN博客 前面操作参照的第一个链接&#xff0c;后面激活文件参考的第二个 另外…

JavaScript 常用数组方法之数组扁平化「赶紧收藏」

一、什么是数组扁平化 数组扁平化&#xff0c;就是将一个复杂的嵌套多层的数组&#xff0c;一层一层的转化为层级较少或者只有一层的数组。 比如&#xff1a; // 多维数组 var arr [1,2,[3,4,5,[6,7,8],9],10,[11,12]]; // 数组扁平化 [1,2,3,4,5,6,7,8,9,10,11,12]二、实现…

关于在Python的for循环中改变列表的值问题探究

案例一&#xff1a; def test():a [1, 2]for i in a:print(i, id(a))if i 5:breaka [a[0]2, a[1]2] 输出&#xff1a; 1 4313456192 2 4313269056 解释&#xff1a; 在for循环语句中的变量a使用的内存地址为4313456192&#xff0c;这个地址以及存储的值不会因为a的重新赋…

ceph-mon运行原理分析

一、流程&#xff1a;ceph-deploy部署ceph-mon组建集群 1.ceph-deploy部署ceph-mon的工作流程及首次启动 1&#xff09;通过命令创建ceph-mon&#xff0c;命令为&#xff1a;ceph-deploy create mon keyring def mon(args):if args.subcommand create:mon_create(args)elif…

【Jenkins系列】-Pipeline语法全集

Jenkins为您提供了两种开发Pipeline的方式&#xff1a;脚本式和声明式。 脚本式流水线&#xff08;也称为“传统”流水线&#xff09;基于Groovy作为其特定于域的语言。而声明式流水线提供了简化且更友好的语法&#xff0c;并带有用于定义它们的特定语句&#xff0c;而无需学习…

金融行业软件测试面试题及其答案

下面是一些常见的金融行业软件测试面试题及其答案&#xff1a; 1. 什么是金融行业软件测试&#xff1f; 金融行业软件测试是针对金融领域的软件系统进行验证和确认的过程&#xff0c;旨在确保软件在安全、稳定、可靠和符合法规要求的条件下运行。 2. 解释一下金融软件中的风险…

golang,gin框架的请求参数(一)--推荐

golang&#xff0c;gin框架的请求参数&#xff08;一&#xff09; gin框架的重要性不过多的强调&#xff0c;重点就gin使用中的参数传递&#xff0c;获取进行梳理文件&#xff0c;满足使用需求。 获取前端请求参数的几种方法&#xff1a; 一、获取参数【浏览器地址获取参数】…

linux的一些基本指令第二期

rm rm -r 你要删除的目录名 加了-r 之后表示递归删除你要删除的目录 使用这个命名之后&#xff0c;他会一边递归到叶子节点&#xff0c;一边询问你是否要删除&#xff0c;然后会递归回来&#xff0c;在回来的途中删除&#xff1a; rm -rf 你要删除的目录名 强制执行删除操作…

权威认证!伙伴云入选亿欧2023AIGC应用场景创新TOP50榜单

近日, 知名科技与产业创新服务平台【亿欧】发布2023年度AIGC应用场景创新TOP50榜单。 伙伴云作为行业领先的零代码应用搭建平台&#xff0c;率先推出AI智能搭建系统功能&#xff0c;并将Chat GPT应用嵌入伙伴云应用在解决方案层&#xff0c;最终凭借前沿的技术创新力和突出的数…

【NVMe2.0d 17 - 1】Reservation 核心命令

文章目录 Reservation RegisterReservation AcquireReservation ReportReservation Release Reservation Register Reservation Register命令用于注册、取消注册或替换reservation key。 该命令使用Command Dword 10和内存中的Reservation Register data structure 如果该命…

基于seaborn.countplot的柱状图显示Y值及填充形状

参考链接&#xff1a; seaborn 柱状图上显示y值的方法 python柱形图填充 figs,ax plt.subplots(figsize(10,4)) fig sns.countplot(x"状态",hue"等级", datadatas)// 不可通过设置hatch参数来设置 marks ["o","---","***&quo…

IDEA批量启动多个微服务

注&#xff1a;现在盛行微服务开发&#xff0c;通常需要通过idea启动多个项目&#xff0c;每次都一个一个的启动&#xff0c;太麻烦了&#xff0c;不过被担心idea帮我们考虑到这个了&#xff08;不用安装插件哦&#xff09; 配置步骤&#xff1a; 将需要一次性全部启动的微服务…

[STL]详解vector模拟实现

[STL]vector模拟实现 文章目录 [STL]vector模拟实现1. 整体结构总览2. 成员变量解析3. 默认成员函数构造函数1构造函数2构造函数3拷贝构造函数析构函数 4. 迭代器相关函数begin函数end函数begin函数const版本end函数const版本 5.容量相关函数size函数capacity函数reserve函数re…

【Nodejs】操作mongodb数据库

1.简介 Mongoose是一个让我们可以通过Node来操作MongoDB的模块。Mongoose是一个对象文档模型(ODM)库,它对Node原生的MongoDB模块进行了进一步的优化封装&#xff0c;并提供了更多的功能。在大多数情况下&#xff0c;它被用来把结构化的模式应用到一个MongoDB集合&#xff0c;并…

【每日一题】2500. 删除每行中的最大值

【每日一题】2500. 删除每行中的最大值 2500. 删除每行中的最大值题目描述解题思路 2500. 删除每行中的最大值 题目描述 给你一个 m x n 大小的矩阵 grid &#xff0c;由若干正整数组成。 执行下述操作&#xff0c;直到 grid 变为空矩阵&#xff1a; 从每一行删除值最大的元…

阿里Java开发手册~建表规约

1. 【强制】表达是与否概念的字段&#xff0c;必须使用 is _ xxx 的方式命名&#xff0c;数据类型是 unsigned tinyint &#xff08; 1 表示是&#xff0c; 0 表示否 &#xff09; 。 说明&#xff1a; 任何字段如果为非负数&#xff0c;必须是 unsigned 。 正例&am…