Git 学习笔记
1 Git 概述
1.1 Git 与版本控制
-
Git 是什么:是一个免费的、开源的、分布式的,版本控制系统,可以快速高效地处理从小到大的所有项目
-
何为版本控制:
-
版本控制是一种记录文件内容变化,一遍将来查阅特定版本修订情况的系统
-
版本控制最重要的就是可以记录文件修改历史记录,从而让用户可以查看历史版本,方便版本之间的切换
- 为什么要版本控制:公司的正式开发中,往往是团队协作进行开发,因此需要进行版本控制
1.2 版本控制工具
集中式版本控制工具
-
例如
CVS
、SVN
、VSS
等 -
所有文件的修订版本都交由一个单一的服务器进行版本控制
-
优点:每个人可以一定程度上看到项目中别人的进度、管理员管理各个版本比较方便
-
缺点:如果服务器突然宕机,那么这段时间内,所有人都无法工作
分布式版本控制工具
-
例如
Git
、Mercurial
、Bazaar
、Darcs
等 -
客户端提取的不是版本的文件快照,而是整个代码仓库
-
当任何一处协同工作的文件发生故障,都可以用其他客户端的本地仓库进行恢复
-
服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
-
每个客户端保存的都是完整的项目(包含历史记录,更加安全)
1.3 Git 工作机制
-
如果代码在工作区(磁盘上的项目文件夹)中,那么修改代码就是修改了,删除就是删除了,不会生成历史版本
-
如果使用
git add
将代码添加到了暂存区,那么与工作区类似,也不会生成历史版本 -
如果使用
git commit
将代码提交到了本地库,那么就会生成一个历史版本 -
如果使用
git push
将代码推送到了远程库,那么就会在云端生成一个历史版本(若仓库开源,该版本将对所有互联网人可见)
1.4 代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般称之为 远程仓库
-
基于局域网:
GitLab
-
基于互联网:
GitHub
、Gitee
2 Git 常用命令
2.1 设置用户签名
git
在最初使用之前,需要设置用户签名(只需要设置一次即可),否则无法提交代码
# 设置用户名签名
git config --global user.name 用户名
# 设置邮箱签名(邮箱不一定真实存在,可以为虚拟的)
git config --global user.email 邮箱
2.2 初始化本地库
- 首先在本地建立一个文件夹用来存放项目的代码(这里命名为
test-git
)
# 创建本地库文件夹
mkdir test-git
- 然后在项目的根目录,右键打开
git
客户端
- 使用如下命令初始化
git
本地库,会在本地库根目录下生成一个.git
文件夹(windows 下默认隐藏,需要打开显示隐藏文件选项)
# 初始化本地库
git init
2.3 查看本地库状态
- 在一个新创建的本地库中,使用如下命令查看本地库状态
# 查看本地库状态
git status
- 出现如下界面,说明仓库中没有东西可以去提交(仓库什么代码都没有,就一个
.git
文件夹,即本地库的初始状态)
- 我们使用
vim
命令,随意新建一个文件
# 新建一个名为 hello.txt 的文件
vim hello.txt
- 然后再次使用如下命令查看本地库状态
# 查看本地库状态
git status
根据输出的信息我们知道,已经有一个未被 git
追踪的文件 hello.txt
生成了
2.4 添加暂存区
- 将上面的
hello.txt
添加到暂存区,被git
追踪到
# 将 hello.txt 文件添加到暂存区
git add hello.txt
出现的警告不用理会,这是 Windows
下的换行符转化为 Linux
下换行符的警告,无关紧要
- 再次使用
git status
查看本地库状态,此时文件hello.txt
已经存在于暂存区中
- 上面提到过,暂存区中的文件是可以删除的,使用如下命令可以删除
# 删除暂存区中的 hello.txt 文件
git rm --cached hello.txt
- 从暂存区删除之后,再次使用
git status
,发现hello.txt
只是从暂存区中被删除,而工作区中依然存在该文件
- 我们再次将该文件添加到暂存区中,进行后续学习
2.5 提交本地库
将文件添加到暂存区之后,接着就是将暂存区的文件添加到本地库
- 将缓存区的代码提交到本地库
# 将缓存区的 hello.txt 提交到本地库
git commit -m "第一次提交" hello.txt
- 再次使用
git status
命令
- 使用如下命令可以查看提交的版本号与日志
# 查看提交的版本号与日志(简略信息)
git reflog
# 查看提交的版本还与日志(详细信息)
git log
2.6 修改文件
- 打开
hello.txt
文件,修改一下该文件
# 修改文件
vim hello.txt
- 然后查看该文件的状态,信息显示
hello.txt
文件已经被修改
# 查看文件状态
git status
- 我们将修改添加到暂存区,然后再使用
commit
进行提交,提交后再次查看日志,发现已经有两个版本了
# 将修改添加到暂存区
git add hello.txt
# 查看提交状态
git status
# 二次提交代码到本地库
git commit -m "第二次提交" hello.txt
# 查看版本信息及日志
git reflog
2.7 历史版本
2.7.1 查看历史版本
前边已经介绍过,就以下两个命令
# 查看提交的版本号与日志(简略信息)
git reflog
# 查看提交的版本还与日志(详细信息)
git log
2.7.2 版本穿梭
版本穿梭的实质:GIt 在移动底层的 HEAD 指针
假设现在,我觉得第三版本修改的内容不合适,想回退到二号版本,可以按照如下步骤操作
- 首先查看所有的版本信息,可以看到,目前
master
分支指向的是第三个版本
# 查看版本信息
git reflog
- 将想要穿梭的版本号进行复制(这里想穿梭到第二个版本,版本号为
84c10a2
),然后使用如下命令进行穿梭
# 版本穿梭
git reset --hard 84c10a2
# 查看日志信息
git reflog
3 Git 分支操作
3.1 什么是分支
-
在版本控制过程中,同时推进多个任务,我们就可以为每个任务,创建单独的分支
-
使用分支,程序员可有将自己的工作从开发主线上分离出来,开发自己的分支,并不影响主线分支的运行
-
一个分支,就是一个简单的副本(分支的底层,也是指针的引用)
3.2 为什么使用分支
-
使用分支后,可以同时并行推进多个功能的开发,提高开发效率
-
各个分支开发过程中,如果某分支开发失败,不会对其他分支有任何影响
-
失败分支删除重新开始即可
3.3 分支基本操作
3.3.1 查看分支
# 查看分支
git branch -v
3.3.2 创建分支
# 创建一个名为 first-branch 的分支
git branch first-branch
3.3.3 切换分支
# 切换到 first-branch 分支
git checkout first-branch
3.3.4 修改分支
# 使用 vim 打开 hello.txt
vim hello.txt
# 修改之后,添加暂存区,提交本地库
git add hello.txt
git commit -m "first-branch 分支第一次提交"
3.3.5 分支正常合并
在之前我们只对 first-branch
分支进行了修改,而 master
分支没有进行任何修改,现在将 first-branch
分支合并到 master
分支上
这就属于就属于正常合并(当前分支未修改,另一个分支修改了)
# 切换当前分支为 master
git chekout master
# 合并 first-branch 分支到 master 分支上
git merge first-branch
3.3.5 分支冲突合并
Q:为什么会产生代码冲突?
A:在开发时,若对于同一文件同一位置,产生了几个完全不同的修改,此时 git 无法替我们决定使用哪一个分支,必须要人为决定新代码的内容
-
首先我们要创造一个冲突的情况。根据之前的操作下,
first-branch
分支与master
分支是完全相同的情况 -
接下来我们在两个分支的
hello.txt
文件的同一位置(假设为最后一行末尾处),添加不同的信息 -
修改
master
分支的hello.txt
# 打开 hello.txt 文件
vim hello.txt
# 添加暂存区
git add hello.txt
# 提交本地库
git commit -m "master分支最后一行修改了"
# 查看文件内容
cat hello.txt
- 切换分支为
first-branch
,继续修改文件、添加暂存区、提交本地库
# 切换为 first-branch 分支
git checkout first-branch
# 打开 hello.txt 文件
vim hello.txt
# 添加暂存区
git add hello.txt
# 提交本地库
git commit -m "first-branch分支最后一行修改了"
# 查看文件内容
cat hello.txt
-
此时,已经在同文件同位置出现了完全不同的修改,产生了冲突
-
接下来,我们切换回
master
分支,在master
分支下,合并first-branch
分支
# 切换为 master 分支
git checkout master
# 在 master 分支下合并 first-branch 分支
git merge first-branch
- 合并分支产生了冲突,我们打开
hello.txt
文件,发现文件内容发生了变化
# 打开 hello.txt 文件
vim hello.txt
- 接下来就需要我们去人为修改文件内容了(这里我将两行都保留),最终修改结果如下
- 保存文件修改,添加暂存区,提交本地库
# 添加暂存区
git add hello.txt
# 提交本地库(此时,commit 命令之后不能带文件名,否则会让 git 无法抉择该合并哪个分支的文件)
git commit -m "合并分支冲突"
- 要注意的是,合并操作只会修改当前分支,不会修改另外的分支
# 查看 master 分支下的 hello.txt
cat hello.txt
# 切换分支为 first-branch
git checkout first-branch
# 查看 first-branch 分支下的 hello.txt
cat hello.txt
4 Git 团队协作机制
4.1 团队内协作
假设:老师给学生布置了作业,老师只写了作业的题目,要求学生远程完成题目的内容
-
老师在自己的本地库写好题目之后,使用
git push
命令,将作业推送到远程库(步骤 1) -
学生使用
git clone
命令将远程库中老师推送的题目完整克隆下来,就拿到了完整的作业题目(步骤 2) -
学生完成了题目,然后从自己的本地库中使用
git push
命令,将已经完成的作业推送到远程库(步骤 3) -
老师现在可以使用命令
git pull
命令,将远程库的代码拉取到自己的本地库,就可以完整的看到学生已经完成的作业(步骤 4)
以上,就是团队内部协作的原理
4.2 跨团队协作
假设:老师给学生布置了作业,但是学生不会做,所以想去校外找外援帮助自己完成作业
-
学生使用
git push
命令,将自己本地库的代码提交到自己的远程库(步骤 1) -
外援是外校的,不可能直接加入学生所在的团队,因此要使用
fork
功能,将学生的远程仓库复制了一个分支到自己的远程库(步骤 2) -
外援将复制过来的作业,从自己的远程库使用
git clone
克隆到自己的本地库(步骤 3) -
外援不负众望,完成了作业,然后使用
git push
推送代码到自己的远程库(步骤 4) -
然后外援向学生的远程库提交请求
pull request
,请求验收成果(步骤 5) -
学生审核外援的成果是否合格(步骤 6)
-
审核通过,学生使用
git merge
命令将外援的仓库分支合并到自己的远程仓库中来(步骤 7) -
最后,学生使用
git pull
命令将已经完成的作业,从远程库拉取到本地库,至此,作业已经完成(步骤 7)
以上,就是跨团队协作的基本流程
5 Github 操作
Github:全球最大的代码托管平台(同性交友网站)
5.1 注册账号
- 打开管网之后,点击右上角的登录按钮
- 有账号的直接登录,没有账号的点击下方的注册按钮
- 然后就是用户名、密码、邮箱、验证什么的,一路
continue
即可
- 加下来填入发送给我们注册邮箱的验证码,接下来是个人偏好信息等选项,随意填写即可
5.2 创建远程库
- 进入个人主页后,点击右上角的按钮来创建一个新的远程库
- 填入仓库名、仓库的私有与否,点击最下方的创建按钮(此处创建名为 test 的远程库)
- 创建好之后初始界面如下
5.3 远程仓库操作
5.3.1 创建远程库别名
一般情况下,我们远程库的地址都太长了不好记忆,因此需要为仓库创建一个别名来方便我们的记忆
- 首先可以使用如下命令来查看当前的所有别名(仓库刚创建是没有别名的)
# 查看所有别名
git remote -v
- 使用如下命令,创建远程库别名
# 为远程库创建名为 test-git 的别名(此处选择 ssh 方式)
# 此处的 git@github.com:WuDaoJiuXiao/test.git 为我们新创建的远程库的地址
# 若没有配置 ssh 秘钥,这里请选择 https
# ssh 具体操作详见 ——> 5.3.7 ssh 免密登录
git remote add test-git git@github.com:WuDaoJiuXiao/test.git
# 查看所有别名
git remote -v
5.3.2 推送本地库到远程库
远程库创建好之后,就应该将本地库的代码推送到远程库了
- 使用如下命令进行代码推送
# 推送本地库的代码到远程库的 master 分支
# 推送语法 git push 别名 分支
git push test-git master
- 如果是第一次使用
Github
,在进行推送的时候,会弹出如下框让我们授权登录,选择浏览器登录
- 然后出现如下授权页面,等待授权成功后,会发现我们已经成功推送代码到远程库了
- 然后打开我们的
Github
远程库,发现代码已经推送成功
5.3.3 拉取远程库到本地库
当我们是团队内开发协作时,别人提交代码之后,远程库与我们自己的本地库已经不同,这个时候就需要将远程库拉取下来
- 模拟一下环境,我们直接在远程库的网页端修改
hello.txt
文件内容。点击hello.txt
,然后点击修改按钮
- 我们在最后一行添加一些信息后,点击网页下方的
commit changes
进行提交
- 然后我们去本地库进行远程库的拉取
# 拉取远程库的 master 分支代码到本地库
# 拉取语法 git pull 别名 分支
git pull test-git master
5.3.4 克隆远程库到本地
有时候我们看见优秀的开源项目,想下载下来自己学习,这个时候就用到了克隆命令
- 这里以
RuoYi
项目为例,赋值该项目的远程库地址(https 和 ssh 均可,ssh 操作方式详见 5.3.7)
- 使用克隆命令进行克隆(克隆项目不需要登录)
# 克隆仓库到本地
git clone git@github.com:yangzongzhuan/RuoYi.git
5.3.5 团队内协作
在公司的日常开发中,一般都需要同一个团队合作开发一个项目,那么怎么进行团队协作?
这里以我的两个账号为例进行演示(主账号:WuDaoJiuXiao; 副账号:Miaskl)
- 在主账号(WuDaoJiuXiao)的
test
仓库页面,点击上方的setting
选项
- 点击侧边栏的 Collaborators 选项,进行项目成员管理
- 在该页面依次
Add People
按钮,然后在搜索框输入将要邀请的成员名(这里为 Misskl),点击搜索出来的用户,然后点击蓝色确认按钮
- 然后在该界面,点击
Pending Invite
发送邀请
- 然后被邀请的成员登录自己的账号(这里就是 Miaskl),点击右上角的消息按钮,发现已经收到了其他成员(WuDaoJiuXiao)的邀请,点击该邀请
- 点击
Accept invitation
按钮,接受团队成员的邀请
- 现在已经成功加入了团队项目的远程库中,而且在其他成员的账号中均可以查看到
5.3.6 跨团队协作
这里依然使用我的两个账号模拟,假设副账号(Miaskl)fork
了主账号(WuDaoJiuXiao)的 test
仓库(仓库可见性必须设置为 public
),要进行修改
- 登录副账号(Miaskl),打开想要
fork
的主账号的那个test
仓库,点击右上角的fork
按钮
- 副账号 fork 之后,就可以修改里面的代码了(这里在 hello.txt)最后一行加上一点信息
- 修改好代码之后,需要进行拉取请求。副账号点击仓库上面的
pull requests
栏目,再点击New pull requests
按钮,创建新的拉取请求
- 再点击
Create pull requests
- 填写
commit
信息和其他信息之后,点击右下方的提交按钮
- 然后登录主账号,主账号的
test
仓库就会有一个拉取请求
- 点击进入该拉取请求,可以看到很详细的修改及留言信息。主账号审核通过之后,点击下方的
Merge pull request
进行拉取请求的合并
- 到此为止,跨团队协作的基本流程结束,可以看到,主账号的
test
仓库中,代码内容已经修改了
5.3.7 免密 SSH 登录
Github 的链接有两种,https
方式和 ssh
方式,两者有什么区别呢?
-
https
方式-
优点:更加的简单易用,只要知道仓库的
https
地址,就可以很轻松的进行除过push
以外的所有操作 -
缺点:如果要频繁的进行操作(如
pull
),就需要不断地进行网页账户认证(即 5.3.2 中的 2 步骤)
-
-
ssh
方式-
优点:更加的灵活,只要在一台电脑上设置了
ssh
秘钥,并且该秘钥被某个Github
账户保存了,那么就可以无限次的进行各种操作,而不需要每次都要网页认证 -
缺点:需要我们手动去设置
-
- 在任意位置打开
git
命令行,首先检验此电脑是否已经有ssh
公钥
# 显示电脑家目录下所有文件夹(包括隐藏文件夹)
ls ~ -la | grep ^d
-
看输出目录中是否有
.ssh/
文件夹,如果有则说明已经有了ssh
公钥了,直接跳到步骤 -
因为我一直使用的就是 ssh 方式,这里为了演示,我将它删除,再次查看,发现删除成功,继续配置 ssh 秘钥
- 再次在命令行输入如下命令,生成 ssh 公钥
# 生成 ssh 公钥,最后的那个邮箱,随意填写即可,只是一个标注信息
ssh-keygen -t rsa -C skg_xsn@126.com
- 输入上方的命令后,连着按三次回车后,出现如下界面表示秘钥生成成功
- 输入下方的命令,查看生成的 ssh 秘钥
# 查看本机的 ssh 秘钥
cat ~/.ssh/
-
秘钥生成完毕,该页面不要关闭,留待备用
-
然后打开自己的
Github
主页,点击主页右上角头像里的设置按钮,进入设置页面
- 点击侧边栏中的
SSH and GPG keys
,再点击右边的New SSH key
按钮,新建ssh-key
- 给 SSH 秘钥起一个容易记住的名字填入
title
一栏,在key
一栏中,将步骤 6 中输出的 ssh 秘钥完整的赋值粘贴到这里,然后点击下方的添加按钮
- 出现如下界面,代表秘钥添加成功
- 测试一下 SSH 秘钥是否生效,分别尝试一下
pull
和push
功能,均正常,ssh 秘钥添加成功!
6 IDEA 集成 Git
在日常的开发中,我们都会使用电脑本地的 IDE 来进行开发,并且需要频繁地提交代码、修改代码,j就要不断地输入命令,很是繁琐
这就需要 IDE 也要集成
git
功能,只需要点击按钮,即可实现各种Git
操作常用的 IDE 有很多,例如 PyCharm、CLion、IDEA、WebStorm 等等,操作方式都大同小异,这里以 IDEA 创建
Spring
工程为例
6.1 配置忽略文件
-
项目中的一些无关紧要的文件都是不需要上传远程库的,因此需要让
git
在上传时忽略这些文件 -
在项目根目录创建一个名为
.gitignore
的文件,在里面写上要让git
忽略的文件、文件夹(被 git 忽略并接管后,这些文件会变成灰色)
6.2 配置 Git 程序
-
点击 IDEA 左上角的
File
—>Setting
,打开设置面板 -
在左边找到版本控制中的
Git
栏目,右边选择Git
的安装路径中/bin
目录下的git.exe
程序
- 点击右边的
Test
测试,当出现 Git 版本时,表示设置成功
6.3 初始化&添加&提交
-
到目前为止,我们的项目还没有被
git
所接管(即还未进行git init
) -
依次点击 IDEA 菜单栏的
VCS
—>Import into Version Control
—>Create Git Reposity...
,选择项目的根目录,初始化 git 仓库
- 初始化完成之后,可以看到,一部分文件变成了红色(未被 git 追踪的,还在工作区,未被添加到暂存区),一部分变成了灰色(被 git 忽略的),说明项目已经被
Git
接管
- 现在将红色的文件添加到暂存区,右击项目目录,依次点击
Git
—>Add
- 此时看到,红色的文件已经变绿,这说明已经添加到了暂存区,未被提交到本地库
- 然后右击项目根目录,依次点击
Git
—>Commit Directory...
,准备提交本地库
- 在弹出的框中,输入
commit
的信息,点击提交
- 现在再去看项目文件,发现文件已经回复正藏的颜色,说明提交本地库成功
6.4 切换版本
- 首先我们创造出几个版本,然后点击 IDEA 左下角的
Git
,在Log
栏目中,就可以查看版本信息
- 然后在要切换的版本号上右键,选择
Checkout Revision xxxx
切换版本
- 切换之后发现,
master
指针已经指向了新的版本号,对应的代码也已经改变
6.5 创建分支
- 点击 IDEA 的右下角图示图标,选择
New Branch
来创建新的分支
- 此时看右下角,分支已经被切换
- 再次切换回
master
分支只需要再次点击该图标,选择master
分支即可
6.6 正常合并分支
在 master
分支中,点击右下角的图标,选择要合并的分支,点击 Merge into Current
合并分支
6.7 冲突合并分支
- 当合并分支时产生了代码冲突,就会弹出如下界面,需要我们手动去指定合并的内容
- 点击
Merge...
按钮,手动进行合并,合并分支的界面共有以下三个部分
- 手动合并完成后,点击右下方的
Apply
应用修改,分支合并完成
7 IDEA 集成 Github
7.1 IDEA 连接 Github
- 在 IDEA 中点击
File
—>Setting
,打开设置面板。然后点击Version Control
—>Github
,点击右边的加号添加Github
账户
- 在弹出的框里输入你的
Github
登录账户名和密码,点击Login
登录,几乎都会出现无效,登录失败的情况(这是非常常见的问题,毕竟国外的网站,要是直接登陆成功,恭喜你,这个环节完成了)
-
HTTP 方式无法登录,这里只能选择
Token
登录,首先要生成一个Token
-
进入自己的
Github
主页,右上角点击Setting
,进入设置页面
- 在设置页面,滑到最底下,点击
Developer settings
,进入开发者设置页面
- 点击左侧边栏的
Personal access tokens
,然后点击右上角的Generate new Token
按钮
- 在弹出的页面中,为自己的
Token
起一个名字,Token
有效期选择永久no expiration
,然后剩下的选项建议全部勾选,最后点击页面最下方的Generate token
按钮,生成Token
- 点击复制图标,复制生成的
Token
令牌(一定要保存好,上面蓝色框信息已经说明,该Token
只会显示一次!!!)
- 在 IDEA 中刚才的
Github
登录页面,点击右上角的use token
- 输入
Token
之后,再次点击Login In
,这次可以成功登陆了。然后点击OK
,保存设置,IDEA 连接Github
成功
7.2 分享项目到 Github
- 依次点击 IDEA 菜单栏的
VCS
—>Import into Version Control
—>Share Project on Github
- 填写项目相关信息,点击
Share
分享项目
- 打开
Github
,项目已经成功分享
7.3 推送代码到远程库
- 随意修改一下项目,增加或删除一点代码,并且添加暂存区、提交本地库
- 然后依次点击
VCS
—>Git
—>Push
,准备推送远程库
- 出现如下界面,先不急。若此时点击提交,会使用 https 的方式,但是
Github
的网络时好时坏,为了稳定,这里需要使用ssh
方式推送
- 去
Github
仓库复制该项目的ssh
链接
- 点击我们设置的项目别名,弹出的框点击
Define remote
- 在弹出的框中输入刚刚复制的远程库
SSH
地址,点击确定,等待校验完成
- 校验完成后,点击
Push
进行推送,这样就不会因为网络问题而推送失败,推送成功后 IDEA 右下角会弹出成功的信息,打开浏览器确认推送成功
7.4 拉取代码到本地
- 首先在远程库修改一下仓库代码,我们在
UserController
中添加如下代码后保存修改
- 在 IDEA 中依次点击
VCS
—>Git
—>pull
,准备拉取代码
- 这里选择使用
ssh
方式拉取,点击pull
进行拉取
- 拉取成功后,发现 IDEA 中的代码已经与远程库同步
7.5 克隆代码到 IDEA
- 仍然以
RuoYi
项目为例,首先赋值该项目的ssh
链接,重启 IDEA,在启动页面,点击第三个Get from Version Control
- 在弹出的框中粘贴刚才复制的项目链接,点击
Clone
- 项目克隆成功!