1 Git 概述
1.1 Git 与版本控制
- 为什么要版本控制:公司的正式开发中,往往是团队协作进行开发,因此需要进行版本控制
1.2 版本控制工具
集中式版本控制工具
-
例如
CVS
、SVN
、VSS
等 -
优点:每个人可以一定程度上看到项目中别人的进度、管理员管理各个版本比较方便
-
缺点:如果服务器突然宕机,那么这段时间内,所有人都无法工作
分布式版本控制工具
-
例如
Git
、Mercurial
、Bazaar
、Darcs
等 -
当任何一处协同工作的文件发生故障,都可以用其他客户端的本地仓库进行恢复
-
服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
-
每个客户端保存的都是完整的项目(包含历史记录,更加安全)
1.3 Git 工作机制
1.4 代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般称之为 远程仓库
-
基于局域网:
GitLab
-
基于互联网:
GitHub
、Gitee
2 Git 常用命令
2.1 设置用户签名
git
在最初使用之前,需要设置用户签名(只需要设置一次即可),否则无法提交代码
# 设置用户名签名
git config --global user.name 用户名
# 设置邮箱签名(邮箱不一定真实存在,可以为虚拟的)
git config --global user.email 邮箱
2.2 初始化本地库
# 创建本地库文件夹
mkdir test-git
- 然后在项目的根目录,右键打开
git
客户端
# 初始化本地库
git init
2.3 查看本地库状态
- 在一个新创建的本地库中,使用如下命令查看本地库状态
# 查看本地库状态
git status
# 新建一个名为 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
2.5 提交本地库
- 将缓存区的代码提交到本地库
# 将缓存区的 hello.txt 提交到本地库
git commit -m "第一次提交" hello.txt
- 再次使用
git status
命令
- 使用如下命令可以查看提交的版本号与日志
# 查看提交的版本号与日志(简略信息)
git reflog
# 查看提交的版本还与日志(详细信息)
git log
2.6 修改文件
# 修改文件
vim hello.txt
# 查看文件状态
git status
# 将修改添加到暂存区
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 无法替我们决定使用哪一个分支,必须要人为决定新代码的内容
-
修改
master
分支的hello.txt
# 打开 hello.txt 文件
vim hello.txt
# 添加暂存区
git add hello.txt
# 提交本地库
git commit -m "master分支最后一行修改了"
# 查看文件内容
cat hello.txt
# 切换为 first-branch 分支
git checkout first-branch
# 打开 hello.txt 文件
vim hello.txt
# 添加暂存区
git add hello.txt
# 提交本地库
git commit -m "first-branch分支最后一行修改了"
# 查看文件内容
cat hello.txt
# 切换为 master 分支
git checkout master
# 在 master 分支下合并 first-branch 分支
git merge first-branch
# 打开 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 操作
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
远程库,发现代码已经推送成功
5.3.3 拉取远程库到本地库
当我们是团队内开发协作时,别人提交代码之后,远程库与我们自己的本地库已经不同,这个时候就需要将远程库拉取下来
- 我们在最后一行添加一些信息后,点击网页下方的
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 选项,进行项目成员管理
- 然后在该界面,点击
Pending Invite
发送邀请
- 然后被邀请的成员登录自己的账号(这里就是 Miaskl),点击右上角的消息按钮,发现已经收到了其他成员(WuDaoJiuXiao)的邀请,点击该邀请
- 点击
Accept invitation
按钮,接受团队成员的邀请
- 现在已经成功加入了团队项目的远程库中,而且在其他成员的账号中均可以查看到
5.3.6 跨团队协作
这里依然使用我的两个账号模拟,假设副账号(Miaskl)fork
了主账号(WuDaoJiuXiao)的 test
仓库(仓库可见性必须设置为 public
),要进行修改
- 登录副账号(Miaskl),打开想要
fork
的主账号的那个test
仓库,点击右上角的fork
按钮
- 再点击
Create pull requests
- 填写
commit
信息和其他信息之后,点击右下方的提交按钮
- 点击进入该拉取请求,可以看到很详细的修改及留言信息。主账号审核通过之后,点击下方的
Merge pull request
进行拉取请求的合并
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-keygen -t rsa -C skg_xsn@126.com
- 输入上方的命令后,连着按三次回车后,出现如下界面表示秘钥生成成功
- 输入下方的命令,查看生成的 ssh 秘钥
# 查看本机的 ssh 秘钥
cat ~/.ssh/
- 点击侧边栏中的
SSH and GPG keys
,再点击右边的New SSH key
按钮,新建ssh-key
- 出现如下界面,代表秘钥添加成功
6 IDEA 集成 Git
在日常的开发中,我们都会使用电脑本地的 IDE 来进行开发,并且需要频繁地提交代码、修改代码,j就要不断地输入命令,很是繁琐
这就需要 IDE 也要集成
git
功能,只需要点击按钮,即可实现各种Git
操作常用的 IDE 有很多,例如 PyCharm、CLion、IDEA、WebStorm 等等,操作方式都大同小异,这里以 IDEA 创建
Spring
工程为例
6.1 配置忽略文件
6.2 配置 Git 程序
- 点击右边的
Test
测试,当出现 Git 版本时,表示设置成功
6.3 初始化&添加&提交
-
到目前为止,我们的项目还没有被
git
所接管(即还未进行git init
) -
依次点击 IDEA 菜单栏的
VCS
—>Import into Version Control
—>Create Git Reposity...
,选择项目的根目录,初始化 git 仓库
- 然后右击项目根目录,依次点击
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
账户
- 点击左侧边栏的
Personal access tokens
,然后点击右上角的Generate new Token
按钮
- 在弹出的页面中,为自己的
Token
起一个名字,Token
有效期选择永久no expiration
,然后剩下的选项建议全部勾选,最后点击页面最下方的Generate token
按钮,生成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 拉取代码到本地
- 在 IDEA 中依次点击
VCS
—>Git
—>pull
,准备拉取代码
- 这里选择使用
ssh
方式拉取,点击pull
进行拉取
- 拉取成功后,发现 IDEA 中的代码已经与远程库同步
7.5 克隆代码到 IDEA
- 在弹出的框中粘贴刚才复制的项目链接,点击
Clone
- 项目克隆成功!