Git学习笔记
先看一个实际需求,引出 Git
问题: 公司五一活动计划
- 先说一个最简单的情况,比如你做了公司五一活动计划书(如图)
解决方案: 版本管理工具(Git)
一句话: Git 是目前最流行的分布式版本控制软件
Git 是怎么来的?
Git 之父 :李纳斯·托沃兹(Linus Benedic Torvalds)1969、芬兰
Git 小故事
1、Linux 内核开源项目有着为数众广的参与者, 绝大多数的 Linux 内核维护工作, 都花在了提交补丁、保存归档的繁琐事务上(1991-2002 年间)。到 2002 年, 整个项目组开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码
2、到了 2005 年, 开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。(Linux 社区有好事者,破解 BitKeeper, 也让 BitKeeper 恼火.)
3、自己动手丰衣足食, Linus Torvalds 用 2 周,开发出一套版本控制系统, 也是后来的 Git
4、Git 是目前世界上最先进的分布式版本控制系统, 免费、开源
版本管理
一句话: 在开发的过程中用于管理对文件、目录或工程等内容的修改历史,方便查看历史记录,备份以便恢复以前的版本的软件工程技术
可以完成哪些功能?
-
实现跨区域多人协同开发
-
追踪和记载一个或者多个文件的历史记录
-
组织和保护你的源代码和文档
-
统计工作量
-
并行开发、提高开发效率
-
跟踪记录整个软件的开发过程
-
减轻开发人员负担,节省时间,同时降低人为错误
主流版本控制工具/软件
-
Git
-
SVN(Subversion)
-
CVS(Concurrent Versions System)
-
VSS(Micorosoft Visual SourceSafe)
-
TFS(Team Foundation Server)
-
Visual Studio Online
版本控制分类
本地版本控制
- 老韩解读-本地版本控制
记录文件每次的更新,可以对每个版本做一个快照,或是记录补丁文件,适合个人用,如
RCS
https://wenku.baidu.com/view/7a9ee0875cbfc77da26925c52cc58bd6318693e1.html
- 示意图
集中版本控制
- 介绍
- 所有的版本数据都保存在服务器上,协同开发者从服务器上同步更新或上传自己的修改
- 用户的本地只有自己以前所同步的版本,如果不连网的话,用户就看不到历史版本,也无法切换版本
- 所有数据都保存在单一的服务器上,如果这个服务器会损坏(有很大的风险), 这样就会丢失所有的数据,需要定期备份
- 代表产品:SVN、CVS、VSS
- 示意图
分布式版本控制
- 老韩解读-分布式版本控制
- 所有版本信息仓库全部同步到本地的每个用户
- 可以在本地查看所有版本历史,可以离线在本地提交,只需在连网时 push 到相应的服务器或其他用户那里。
- 每个用户那里保存的都是所有的版本数据,只要有一个用户的设备没有问题就可以恢复所有的数据
- 更加安全, 不会因为服务器损坏或者网络问题,造成不能工作的情况
- 代表软件: Git
- 示意图
Git VS SVN
SVN
- SVN 是集中式版本控制系统,版本库是集中放在中央服务器的,而工作的时候,用的都是自己的电脑,所以首先要从中央服务器得到最新的版本
- 完成工作后,需要把自己的代码送到中央服务器。集中式版本控制系统是必须联网才能工作
Git
- Git 是分布式版本控制系统,每个人的电脑就是一个完整的版本库,工作的时候不需要联网了,因为版本都在自己电脑上。
- 协同的方法说明:比如自己在电脑上改了文件 A,其他人也在电脑上改了文件 A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。Git 可以直接看到更新了哪些代码和文件
Git 下载&安装
官网
- 地址: https://git-scm.com/
- 下载版本: Git-2.33.0.2-64-bit.exe
- 下载慢,可以到镜像下载 : http://npm.taobao.org/mirrors/git-for-windows/
卸载
- 说明:如果安装过,可以卸载和老师版本保持一致
- 卸载步骤
- 到 windows 的应用和功能,到的 git, 卸载即可(如图)
- 检查环境变量 , 如果有和 Git 相关的,删除即可
- 到 windows 的应用和功能,到的 git, 卸载即可(如图)
安装
- 说明:直接下一步即可,建议安装到非系统盘, 比如 d:\
- 细节:安装路径不要带中文、空格、特殊字符
验证安装是否成功
- 点击右键如图
Git 资料
-
Git 大全
- 地址: https://gitee.com/all-about-git
- Git 常用命令
- 仓库 https://gitee.com/all-about-git#仓库
- 配置 https://gitee.com/all-about-git#配置
- 增 加 / 删 除 文 件 https://gitee.com/all-about-git#增加删除文件
- 代码提交 https://gitee.com/all-about-git#代码提交
- 分支 https://gitee.com/all-about-git#分支
- 标签 https://gitee.com/all-about-git#标签
- 查看信息 https://gitee.com/all-about-git#查看信息
- 远程同步 https://gitee.com/all-about-git#远程同步
-
Git 互动学习
Git 基本配置
设置用户名与邮箱
说明:使用 Git 前,需要设置你的用户名称和 Email 地址
具体操作
- 安装Git 后, 首先要设置你的用户名称和e-mail 地址, 因为每次Git 提交都会使用该信息
- **指令 **
#用户名
git config --global user.name "hspedu"
#邮箱
git config --global user.email "hspedu@xx.com"
- 指令成功执行,会生成 C:\Users\Administrator\.gitconfig, 信息如下
查看配置
查看所有配置:git config -l
查看系统配置:git config --system --list
查看当前用户配置:git config --global --list
说明:该指令显示的就是 C:\Users\Administrator\.gitconfig 内容
Git 的配置文件
system 配置文件
Git\etc\gitconfig :Git 安装目录下的 gitconfig
global 全局文件
1、C:\Users\Administrator\ .gitconfig 只适用于当前登录用户的配置
Git 工作原理[重要]
四个工作区域&关系
- 四个工作区域
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 中的临时状态。
工作流程
Git 的工作流程说明:
- 在工作目录中添加、修改文件;
- 将需要进行版本管理的文件放入暂存区域;
- 将暂存区域的文件提交到git 本地仓库。
因此,git 管理的文件有三种状态:已修改(modified),已暂存(staged),已提交(committed)
Git 仓库创建
创建工作目录与常用指令
- 工作目录(WorkSpace)一般就是你希望 Git 帮助你管理的文件夹,可以是你项目的目录,也可以是一个空目录,建议不要有中文。
- 6 个命令 - 示意图
本地仓库-创建
创建全新的仓库
需求:演示在本地创建全新仓库 d:\hspgit
操作演示
说明: 创建全新的仓库,需要用 GIT 管理的项目的根目录执行
- 创建目录d:\hspgit 作为本地 git 仓库
- 右键
- 执行 git init
- 执行后可以看到,仅仅在项目目录多出了一个.git 目录,关于版本等的所有信息都在这个目录里面
克隆远程仓库
需求:演示在本地克隆远程仓库 d:\hspgit2
操作演示
说明: 克隆远程代码仓库,就是将远程服务器上的仓库完全镜像一份至本地
# 克隆一个代码仓库和它的整个代码历史(版本信息)
$ git clone [url] # url 就是远程git 项目的地址
- 创建目录d:\hspgit2 作为本地git 仓库
- 在 github 或者 gitee 找一个项目的 地址 url, 比如
https://gitee.com/6tail/lunar-javascript.git
- 执行克隆指令
git clone https://gitee.com/6tail/lunar-javascript.git
Git 文件管理
文件四种状态
- 版本控制就是对文件的版本控制,在 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
文件操作指令
查看指定文件状态:git status [filename]
先在 D:\hspgit2\lunar-javascript , 创建一个测试文件 ABC.txt
查看所有文件状态:git status
添加所有文件到暂存区:git add .
提交暂存区中的内容到本地仓库:git commit -m "消息内容"
忽略文件
实际需求:我们不想把某些文件纳入版本控制中, 如何处理?
忽略文件处理方式
- 不想把某些文件纳入版本控制中,比如数据库文件,临时文件,设计文件等, 在主目录下建立".gitignore"文件(默认就有),此文件有如下规则:
- 忽略文件中的空行或以井号(#)开始的行
- 支持 Linux 通配符。例如:星号(*)代表任意多个字符,问号(?)代表一个字符,方括号([abc])代表可选字符范围,大括号({string1,string2,...})代表可选的字符串等。
- 如果名称的最前面有一个感叹号(!),表示例外规则,将不被忽略。
- 如果名称的最前面是一个路径分隔符(/),表示忽略 .gitignore 文件所在的目录,不包括其任何子目录 中的 dir 目录
- 如果名称的最后面是一个路径分隔符(/),忽略 .gitignore 文件所在的目录和所有子目录的 dir 目录
#老师提示: 常用规则,掌握一些,其它查看文档
*.java #忽略所有.java 结尾的文件
!hsp.java #hsp.java 除外韩顺平Java 工程师更加详细的规则https://blog.csdn.net/w8y56f/article/details/103263924?spm=1001.2101.3001.6661.1&utm_medium=distribute.Edefault%7ECTRLIST%7Edefault-1.showsourcetag&depth_1-utm_source=distribute.pc_relevant_t0.none-task-lt-1.showsourcetag
看一个实例
- 文件 D:\hspgit2\lunar-javascript\.gitignore
Gitee 创建代码仓库
创建 Gitee 账号
gitee 官网:https://gitee.com/
注册地址:https://gitee.com/signup
也可以使用 微信、QQ、Github 账号登录...
创建账号-具体操作
- 注册地址: https://gitee.com/signup
- 查看邮箱,得到验证码
- 填写得到的验证码和你的gitee 账号密码
- 点击注册, 如果都填写正确,就会注册成功,进入 gitee
创建仓库
- 点击创建仓库
- 输入仓库的信息, 仓库开源, 需要绑定手机号.
- 点击创建
设置本机绑定 SSH 公钥,实现免密登录
生成 SSH 公钥
- 进入 C:\Users\Administrator\.ssh , 没有就手动创建该文件夹
- 如果该目录下有相应文件,先删除(第一次操作是没有的)
-
执行指令 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_rsa
- 将公钥信息 public key 添加到码云账户
- 点击设置
- 点击 SSH 公钥
- 复制生成的 id_rsa.pub 内容
- 拷贝到如下位置
- 提示输入密码验证,然后就成功了
- 将创建的仓库-克隆到本地
- 先找到仓库,并得到仓库地址 url
- 创建 D:\gitee_hsp_java
- 执行克隆指令
- 克隆成功
IDEA 项目使用 Git 管理
需求 1-说明
将 gitee 创建的 hspjava 项目拉取到 IDEA,进行管理
需求 1-实现步骤
界面操作
- 将 Gitee 初始化 hspjava,拉取到 IDEA
- 创建一个crm 模块,进行测试
- 创建 HI.java, 进行测试
- 将HI.java add 到 git, 说明:将 HI.java 加入到暂存区
- 将HI.java commit 到 git
- commit 只是将 HI.java 提交到本地仓库
- 并没有 push 到远程仓库(即GitHub/Gitee)
- 将HI.java push 到 Gitee , 会输入用户名密码验证(是 Gitee 的账号).
- 观察 Gitee 上项目的变化
也可以使用命令行完成
- 操作指令
测试: 创建一个新文件 OK.java
- 看下 Gitee 项目的变化,会与新的 push 文件
需求 2-说明
创建了一个IDEA 项目(没有从Gitee 拉取), 后面又希望和 Gitee 的某个代码仓库关联,如何操作?
需求 2-实现步骤
界面操作
- 在 Gitee 创建一个仓库,比如 hsp-sns
- 创建一个springboot /maven 项目 hsp-sns
- 克隆 gitee 的 hsp-sns 到 d:/git-hsp-sns
- 将克隆下拉的hsp-sns 的文件,拷贝到 IDEA 对应项目中
- 刷新,或者重启IDEA 项目
- 创建文件D:\java_projects\hsp-erp\src\main\java\com\hspedu\hspsns\Hello.java
public class Hello {
public static void main(String[] args) {
System.out.println("xxx");
}
}
- 完成 add, commit , push 一系列操作
- 观察 gitee 上项目的变化
也可以使用命令行完成
如何查看操作记录
示意图
需求 3-说明
- 一个 IDEA 项目(从 Gitee clone), 后面又希望获取 Gitee 的代码仓库最新代码, 如何操作?
- 看老师具体演示-pull
- 学习使用 Git 的小技巧分享
GIT 分支管理
介绍
一个分支实例
项目地址 https://gitee.com/ZhongBangKeJi/CRMEB-Min
分支合并示意图
- 分支可以有多个(根据业务需求)
- 如果各分支没有交集,始终平行发展,则不需要合并(merge)
- 如果两个分支,需要合并,则执行merge 操作.
创建 IDEA Maven 项目, 和 Gitee 的 hsp-erp 代码仓库关联
-
先在 Gitee 创建仓库hsp-erp, 并设置成开源
-
在新的目录比如 d:/idea_projects 使用idea 创建hsp-erp maven, 并和Gitee 仓库hsp-erp
关联, 前面老师已经讲过了, 自己回顾一下
-
创建文件 HspErpApplication.java , 写入一些内容
-
将HspErpApplication.java push 到 Gitee 远程仓库 , 执行 add->commit->push
-
观察 Gitee 远程仓库是否已经 push 成功
git 分支指令
- 地址: https://gitee.com/all-about-git
- 指令一览
# 新建一个分支,与指定的远程分支建立追踪关系
$ 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]
应用实例
- 需求:克隆 hsp-erp 仓库, 创建分支 v1.0, 并提交到远程仓库
- 指令操作演示
IDEA 项目创建分支
- 创建分支
- 把分支同步到Gitee 远程仓库
- 查看远程仓库
IDEA 项目切换分支, 进行工作
- 切换分支(指令checkout)
- 在v2.0 分支下 , 我们修改/增加一下文件, 就是针对当前v2.0 的
- 把HspErpApplication.java Add->Commit->Push 到 Remote 仓库, 按照老师步骤来.
- 执行 Add
- 执行 Commit
- 执行 Push
- 观察 Gitee 的远程仓库变化
- 观察本地仓库 版本切换的变化
----------------------------
- IDEA 项目分支合并, 没有冲突的情况
- 在进行分支合并时, 如果没有冲突(比如没有修改同一个文件), 这时会比较顺畅.
- 案例演示/需求说明: 将分支v3.0 合并到 Master 主分支
- 从 master 开一个分支 v3.0, 在 v3.0 增加一些文件, 不在 master 和 v3.0 修改同一个文件
- 将分支v3.0, 同步到Gitee 远程仓库, 操作步骤和前面一样开v2.0 一样.
-----------------------------------
- 切换到v3.0, 并增加一个文件 Hi.java, 并 Add->Commit->Push 到远程仓库
- 注意看Master 主分支,在本地仓库和远程仓库, 都没有Hi.java
- 将v3.0 合并到Master 分支, 注意当前是 Master 主分支(看图标)
- 注意看Master 主分支,这时在本地仓库, 有 Hi.java , 但是远程仓库还没有
- 将本地的Master 分支, Push 到远程仓库, 这时观察远程仓库 Master 下也有HI.java 了
IDEA 项目分支合并, 有冲突的情况
接受某一方, 解决冲突
- 如果同一文件在合并分支时都被修改了则会引起冲突, 修改冲突文件后重新提交
(说明:这时要决定保留哪个分支代码)
- 案例演示/需求说明: 将分支v3.0 合并到 Master 主分支
- 切换到v3.0, 修改 HspErpApplication.java
-
把 HspErpApplication.java 进行 Add->Commit->Push 操作(如果已经 Add 过, 就不需要
Add), 前面老师已经演示好几遍了
-
切 换 到 Master, 也 修 改 一 下 Master 的 HspErpApplication.java , 同 样 进 行
Add->Commit->Push (如果已经 Add 过, 就不需要 Add) 操作.
- 将V3.0 合并到 Master
----------------------------------------------------------
出现冲突
- 观察本地的Master 分支的 HspErpApplication.java , 已经和V3.0 一致了, 但是远程仓库的 Master 还是没有变化, (原因 Master 分支还没有 Push)
-
再将 Master Push 到 Gitee 远程仓库, 就会看到相应的变化(注意在 Push 前, 请确认要
Push 的文件/文件夹是已经 Committed, 否则你看不到变化.)
手动修改,解决冲突
IDEA 项目删除分支
彻底删除某个分支
- 如果某个分支不需要了, 可以删除, 一定要慎重
- 注意观察远程仓库, 分支 V3.0 也没有了
只删除本地分支, 还可以重新获取
注意事项和细节说明
-
如果同一文件在合并分支时都被修改了则会引起冲突, 修改冲突文件后重新提交(说明:这时要决定保留哪个分支代码)
-
Master 主分支应该非常稳定,用来发布新版本,一般情况下不要在上面工作,工作一般在新建的分支(比如dev、v1.0、v2.0)上工作
-
分支代码稳定后,可以合并到主分支 Master
-
在进行分支合并时, 最好是各分支都已经处于 Committed 的状态, 这样可以减小处理合并冲突的难度.
-
Push 操作, 是 Push 你已经Committed 的代码, 如果你修改了一个文件, 但是你没有执行
Commit ,那么你 Push 的其实是上次 Committed 的状态
-
add 、 commit 、push 的操作可以针对单个文件, 也可以针对文件夹(可以看一下 Idea
的 git 操作菜单)
-
文件要 Commit 前需要先 Add 到 暂存区 , 以后文件修改了, 就可以直接 Commit
-
如果要删除文件, 可以在本地删除该文件, 然后 commit 文件所在文件夹即可, 并重新
push 该分支, 那么在远程仓库, 也会删除对应分支的文件.(IDEA 演示)
常用指令
1. 初始化与克隆
-
git init
在当前目录初始化一个新的 Git 仓库。 -
git clone <repository_url>
克隆远程仓库到本地。
2. 查看状态与日志
-
git status
查看工作目录和暂存区的状态,显示哪些文件被修改、暂存或未跟踪。 -
git log
查看提交历史,显示每次提交的详细信息。 -
git log --oneline
以简洁的单行格式显示提交历史。 -
git log --graph
以图形化方式显示分支和合并历史。
3. 添加与提交
-
git add <file>
将文件添加到暂存区,准备提交。 -
git add .
将所有修改的文件添加到暂存区。 -
git commit -m "<message>"
提交暂存区的更改,并附上提交信息。 -
git commit -a -m "<message>"
跳过暂存区,直接提交所有已跟踪文件的更改。
4. 分支操作
-
git branch
列出所有本地分支,当前分支前会有一个*
号。 -
git branch <branch_name>
创建一个新分支。 -
git checkout <branch_name>
切换到指定分支。 -
git checkout -b <branch_name>
创建并切换到新分支。 -
git merge <branch_name>
将指定分支合并到当前分支。 -
git branch -d <branch_name>
删除指定分支。
5. 远程操作
-
git remote -v
查看远程仓库的详细信息。 -
git remote add <name> <url>
添加一个新的远程仓库。 -
git fetch <remote>
从远程仓库获取最新更改,但不合并到当前分支。 -
git pull <remote> <branch>
从远程仓库获取最新更改并合并到当前分支。 -
git push <remote> <branch>
将本地分支的提交推送到远程仓库。 -
git push -u <remote> <branch>
将本地分支推送到远程仓库,并设置上游分支,方便以后直接使用git push
。
6. 撤销与回退
-
git reset <file>
将文件从暂存区移除,但保留工作目录中的更改。 -
git reset --hard
撤销所有未提交的更改,恢复到上一次提交的状态。 -
git checkout -- <file>
撤销对文件的修改,恢复到上一次提交的状态。 -
git revert <commit>
创建一个新的提交,撤销指定提交的更改。
7. 标签
-
git tag
列出所有标签。 -
git tag <tag_name>
在当前提交上创建一个轻量标签。 -
git tag -a <tag_name> -m "<message>"
创建一个带注释的标签。 -
git push <remote> <tag_name>
将标签推送到远程仓库。 -
git push <remote> --tags
将所有标签推送到远程仓库。
8. 其他常用指令
-
git diff
查看工作目录与暂存区之间的差异。 -
git diff --cached
查看暂存区与上一次提交之间的差异。 -
git stash
将当前工作目录的修改暂存起来,方便切换分支。 -
git stash pop
恢复最近一次暂存的修改。 -
git cherry-pick <commit>
将指定提交应用到当前分支。 -
git rebase <branch>
将当前分支的提交“变基”到指定分支上。
9. 配置
-
git config --global user.name "<name>"
设置全局用户名。 -
git config --global user.email "<email>"
设置全局用户邮箱。 -
git config --list
列出当前 Git 配置。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端