# Git 版本控制

版本控制的起源

  • 现在的软件项目通常是由一个研发小组共同分析、设计、编码、维护以及测试的

  • 针对团队开发需要解决以下问题:

    • 备份多个版本,费空间,费时间
    • 难于恢复至以前正确版本
    • 容易引发 BUG
    • 解决代码冲突困难
    • 代码管理混乱
    • 难于追溯问题代码的修改人和修改时间
    • 无法进行权限控制
    • 项目版本发布困难
  • 源代码管理工具就是为了解决上述问题应运而生的

什么是版本控制

  • 什么是版本控制?

    • 版本控制的英文是 Version control;
    • 是维护工程蓝图的标准作法,能追踪工程蓝图从诞生一直到定案的过程;
    • 版本控制也是一种软件工程技巧,借此能在软件开发的过程中,确保由不同人所编辑的同一程序文件都得到同步;
  • 简单来说,版本控制在软件开发中,可以帮助程序员进行代码的追踪、维护、控制等等一系列的操作。

  • 是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统

  • 如果是开发团队中的一员,使用版本控制是强制性的!

    • 如果是单人开发,也强烈建议现在就开始使用版本控制!
  • 使用版本控制可以:

    • 不会对现有工作造成任何损害
    • 不会增加工作量
    • 添加新的功能拓展时,会变得更加容易

1667206077757

版本控制的功能

  • 对于我们日常开发,我们常常面临如下一些问题,通过版本控制可以很好的解决:
    • 不同版本的存储管理
      • 一个项目会不断进行版本的迭代,来修复之前的一些问题、增加新的功能、需求,甚至包括项目的重构;
      • 如果我们通过手动来维护一系列的项目备份,简直是一场噩梦;
    • 重大版本的备份维护
      • 对于很多重大的版本,我们会进行备份管理;
    • 恢复之前的项目版本
      • 当我们开发过程中发生一些严重的问题时,想要恢复之前的操作或者回到之前某个版本;
    • 记录项目的点点滴滴
      • 如果我们每一个功能的修改、bug 的修复、新的需求更改都需要记录下来,版本控制可以很好的解决;
    • 多人开发的代码合并
      • 项目中通常都是多人开发,将多人代码进行合并,并且在出现冲突时更好的进行处理;

常见版本控制工具

版本控制工具发展

  • 版本控制的史前时代(没有版本控制):

    • 人们通常通过文件备份的方式来进行管理,再通过 diff 命令来对比两个文件的差异;
  • CVS(Concurrent Versions System)

  • 第一个被大规模使用的版本控制工具,诞生于 1985 年;

    • 由荷兰阿姆斯特丹 VU 大学的 Dick Grune 教授实现的,也算是 SVN 的前身(SVN 的出现就是为了取代 CVS 的)。
  • SVN(Subversion)

    • 因其命令行工具名为 svn 因此通常被简称为 SVN;
    • SVN 由 CollabNet 公司于 2000 年资助并发起开发,目的是取代 CVS,对 CVS 进行了很多的优化;
    • SVN 和 CVS 一样,也属于集中式版本控制工具;
    • SVN 在早期公司开发中使用率非常高,但是目前已经被 Git 取代;
  • GIT 分布式版本控制之伟大作品

    • 早期的时候,Linux 社区使用的是 BitKeeper 来进行版本控制;
    • 但是因为一些原因,BitKeeper 想要收回对 Linux 社区的免费授权;
    • 于是 Linus 用了大概一周的时间,开发了 Git 用来取代 BitKeeper;
    • Linus 完成了 Git 的核心设计,在之后 Linus 功成身退,将 Git 交由另外一个 Git 的主要贡献者 Junio C Hamano 来维护;
    • GIT:一款分布式源代码管理工具,目前国内企业几乎都已经完成了从 SVN 到 GIT 的转换

Git 和 SVN 的对比

  • 速度

    • 在很多情况下,git 的速度远远比 SVN 快
  • 结构

    • SVN 是集中式管理,git 是分布式管理
  • 其他

    • SVN 使用分支比较笨拙,git 可以轻松拥有无限个分支
    • SVN 必须联网才能正常工作,git 支持本地版本控制工作
    • 旧版本的 SVN 会在每一个目录置放一个 .svn,git 只会在根目录拥有一个 .git

集中式版本控制

  • CVS 和 SVN 都是是属于集中式版本控制系统(Centralized Version Control Systems,简称 CVCS)
    • 它们的主要特点是单一的集中管理的服务器,保存所有文件的修订版本;
    • 协同开发人员通过客户端连接到这台服务器,取出最新的文件或者提交更新;

1667206511407

  • 这种做法带来了许多好处,特别是相较于老式的本地管理来说,每个人都可以在一定程度上看到项目中的其他人正在做些什么。
  • 但是集中式版本控制也有一个核心的问题:中央服务器不能出现故障:
    • 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作;
    • 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据;

分布式版本控制

  • Git 是属于分布式版本控制系统(Distributed Version Control System,简称 DVCS)

    • 客户端并不只提取最新版本的文件快照, 而是把代码仓库完整地镜像下来,包括完整的历史记录;
    • 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复;
    • 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份;
  • 目前在公司开发中我们都是使用 Git 来管理项目的,所以接下来我们会重点学习 Git 的各种用法;

1667206627680

  • 分布式和集中式的区别
    • 在集中式下, 开发者只能将代码提交到服务器, 在分布式下, 开发者可以本地提交
    • 在集中式下, 只有远程服务器上有代码数据库, 在分布式下, 每个开发者机器上都有一个代码数据库

Git 和 GitHub 的区别

  • git 是版本控制软件,一般用来做代码版本控制
  • github 是一个免费版本控制仓库,是国内外很多开源项目的集中地,其本体是一个 git 服务器

Git 简介

  • GIT 是一款自由和开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目

  • 在世界上所有的分布式版本控制工具中,git是最快、最简单、最流行的

  • 是 Linux 之父李纳斯的第二个伟大作品

    • 2005 年由于 BitKeeper 软件公司对 Linux 社区停止了免费使用权。
    • Linus 为了辅助 Linux 内核的开发(管理源代码),迫不得己自己开发了一个分布式版本控制工具,从而 Git 诞生了

Git 的工作原理

Git 的工作原理

  • 如果想学好 GIT 必须先了解 GIT 的工作原理

  • 工作区(Working Directory): 仓库文件夹里面, 除了.git目录以外的内容,(工作区:就是包含有 .git 文件夹 的文件夹)

  • 版本库(Repository):.git 目录, 用于存储记录版本信息

    • 版本库中的暂缓区(staga):
    • 版本库中的分支(master): git 自动创建的第一个分支
    • 版本库中的**HEAD 指针:**用于指向当前分支

git add 和 git commit 作用

  • git add: 把文件修改添加到暂缓区
  • git commit: 把暂缓区的所有内容提交到当前 HEAD 指针指向的分支

1648955104954

Git 的使用环境

下载安装 Git

  • 电脑上要想使用 Git,我们需要先对 Git 进行安装:

1667206728681

  • 在 window 操作系统按照默认配置全局安装即可;

  • 验证 Git 是否安装成功:

    • 终端中输入指令git --version ,回车,显示 Git 版本即为安装成功
    • 在文件夹中,右键菜单中出现 Git GUI HereGit Bash Here这两个选项,即为安装成功

Bash–CMD–GUI 区别

  • Bash,Unix shell 的一种,Linux 与 Mac OS X 都将它作为默认 shell。
    • Git Bash 就是一个 shell,是 Windows 下的命令行工具,可以执行 Linux 命令;
    • Git Bash 是基于 CMD 的,在 CMD 的基础上增添一些新的命令与功能;
    • 所以建议在使用的时候,用 Bash 更加方便;
  • Git CMD
    • 命令行提示符(CMD)是 Windows 操作系统上的命令行解释程序;
    • 当你在 Windows 上安装 git 并且习惯使用命令行时,可以使用 cmd 来运行 git 命令;
  • Git GUI
    • 基本上针对那些不喜欢黑屏(即命令行)编码的人;
    • 它提供了一个图形用户界面来运行 git 命令;
  • 上课演练的方式:
    • 在 Git Bash 中演练 Git 的常见操作;

Git 的使用-单人开发

帮助手册

  • 在 Git 中输入: git help ,通过 git 指令查看帮助手册
    • 查看其他指令的做法:git help 其他指令

添加全局配置信息

  • 既然已经在系统上安装了 Git,你会需要做几件事来定制你的 Git 环境:

    • 每台计算机上只需要配置一次,程序升级时会保留配置信息;
    • 你可以在任何时候再次通过运行命令来修改它们;
  • Git 自带一个 git config 的工具来帮助设置控制 Git 外观和行为的配置变量:

    • /etc/gitconfig 文件:包含系统上每一个用户及他们仓库的通用配置
      • 如果在执行 git config 时带上 –system 选项,那么它就会读写该文件中的配置变量;
      • 由于它是系统配置文件,因此你需要管理员或超级用户权限来修改它。(开发中通常不修改)
    • ~/.gitconfig 或 C/用户/coderwhy/.gitconfig 文件:只针对当前用户
      • 你可以传递 –global 选项让 Git 读写此文件,这会对你系统上 所有 的仓库生效;
    • 当前使用仓库的 Git 目录中的 config 文件(即 .git/config):针对该仓库
      • 你可以传递 –local 选项让 Git 强制读写此文件,虽然默认情况下用的就是它;
  • 查看当前的所有配置信息:git config -l

  • 在项目开发中必须要添加以下两个配置项,不然会挨打

    • 在 Git 中输入 git config user.name "123@qq.com" 添加用户名为 123@qq.com 的全局配置信息
    • 在 Git 中输入 git config user.email "123@qq.com" 添加邮箱信息为 123@qq.com 的全局配置信息

删除全局配置信息

  • 在 Git 中输入git config --global --unset user.name 即可删除指定的 user.name 全局配置信息

git 的别名

  • Git 并不会在你输入部分命令时自动推断出你想要的命令:
    • 如果不想每次都输入完整的 Git 命令,可以通过 git config 文件来轻松地为每一个命令设置一个别名。
  • 例如 : git config --global alias.co checkout , 配置 checkout 的快捷指令为 co

仓库克隆

  • 从 Git 远程仓库克隆到本地 : git clone https://github.com/coderwhy/hy-react-web-music.git
  • git config credential.helper 出现 manager-core

仓库初始化

  • 该命令将创建一个名为 .git 的子目录(这个子目录默认是隐藏的) , 这个子目录含有你初始化的 Git 仓库中所有的必须文件,这些文件是 Git 仓库的核心;
  • 但是,在这个时候,我们仅仅是做了一个初始化的操作,你的项目里的文件还没有被跟踪;
    • 在 Git 中输入 git init 进行仓库初始化(个人仓库) ,使用 Git 仓库前,必须要先初始化仓库
    • 在 Git 中输入 git config -l 查看当前所有的配置信息
    • 在 Git 中输入 clear ,清空屏幕

查看文件状态

  • 现在我们的电脑上已经有一个 Git 仓库:

    • 在实际开发中,你需要将某些文件交由这个 Git 仓库来管理;
    • 并且我们之后会修改文件的内容,当达成某一个目标时,想要记录下来这次操作,就会将它提交到仓库中;
  • 那么我们需要对文件来划分不同的状态,以确定这个文件是否已经归于 Git 仓库的管理:

    • 未跟踪:默认情况下,Git 仓库下的文件也没有添加到 Git 仓库管理中,我们需要通过 add 命令来操作;
    • 已跟踪:添加到 Git 仓库管理的文件处于已跟踪状态,Git 可以对其进行各种跟踪管理;
  • 在 Git 中输入 git status :查文件的状态, 文件名为红色的文件,就是该文件未添加到暂存区,即没有被跟踪

    • 查看某个文件的状态:git status 文件名
    • 查看当前路径所有文件的状态:git status
    • 也可以使用更加简洁的状态信息 :
      • git status -S
      • git status --short
  • 已跟踪的文件又可以进行细分状态划分:

    • staged:暂缓区中的文件状态;
    • Unmodified:commit 命令,可以将 staged 中文件提交到 Git 仓库
    • Modified:修改了某个文件后,会处于 Modified 状态;
  • 在工作时,你可以选择性地将这些修改过的文件放入暂存区;

  • 然后提交所有已暂存的修改,如此反复;

1667211310311

添加到暂缓区

  • 在 Git 中输入git add 指令, 将工作区的文件保存到暂缓区
    • 保存单个文件到暂缓区:git add 文件名 如:git add index.js ,开始跟踪一个文件
      • 如果我们已经跟踪了某一个文件,这个时候修改了文件也需要重新添加到暂存区中;
    • 保存当前路径的所有文件到暂缓区:git add .(注意,最后是一个点 . )
  • 在 Git 中输入 git status :查文件的状态 文件名为绿色的文件,就是该文件已经添加到暂存区

image-20230514093332872

image-20230514093908351

提交到版本库

提交单个/多个文件

  • 在 Git 中通过 git commit指令将暂缓区的文件提交到当前分支(默认 head 指针指向 master 主分支)
    • 提交某个文件到分支:git commit -m "注释" 文件名 如: git commit -m "初始化仓库 添加main.js" main.js
    • 保存当前路径的所有文件到分支:git commit -m ”注释”git commit -m "初始化仓库 添加main.js"
    • 如果我们修改文件的 add 操作,加上 commit 的操作有点繁琐,那么可以将两个命令结合来使用:git commit -a -m "修改了bbb文件"
  • 在 Git 中输入 git status :查文件的状态 没有再输出文件名,说明所有文件已经被 Git 管理

image-20230514094348383

修改最近一次提交信息

  • 修改最近一次的提交信息 : git commit –amend -m “要修改并提交的新的提交信息”
    • 该操作会生成一个全新的 commit 对象,修改最近一次的提交信息 , 状态码也会更新
  • 注意点:
    • 不是写一句代码就 add commit 一次,应该是完成一个功能后再 add commit
    • commit -m 时,注释一定要认真编写,与当前提交内容保持一致,否则要挨打

合并提交时落下的文件

  • 将提交时落下的文件合并到最近一次提交 :
    • git commit –amend –no-edit
      • 把某个改动并入最近一次的 commit , 落下的文件,也要先添加到暂存区,提交时才能合并进去
      • --no-edit 的意思是不要编辑 commit 信息

忽略某些文件不追踪

  • 新增 .gitignore 文件,在该文件中写上不需要追踪的文件或文件夹名称,再将该文件提交到版本库即可,后续章节有详细讲解

  • git 操作流程图:

1667211351849

查看修改内容

查看文件被修改的内容

  • git diff :查看文件最新改动的地方

    • 查看某个文件的最新改动的地方:git diff 文件名
    • 查看当前路径所有文件最新改动的地方:git diff
  • 在 Git 中输入git diff main.js,即可查看指定文件 main.js 被修改了那些内容

    • 被绿色标记的代码,就是新增的代码
    • 需要重新添加到暂缓区和重新提交到当前分支,才能重新被 git 管理

查看文件的修改日志

  • 查看单个文件的修改历史

    • 在 Git 中输入git log main.js 查看指定文件的修改历史
  • 查看当前路径所有文件的修改日志

    • 在 Git 中输入git log 查看所有文件的修改历史
  • 查看指定人员的修改历史记录 : git log –author=”289 snail”

    • 注意 : 所有人员名字中包含查找的关键字(比如查找 snail ),则(snail , 289 snail )也会被查找出来
  • 查找提交信息中的是否包含指定关键字: git log –grep=”首页”

  • 在 Git 中输入git log --pretty=online 在一行显示查看的所有文件的修改历史

  • 简略查看所有的修改历史

    • 在 Git 中输入git reflog 简略查看所有文件的修改历史,如: ( head 指针指向的是当前版本)
1
2
3
2659505 (HEAD -> master) HEAD@{0}: commit: 给main.js添加输出语句
a359aab HEAD@{1}: commit: 添加home.js
3a9d1df HEAD@{2}: commit (initial): 初始化仓库 添加main.js
  • 用一行的方式查看简单的日志信息:git log ––pretty=oneline
  • 查看最近的 N 次修改:git log –N(N 是一个整数)

版本回退

回到上一个版本

  • 在 Git 中输入git reset --hard HEAD^ 即可回退到上一个版本
  • git reset:版本回退(建议加上––hard 参数,git 支持无限次后悔)
    • 回退到上一个版本:git reset ––hard HEAD^
    • 回退到上上一个版本:git reset ––hard HEAD^^
    • 回退到上 N 个版本:git reset ––hard HEAD~N(N是一个整数)
    • 回退到任意一个版本:git reset ––hard 版本号(版本号用7位即可)

恢复到指定版本

  • 在 Git 中输入git reset --hard 版本号 即可恢复到指定版本号的版本,如:git reset --hard 2659505,版本号在简略查看修改历史中显示

添加忽略文件

  • 一般我们总会有些文件无需纳入 Git 的管理,也不希望它们总出现在未跟踪文件列表。

    • 通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等;
    • 我们可以创建一个名为 .gitignore 的文件,列出要忽略的文件的模式;
  • 在实际开发中,这个文件通常不需要手动创建,在必须的时候添加自己的忽略内容即可;

  • 比如右侧是创建的 Vue 项目自动创建的忽略文件:

    • 包括一些不需要提交的文件、文件夹;
    • 包括本地环境变量文件;
    • 包括一些日志文件;
    • 包括一些编辑器自动生成的文件;
  • 在 Git 中输入 touch .gitignore 即可在当前目录添加忽略文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
##               表示此为注释,将被Git忽略
*.a 表示忽略所有 .a 结尾的文件
!lib.a 表示但lib.a除外
/TODO 表示仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
build/ 表示忽略 build/目录下的所有文件,过滤整个build文件夹;
doc/*.txt 表示会忽略doc/notes.txt但不包括 doc/server/arch.txt

bin/: 表示忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
/bin: 表示忽略根目录下的bin文件
/*.c: 表示忽略cat.c,不忽略 build/cat.c
debug/*.obj: 表示忽略debug/io.obj,不忽略 debug/common/io.obj和tools/debug/io.obj
**/foo: 表示忽略/foo,a/foo,a/b/foo等
a/**/b: 表示忽略a/b, a/x/b,a/x/y/b等
!/bin/run.sh 表示不忽略bin目录下的run.sh文件
*.log: 表示忽略所有 .log 文件
config.php: 表示忽略当前路径的 config.php 文件

/mtk/ 表示过滤整个文件夹
*.zip 表示过滤所有.zip文件
/mtk/do.c 表示过滤某个具体文件

被过滤掉的文件就不会出现在git仓库中(gitlab或github)了,当然本地库中还有,只是push的时候不会上传。

需要注意的是,gitignore还可以指定要将哪些文件添加到版本管理中,如下:
!*.zip
!/mtk/one.txt

唯一的区别就是规则开头多了一个感叹号,Git会将满足这类规则的文件添加到版本管理中。为什么要有两种规则呢?
想象一个场景:假如我们只需要管理/mtk/目录中的one.txt文件,这个目录中的其他文件都不需要管理,那么.gitignore规则应写为::
/mtk/*
!/mtk/one.txt

假设我们只有过滤规则,而没有添加规则,那么我们就需要把/mtk/目录下除了one.txt以外的所有文件都写出来!
注意上面的/mtk/*不能写为/mtk/,否则父目录被前面的规则排除掉了,one.txt文件虽然加了!过滤规则,也不会生效!

----------------------------------------------------------------------------------
还有一些规则如下:
fd1/*
说明:忽略目录 fd1 下的全部内容;注意,不管是根目录下的 /fd1/ 目录,还是某个子目录 /child/fd1/ 目录,都会被忽略;

/fd1/*
说明:忽略根目录下的 /fd1/ 目录的全部内容;

/*
!.gitignore
!/fw/
/fw/*
!/fw/bin/
!/fw/sf/
说明:忽略全部内容,但是不忽略 .gitignore 文件、根目录下的 /fw/bin/ 和 /fw/sf/ 目录;注意要先对bin/的父目录使用!规则,使其不被排除。

单人开发总结

  • 单人流程:

    • 01 准备工作(只做一次):

      • 1 创建一个工作区
      • 2 在工作区中的打开 git 终端
      • 3 通过 git init 指令, 初始化版本库
      • 4 通过 git config user.name “姓名”git config user.email “邮箱” 设置用户名和邮箱(不设置要挨骂)
      • 5.通过 git config -l 查看设置情况
    • 02 开发阶段(反复执行)

      • 1 编写代码

      • 2 通过 git add 文件名称git add . 添加到版本库的暂缓区中

      • 3 通过 git commit -m “说明” 将暂缓区的文件添加到 HEAD 指针指向的分支中 (默认只有一个分支, master 分支, 也称之为主分支)

  • 注意点:

  • 1 不是写一句代码就 add commit 一次, 应该是完成一个功能后再 add commit

  • 2 commit 时,注释一定要认真编写, 与当前提交内容保持一致, 否则要挨骂

  • 单人使用 Git 管理项目好处:

    • 1 可以通过 git status 查看哪些文件没有被管理, 修改了哪些文件 红色(没有被管理或者被修改了)、绿色(在暂缓区)
    • 2 可以通过 git diff 查看具体修改了哪些代码
    • 3 可以通过 git log / git reflog 查看项目演变历史
    • 4 可以通过 git reset –hard 版本号 在任意版本之间切换
    • 5 无需备份多个文件, 每次 commit 提交 Git 会自动备份

Git 的使用-团队开发

管理员创建远程库

  • 一、项目管理员在远程服务器上创建一个共享版本库

    • 1 项目负责人打开远程的服务器, 然后创建一个工作区

    • 2 在远程的服务器上打开工作区, 在工作区中打开 Git 终端工具

    • 3 在 Git 终端工具中输入指令 git init --bare

    • 4 经过以上几步, 就代表远程服务器上的共享版本库已经创建好了

开发人员下载远程库

  • 二、开发人员下载远程版本库
    • 1 开发人员在自己的电脑上打开 Git 终端工具
    • 2 从远程的服务器上下载当前项目的共享版本库 git clone 远程服务器共享版本库地址
    • 3 和单人开发使用 Git 的区别: 单人开发是自己创建版本库, 而多人开发是从远程服务器下载版本库

进入开发阶段

  • 三、进入开发阶段

  • 和单人开发一样

    • 1 设置用户名和邮箱

      • 在 Git 中输入 git config user.name "123@qq.com" 添加用户名为 123@qq.com 的全局配置信息
      • 在 Git 中输入 git config user.email "123@qq.com" 添加邮箱信息为 123@qq.com 的全局配置信息
      • 或者设置当前 git 仓库的用户名和邮箱 : git config --local user.name "xiaoming" , git config --local user.email "xiaoming@163.com , 这样在提交代码时,Git 就知道是谁提交的了。
    • 2 编写代码

    • 3 添加到暂缓区

      • 保存单个文件到暂缓区:git add 文件名 如:git add index.js

      • 保存当前路径的所有文件到暂缓区:git add .(注意,最后是一个点 . )

    • 4 添加到 HEADER 指针指向的分支

      • 提交某个文件到分支:git commit -m ”注释” 文件名 如:git commit -m "初始化仓库 添加main.js" main.js
      • 保存当前路径的所有文件到分支:git commit -m ”注释”git commit -m "初始化仓库 添加main.js"
    • 5 注意点:

      • commit 是将编写好的代码提交到本地的版本库, 所以此时其它的开发人员还拿不到我们提交的代码的

      • 如果想让其它开发人员也能拿到我们提交的代码, 还必须将编写好的代码提交到远程的服务器

    • 6 将代码提交到远程的服务器 git push

    • 7 其它的开发人员只需要通过 git pull 就可以拿到更新的代码了

开发注意点

  • 多人开发使用 Git 注意点:
    • 1 不能将不能运行的代码提交到本地和远程服务器(切记一定不能)
    • 2 如果服务器上有其它开发人员的更新内容, 那么我们不能直接通过git push将我们的代码提交到服务器
    • 3 如果服务器上有其它开发人员更新的内容, 我们必须先将其它开发人员更新的内容,git pull更新到本地之后, 才能通过 push 提交我们的内容
    • 4 如何我们更新的内容和其它同事更新的内容有冲突(修改了同一个文件的同一行代码), 这个时候需要我们自己手动修改冲突, 修改完冲突之后才能将代码提交到远程服务器

开发技巧

  • 开发技巧:
    • 只要开发完了一个功能就要立即提交代码, 因为在企业开发中谁后提交谁就负责解决冲突, 谁的工作量就会变大

分支的使用

查看分支

  • 一、如何查看有多少个分支?

    • 1 通过 git branch 指令就可以查看当前版本库中有多少个分支
  • 注意点:

    • 1 如果当前的版本库是空的, 那么无法查看

    • 2 如果通过git branch指令查看当前版本库中有多少个分支, 输出的内容中哪一个分支前面有*号,就代表当前的 HEADER 指针指向哪一个分支, 我们提交的代码就会提交到指向的分支中

创建分支

  • 二、如何创建一个分支
    • 1 通过 git branch 分支名称 来创建一个新的分支,如:git branch Dev
  • 注意点:
    • 在哪个分支中创建了新的分支, 那么创建出来的新的分支就会继承当前分支的所有状态
  • 例如:
    • 在 master 分支中做了两个操作, 然后在 master 分支中创建了 Dev 分支,那么创建出来的 Dev 分支就会继承 master 分支中的这两个操作
  • 注意点:
    • 一旦分支被创建出来之后, 分支就是独立的, 分支之间不会相互影响

重命名分支

  • 指令 : git branch -m 旧分支名 新分支名
    • 例如 : git branch -m snail dev

切换分支

  • 三、如何切换分支
    • 通过 git switch 分支名称 来修改 HEADER 指针的指向,如:git switch Dev
      • 或者 git checkout Dev 都可以
    • 通过 git switch -b 分支名称 来创建新分支并切换到新的分支:
      • 如果这个分支本来就存在,git 会提示该分支已经存在;
      • 如果不存在,git 会创建改分支后再切换过去。
    • 注意点:
      • 只要 HEADER 指针的指向发生了改变, 那么 commit 的代码就会发生改变,
      • HEADER 指针指向谁 commit 提交的代码就提交到谁里面
      • 切换的分支要是已经存在,切换的分支不存在会报错

提交分支

  • 四、如何将分支提交到远程服务器

    • 1 通过 git branch -r 来查看远程服务器上有多少个分支

    • 2 首先需要在本地切换到新建的分支中, 然后通过 git push 指令提交新建的分支到远程的服务器git push --set-upstream origin Dev

合并分支

  • 五、如何合并分支

    • 可以通过 git merge 分支名称 来合并分支
    • 例如:
      • 在 master 分支中执行 git merge Dev 就代表需要将 Dev 分支中的代码都合并到 master 分支中
    • 例如:
      • 在 Dev 分支中执行 git merge master 就代表需要将 master 分支中的代码都合并到 Dev 分支中

删除分支

  • 六、如何删除分支
    • 1 可以通过 git branch -d 分支名称 来删除本地的分支,如:git branch -d Dev
      • 注意: 要先切换到其他分支,才可以删除指定分支, 不能自杀
    • 2 可以通过 git push origin –delete 分支名称 来删除远程服务器的分支,如:git push origin --delete Dev

Gitflow 工作流程

  • Gitflow 工作中的 6 条分支:

1648979739975

准备阶段

1648980014697

  • 一、准备阶段:
    • 1 初始化远程工作区和共享版本库
    • 2 项目经理初始化项目, 并在 master 定制标记
      • git push之前,可以用过git tab -a v0.1 -m "初始化项目" 添加标记,通过git tab查看标记
    • 3 将 master 分支提交到远程服务器
      • git push
    • 4 项目经理基于 master 分支创建 develop 分支
      • git branch Develop
    • 5 项目经理将新建的分支提交到远程的服务器
      • 切换到新建的分支:git switch Develop
      • 将分支提交到远程服务器: git push
    • 6 项目经理给开发人员分配工作任务

开发阶段

1648981284800

  • 二、开发阶段
    • 1 开发人员基于 develop 分支创建功能分支
    • 2 开发人员在自己的分支上 add commit push
    • 3 开发完成告诉项目经理, 由项目经理审核代码并合并代码到 develop

准备上线阶段

1649071631064

  • 三、准备上线阶段
    • 1 项目经理基于 develop 分支创建 release 分支
    • 2 测试人员获取 release 分支代码进行测试
    • 3 发现 bug 由开发人员基于 release 分支创建 bugfix 分支进行修复
    • 4 修复完成后重新合并到 release 分支
    • 5 将测试和修复完所有 bug 的最终代码合并到 master 分支和 develop 分支

正式上线阶段

1649072034897

  • 三、正式上线阶段
    • 1 项目经理给 master 分支制定标记
    • 2 项目经理将标记提交到远程服务器:git push origin v1.0
    • 3 项目完成上线

项目上线之后

1649072219097

  • 四、上线之后
    • 1 项目上线后如果出现了紧急 bug
    • 2 基于 master 分支创建 hotfix 分支, 在该分支上修复 bug
    • 3 修复完成后重新合并到 master 分支和 develop 分支
    • 4 项目经理在 master 分支定制标记

Gitee 的使用

Gitee 的注册与登陆

创建仓库

配置 SSH 公钥

  • 1 生成 SSH 公钥
  • 在 Git 中输入 ssh-keygen -t ed25519 -C "xxxxx@xxxxx.com",三次回车,即可生成公钥(后面的邮箱仅作为标识)
  • 2 查看 SSH 公钥
  • C:\Users\online289\.ssh目录中的 id_ed25519.pub 文件中查看生成的 SSH 公钥
  • 3 添加 SSH 公钥
  • 将生成的公钥复制,在 Gitee 中设置/SSH 公钥中添加公钥
  • 4 在终端中输入ssh -T git@gitee.com, 出现 hai~xxx 即配置完成

Git 的全局配置

1
2
3
# 添加全局配置,必须添加,否则会挨骂
git config --global user.name "骑蜗牛去流浪"
git config --global user.email "1234567890@qq.com"

创建 git 仓库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
mkdir vue3-black-horse-rabbit-fresh # 创建项目目录
cd vue3-black-horse-rabbit-fresh # 进入项目目录
git init # 仓库初始化
touch README.md # 创建 README.md 文件
git add README.md # 将 README.md 文件添加到暂存区
git commit -m "first commit" # 提交到本地仓库

# 添加并连接远程仓库 , origin 是远程仓库的别名
git remote add origin https://gitee.com/online289/vue3-black-horse-rabbit-fresh.git

# 把本地仓库主分支推到远程仓库主分支
# 把 master 分支的内容推向远端的 origin 位置
# 在 origin 远端服务器上,如果 master 分支不存在,则创建一个名为 master 的分支
# 如果远端服务器上已存在 master 分支,则会把远端 master 分支更新到最新进度
# 加入-u 参数,下次再执行git push 命令时,就会用 master 分支作为默认的远端节点推送上去
git push -u origin "master"

已有仓库连接远程库

1
2
3
cd existing_git_repo # 进入项目
git remote add origin https://gitee.com/online289/vue3-black-horse-rabbit-fresh.git # 连接远程仓库
git push -u origin "master" # 提交到远程库master分支