学静思语
Published on 2025-02-15 / 0 Visits
0
0

版本管理工具-Git

版本管理工具-Git

一、版本管理

  • 一句话:在开发过程中用于管理对文件、目录或工程等内容的修改历史,方便查看历史记录,备份以便恢复以前的版本的软件工程技术

1. 可以完成哪些功能

  • 实现跨域多人协同开发
  • 追踪和记载一个或者多个文件的历史记录
  • 组织和保护源代码和文档
  • 统计工作量
  • 并行开发、提高开发效率
  • 跟踪记录整个软件的开发过程
  • 减轻开发人员负担节省时间,同时降低人为错误

2. 主流版本控制工具/软件

  • Git
  • SVN (Subversion)
  • CVS (Concurrent Version Syatem)
  • VSS (Micorosoft Visual SourceSafe)
  • TFS (Team Foundation Server)
  • Visual Studio Online

3. 版本控制分类

3.1 本地版本控制

  • 解读本地版本控制

  • 记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如RCS

    image-20241006163436910

3.2 集中版本控制

  • 介绍

  • 所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改

  • 用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本

  • 所有数据都保存在单一的服务器上,如果这个服务器会损坏(有很大的风险),这样就会丢失所有的数据,需要定期备份

  • 代表产品:SVN、CVS、VSS

  • 示意图

    image-20241006164532395

3.3 分布式版本控制

  • 分布式版本控制

  • 所有版本信息仓库全部同步到本地的每一个用户

  • 可以在本地查看所有版本历史,可以离线在本地提交,只需要在联网时push到相应的服务器或其他用户哪里

  • 每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据

  • 更加安全,不会因为服务器损坏或者网络问题,造成不能工作的情况

  • 代表软件:Git

  • 示意图

    image-20241006165738784

4. Git VS SVN

4.1 SVN

  • SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本
  • 完成工作后,需要把自己的代码送到中央服务器,集中式版本控制系统是必须联网才能工作

4.2 Git

  • Git是分布式版本控制系统,每个人的电脑就是一个完整的版本库,工作的时间不需要联网了,因为版本都在自己电脑上
  • 协同的方法说明:比如自己在电脑上改文件A,其他人也在电脑上改了文件A,这时,你们两之间只需要把各自的修改推送给对方,就可以互相看到对方的修改了。Git可以直接看到更新了哪些代码和文件

二、Git下载和安装

1. 官网

  • 国外官方网址:https://git-scm.com/
  • 国内官方网址:https://registry.npmmirror.com/binary.html?path=git-for-windows/

2. 卸载

  • 卸载步骤:
  • 到Windows的设置中,选择应用,再选择安装的应用,然后找到安装的GIt然后删除,也可以去控制面板中删除
  • 检查环境变量,如果有和Git相关的,删除即可
  • 可以去bilibili.com查询删除的视频

3. 安装

  • 直接安装,记住安装到非系统盘
  • 细节
  • 安装路径不要带中文、空格、特殊字符

4. 验证安装是否成功

  • 查看是否如下两个标识

    image-20241006172926420

三、Git资料

1. Git大全

  • 学习文档网址:https://gitee.com/all-about-git

1.1 Git常用命令

  • 仓库:https://gitee.com/all-about-git#%E4%BB%93%E5%BA%93
  • 配置:https://gitee.com/all-about-git#%E9%85%8D%E7%BD%AE
  • 增加/删除文件:https://gitee.com/all-about-git#%E5%A2%9E%E5%8A%A0%E5%88%A0%E9%99%A4%E6%96%87%E4%BB%B6
  • 代码提交:https://gitee.com/all-about-git#%E4%BB%A3%E7%A0%81%E6%8F%90%E4%BA%A4
  • 分支:https://gitee.com/all-about-git#%E5%88%86%E6%94%AF
  • 标签:https://gitee.com/all-about-git#%E6%A0%87%E7%AD%BE
  • 查看信息:https://gitee.com/all-about-git#%E6%9F%A5%E7%9C%8B%E4%BF%A1%E6%81%AF
  • 远程同步:https://gitee.com/all-about-git#%E8%BF%9C%E7%A8%8B%E5%90%8C%E6%AD%A5

四、Git基本配置

1. 设置用户名与邮箱

  • 说明:使用Git前,需要设置你的用户名称和Email地址

1.1 具体操作

  • 安装Git后,首先要设置你的用户名称和e-mail地址,因为每次Git提交都会使用该信息

  • 指令

  • 用户名

    git config --global user.name "用户名"
    
  • 邮箱

    git config --global user.email "邮箱"
    
  • 指令成功执行,会生成C:\Users\admin\ .gitconfig

2. 查看配置

  • 查看所有配置:

    git config -l
    
  • 查看系统配置:

    git config --syatem --list
    
  • 查看当前用户配置:

    git config --global --list
    

3. Git的配置文件

3.1 system 配置文件

  • Git安装目录下的
  • /etc/gitconfig

3.2 global全局文件

  • 在\Users\admin\ .gitconfig,只适用于当前登录用户的配置

五、Git工作原理【重要】

1. 四个工作区域和关系

  • 四个工作区域

  • Git本地有三个工作区域:工作目录(Working Directory)、暂存区(Stage/Index)、资源库(Repository或Git Directory)。如果再加上远程的Git仓库(Remote Directory)就可以分为四个工作区域。文件在这四个区域之间的转换关系如下:

  • Workspace:工作区,就是你平时存放项目代码的地方

  • Index/Stage:暂存区,用于临时存放用户的改动,事实上它只是一个文件,保存即将提交到文件列表信息

  • Repository:仓库区(或本地仓库区),就是安全存放数据的位置,这里面有你提交到所有版本的数据。其中HEAD指向最新放入仓库的版本

  • Remote:远程仓库,托管代码的服务器(比如Github/Gitee),可以简单的认为是你项目组中的一台电脑用于远程数据交换

  • 对本地三个区域再说明

  • Directory:使用 Git 管理的一个目录,也就是一个仓库,包含用户的工作空间和Git的管理空间

  • WorkSpace:需要通过Git进行版本控制的目录和文件,这些目录和文件组成了工作空间。

  • .git:存放 Git 管理信息的目录,初始化仓库的时候自动创建。

  • Index/Stage:暂存区,或者叫待提交更新区,在提交进入repo之前,我们可以把所有的更新放在暂存区。

  • Local Repo:本地仓库,一个存放在本地的版本库;HEAD只是当前的开发分支(branch)。

  • Stash:隐藏,是一个工作状态保存栈,用于保存/恢复WorkSpace中的临时状态。

2. 工作流程

  • Git的工作流程说明

  • 在工作目录中添加、修改文件

  • 将需要进行版本管理的文件放入暂存区域

  • 将暂存区域的文件提交到Git本地仓库

  • 因此,Git管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)

    image-20241006213957106

六、Git仓库创建

1. 创建工作目录与常用指令

  • 工作目录(Workspace)一般就是你希望Git帮助用户管理的文件夹(目录),可以是用户项目的目录,也可以是一个空目录,建议不要有中文

  • 6个命令-示意图

    image-20241006215326610

2. 本地仓库-创建

2.1 创建全新的仓库

  • 需求:演示在本地创建全新仓库

  • 操作演示

  • 创建一个目录

  • 在目录中右键,选取

    image-20241007145542335

  • 执行指令

    git init
    
  • 执行后可以看到,仅仅在项目目录多出了一个.git目录,关于版本等的所有信息都在这个目录中

2.2 克隆远程仓库

  • 需求:演示在本地克隆远程仓库

  • 操作说明

  • 说明:克隆远程代码仓库,就是将远程服务器上的仓库完全镜像一份至本地

    #克隆一个远程代码仓库和它的整个代码历史(版本信息)
    git clone [url] #url就是远程git项目的地址
    
  • 创建一个目录

  • 在github或者Gitee找一个项目的地址url

  • 执行克隆指令

    git clone https://gitee.com/6tail/lunar-typescript.git
    

    image-20241007150814244

七、Git文件管理

1. 文件四种状态

  • 版本控制就是对文件的版本控制,在Git管理中,文件被统一管理,有四个状态
  • .Untracked:未跟踪,此文件在文件夹中,但并没有加入到git库,不参与版本控制。通过 git add状态变为Staged
  • Unmodify:文件已经入库,未修改,即版本库中的文件快照内容与文件夹中完全一致。这种类型的文件有两种处理方式,如果它被修改,变为Modified。如果使用git rm移出版本库,则成为Untracked
  • Modified:文件已修改,仅仅是修改,并没有进行其他的操作。这种文件有两个去处,通过git add可进入暂存staged状态,使用git checkout 则丢弃修改,返回到unmodify状态,这个git checkout 即从库中取出文件,覆盖当前修改
  • Staged: 暂存状态。 执行git commit 则将修改同步到库中, 这时库中的文件和本地文件又 变为一致, 文件为Unmodify 状态. 执行git reset HEAD filename 取消暂存, 文件状态为Modified

2. 文件操作指令

  • 查看指定文件状态:

    git status [filename]
    

    image-20241007152142727

  • 查看所有文件状态:

    git status
    

    image-20241007152205992

  • 添加所有文件到暂存区:

    git add .
    

    image-20241007152244697

  • 提交暂存区中的内容到本地仓库:

    git commit-m "消息内容"
    

    image-20241007152332441

3. 忽略文件

  • 实际需求:我们不想把某些文件纳入版本控制中,如何处理?

  • 忽略文件处理方式

  • 不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等,在主目录 下建立”.gitignore"文件(默认就有),此文件有如下规则:

    • 忽略文件中的空行或以井号(#)开始的行

    • 支持Linux通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符, 方括号([abc])代表可选字符范围,大括号({string1,string2,…})代表可选的字符串等。

    • 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。

    • 如果名称的最前面是一个路径分隔符(/),表示忽略.gitignore文件所在的目录,不包括其任何子目录中的dir目录

    • 如果名称的最后面是一个路径分隔符(/),忽略.gitignore文件所在的目录和所有子目录的dir目录

    • 提示:常用规则,掌握一些,其它查看文档

      *.java #忽略所有.java结尾的文件 
      !hsp.java #hsp.java除外
      
    • 更加细化的规则

    • 网址:https://blog.csdn.net/w8y56f/article/details/103263924?spm=1001.2101.3001.6661.1

    • 实例

      image-20241007153116938

八、Gitee创建代码仓库

1. 创建Gitee账号

  • gitee官网:https://so.gitee.com

2. 创建仓库

3. 设置本机绑定SSH公钥,实现免密登录

3.1 生成SSH公钥

  • 进入 C:\Users\Administrator.ssh , 没有就手动创建该目录

  • 如果该目录下有相应文件,先删除(第一次操作是没有的)

    image-20241007154440832

  • 执行指令 ssh-keygen , 生成文件(说明:直接回车即可)

  • ssh-keygen 指令更多说明: https://blog.csdn.net/weixin_37335761/article/details/120146098

  • 比如: ssh -keygen -t rsa -C 'hello@qq.com' -f ~/.ssh/github_id_rs

3.2将公钥信息publickey 添加到码云账

image-20241007154859224

image-20241007154944556

4. 将创建的仓库克隆到本地

  • 点击要克隆的仓库,然后在点击克隆下载

    image-20241007155315461

  • 在本地输入地址然后克隆

image-20241007155127148

九、IDEA 项目使用Git管理

1. 需求1-说明-实现步骤

  • 说明:将gitee创建的仓库项目拉取IDEA,进行管理

  • 实现步骤

  • 界面操作

    image-20241007161659251

    image-20241007161621286

    • 创建一个crm 模块,进行测试

      image-20241007161833195

    • 添加一个Hi.java

      image-20241007161950248

    • 将HI.java add 到 git

    • 说明:将HI.java 加入到暂存

      image-20241007162116687

    • 将HI.java commit 到 git

      • commit 只是将HI.java 提交到本地仓库

      • 并没有push 到远程仓库(即GitHub/Gitee

        image-20241007162255212

        image-20241007162454635

      • 将HI.java push 到 Gitee, 会输入用户名密码验证(是Gitee的账号)

        image-20241007163454442

  • 也可以使用命令行完成

    • 操作指令

      image-20241007163614124

2. 需求2-说明-实现步骤

  • 创建了一个IDEA 项目(没有从Gitee拉取), 后面又希望和 Gitee的某个代码仓库关联, 如何操作

  • 实现步骤

  • 还是使用这之前操作的仓库

  • 创建一个springboot/maven 项目 sns

  • 克隆 gitee的之前的学习仓库到自己指定的目录中

    image-20241007164146130

  • 将克隆下拉的仓库的文件,拷贝到IDEA对应项目中

    image-20241007164227410

  • 刷新,或者重启IDEA 项目

  • 创建Hello.java文件

  • 然后add、commit、push

  • 可以查看到仓库中出现了创建的文件

    image-20241007165838581

3. 如何查看操作记录

  • 示意图

    image-20241007170040876

  • 切换到之前的版本

    image-20241007170322884

4. 需求3-说明-实现步骤

  • 一个 IDEA 项目(从Giteeclone), 后面又希望获取 Gitee的代码仓库最新代码, 如何操作

  • 在开一个窗口然后拉取仓库,然后在之前的哪个窗口创建一个新的文件然后push到仓库中

    image-20241007171523768

  • 在新的窗口进行pull,拉取最新的代码

    image-20241007171710557

    image-20241007171738599

十、Git分支管理

1. 介绍

  • 分支合并示意图

    image-20241007172724161

  • 分支可以有多个(根据业务需求)

  • 如果各分支没有交集,始终平行发展,则不需要合并(merge)

  • 如果两个分支,需要合并,则执行merge 操作

2. 创建IDEA Maven项目和Gitee的le-erp代码仓库关联

image-20241007194828434

image-20241007194858381

3. Git分支指令

  • 网址:https://gitee.com/all-about-git#%E5%88%86%E6%94%AF

  • 指令一览

    # 列出所有本地分支
    $ git branch
    
    # 列出所有远程分支
    $ git branch -r
    
    # 列出所有本地分支和远程分支
    $ git branch -a
    
    # 新建一个分支,但依然停留在当前分支
    $ git branch [branch-name]
    
    # 新建一个分支,并切换到该分支
    $ git checkout -b [branch]
    
    # 新建一个分支,指向指定commit
    $ git branch [branch] [commit]
    
    # 新建一个分支,与指定的远程分支建立追踪关系
    $ git branch --track [branch] [remote-branch]
    
    # 切换到指定分支,并更新工作区
    $ git checkout [branch-name]
    
    # 切换到上一个分支
    $ git checkout -
    
    # 建立追踪关系,在现有分支与指定的远程分支之间
    $ git branch --set-upstream [branch] [remote-branch]
    
    # 合并指定分支到当前分支
    $ git merge [branch]
    
    # 选择一个commit,合并进当前分支
    $ git cherry-pick [commit]
    
    # 删除分支
    $ git branch -d [branch-name]
    
    # 删除远程分支
    $ git push origin --delete [branch-name]
    $ git branch -dr [remote/branch]
    
  • 需求:克隆 le-erp仓库, 创建分支v1.0, 并提交到远程仓库

  • 指令操作演示

    image-20241007195721889

4.IDEA项目创建分支

  • 创建分支

    image-20241007200115728

    image-20241007200137128

  • 将新创建的分支push到远程仓库

    image-20241007200246507

  • 如果在本地没有看到其他分支信息,需要拉取,操作如图

    image-20241007200734943

    image-20241007200809950

5.IDEA项目切换分支,进行工作

6.IDEA项目分支合并,没有冲突的情况

  • 创建一个分支V3.0

  • 在分支V3.0中添加一个Hi.java文件

    image-20241007202547543

  • 然后切换到master分支

    image-20241007202530882

  • 然后在进行合并

    image-20241007202144825

7.IDEA项目分支合并,有冲突的情况

  • 接受某一方,解决冲突

  • 手动修改,解决冲突

  • 将V2.0合并到master

    image-20241007203051374

8.IDEA项目删除分支

  • 彻底删除某个分支

  • 如果要彻底删除某个分支,远程仓库的分支也要删除

    image-20241007203758744

    image-20241007203825591

  • 只删除本地分支,还可以重新获取

image-20241007203853403

9. 注意实现和细节

  • 如果同一文件在合并分支时都被修改了则会引起冲突, 修改冲突文件后重新提交(说明: 这时要决定保留哪个分支代码)
  • Master 主分支应该非常稳定,用来发布新版本,一般情况下不要在上面工作,工作一般 在新建的分支(比如dev、v1.0、v2.0)上工作
  • 分支代码稳定后,可以合并到主分支Master
  • 在进行分支合并时, 最好是各分支都已经处于Committed的状态, 这样可以减小处理合并冲突的难度.
  • Push 操作, 是Push已经Committed的代码, 如果修改了一个文件, 但是没有执行 Commit ,那么Push 的其实是上次Committed的状态
  • add 、 commit 、push 的操作可以针对单个文件,也可以针对文件夹
  • 文件要Commit 前需要先Add 到暂存区 ,以后文件修改了,就可以直接Commit
  • 如果要删除文件,可以在本地删除该文件, 然后commit 文件所在文件夹即可,并重新 push 该分支, 那么在远程仓库, 也会删除对应分支的文件。

Comment