Git的学习与使用
一、Git 概述
1.1、Git 概述
1、Git是目前世界上最先进的分布式版本控制系统。
记录了每次修改的:版本,内容,操作用户,修改时间,文档名等。
2、Git 和 Github
的区别
Git是一个分布式版本控制系统,简单的说就是一个软件,用于记录一个或若干文件内容变化,以便来查阅特定版本修订情况的软件。
Github
是一个为用户提供Git服务的网站,简单说就是一个可以放代码的地方(也可以放其他内容)。
Github
除了提供管理Git的web界面外,还提供了【订阅、关注、讨论组】在线编辑器等丰富的功能。
目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。
本例使用了 Gitee
作为远程仓库。
1.2、Git 与 SVN 对比
1、SVN
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器哪里得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。
集中式版本控制系统是必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就郁闷了。
下图就是标准的集中式版本控制工具管理方式:
集中管理方式在一定程度上看到其他开发人员在干什么,而管理员也可以很轻松掌握每个人的开发权限。
但是相较于其优点而言,集中式版本控制工具缺点很明显:
- 服务器单点故障
- 容错性差
2、Git
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。
既然每个人的电脑都有一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
下图就是分布式版本控制工具管理方式:
1.3、Git 工作流程
一般工作流程如下:
- 从远程仓库中克隆 Git 资源作为本地仓库。
- 从本地仓库中
checkout
代码然后进行代码修改 - 在提交前先将代码提交到暂存区。
- 提交修改。提交到本地仓库。本地仓库中保存修改的各个历史版本。
- 在修改完成后,需要和团队成员共享代码时,可以将代码push到远程仓库。
下图展示了 Git 的工作流程:
1、团队内协作
2、跨团队协作
3、Git 结构
二、Git 命令行操作
2.1、本地库初始化
在需要进行版本控制的位置,打开命令行窗口,使用
git init
初始化本地库
1 | git init |
之后,在该目录下会出现一个
.git
隐藏文件夹
注意:
.git
目录中存放的是本地库相关的子目录和文件,不要随意改动和删除。
.git
目录被称为本地库,存放本地库的目录称为工作目录
- 设置签名
形式:
- 用户名:Tom
- Email 地址:xxx@qq.com
作用:区分不同开发人员身份。
这里的签名和远程库的账号密码没有关系。
- 命令
- 项目/仓库级别
仅在当前本地库范围有效
1 | git config |
- 系统用户级别
登录当前操作系统的用户范围
1 | git config --global |
2.2、基本操作
- git status 状态查看
查看工作区、暂存区状态
1 | git status |
git add [fileName]
添加
将工作区的“新建/修改”添加到暂存区
- 在工作目录下创建一个
hello.txt
文件,随便输入点内容 - 此时再次使用
git status
查看状态
- 使用
git add
提交文件到暂存区
1 | git add hello.txt |
- 此时再次查看状态
此时可以使用
git rm --cached [fileName]
将文件从暂存区中撤出。
- 将文件撤出暂存区
1 | git rm --cached hello.txt |
git commit -m "commit message" [file name]
将暂存区的内容提交到本地库
提交存放在暂存区中的
hello.txt
文件
1 | git commit hello.txt |
此时进入此界面
对于此时提交,你需要关于本次提交的日志,修改了哪里,更新了什么,达到了什么目的。
这是一个
vim
编辑器
按
esc
,然后输入:wq
退出
此时再次查看状态
此时修改
hello.txt
中的数据,然后再次查看状态
再次添加提交
提交时可以在命令中直接写入日志信息,添加 -m 参数即可。
1 | git commit -m "本次提交修改的内容..." hello.txt |
git log
查看历史记录
1 | git log |
查看版本记录
2.3、使用 Git 实现版本的后退
- 使用
git log --pretty=oneline
展示简洁的版本记录
1 | git log --pretty=oneline |
- 使用
git reflog
展示日志及版本信息
1 | git reflog |
HEAD@{0} 表示当前版本(从当前版本移动到该版本需要0步)
HEAD@{1} 表示从当前版本移动到该版本需要一步。
HEAD@{到当前版本需要移动的步数}
- 前进后退版本的本质
git 有一个指针,通过指针移动来实现版本的前进和后退。
- 执行版本前进后退【推荐】
1 | git reset --hard [版本索引值] |
回退到索引值为:0787eef 的版本
1 | git reset --hard 0787eef |
查看
hello.txt
回到第二个版本
1 | git reset --hard ce190c4 |
- 使用 ^ 符号
只能后退版本。
git reset --hard HEAD^
表示后退一个版本 ,可以加多个 ^ 回退多个版本
1 | git reset --hard HEAD^ |
- 使用 ~ 符号
用于后退版本
1 | git reset --hard HEAD~n |
后退 n 个版本。
2.4、reset 命令的三个参数对比
- –sort 参数
- 仅仅在本地库移动 HEAD 指针
- –mixed 参数
在本地库移动 HEAD 指针
重置暂存区
- –hard 参数
在本地库移动 HEAD 指针
重置暂存区
重置工作区
2.5、永久删除文件后找回
创建一个
temp.txt
文件,并推送到本地库
删除工作目录中的
temp.txt
文件
1 | rm -rf temp.txt |
再查看当前状态
将该删除操作 add 给暂存区,这里仍然使用 add
1 | git add temp.txt |
向本地库中推送该 删除操作
1 | git commit -m "提交删除" temp.txt |
- 要找回被永久删除的操作,只需要回滚到该文件没有被删除之前的版本即可。
查看历史记录
1 | git reflog |
这个时候我们只需要回滚到索引值为
9f549b1
的版本即可。
1 | git reset --hard 9f549b1 |
此时再使用
ls - l
查看文件,可以看到temp.txt
被找回
- 找回被删除文件的前提
删除前,文件存在时的状态被提交到了本地库。
使用
git reset --hard [指针位置]
- 如果删除操作已经提交到本地库:指针位置指向历史记录。
- 如果删除操作尚未提交到本地库:指针位置使用 HEAD
1 | git reset --hard HEAD |
2.6、比较文件
修改
temp.txt
文件,此时查看状态
使用命令比较文件。
1 | git diff |
git diff [文件名]
将工作区的文件和暂存区文件进行比较。
git diff [本地库中历史版本] [文件名]
将工作区中的文件和本地库历史记录比较
git diff
不带文件名比较多个文件
2.7、分支管理
1、什么是分支?
在版本控制过程中,使用多条线同时推进多个任务。
2、分支的好处
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
3、分支操作
- 创建分支
git branch [分支名]
创建一个
hot_fix
分支
1 | git branch hot_fix |
- 查看分支
git branch -v
查看所有分支,使用
git branch -v
查看
1 | git branch -v |
绿色分支表示当前正在使用的分支
- 切换分支
git checkout [分支名]
切换分支到
hot_fix
1 | git checkout hot_fix |
- 合并分支
合并分支步骤如下
- 切换到接收修改的分支上(如果需要将 a 分支合并到 b 分支上,那么必须切换到 b 分支)
- 执行 merge 命令
git merge [要合并到当前分支的分支名]
在
hot_fix
分支下修改temp.txt
文件,然后提交到本地库中,再次查看分支信息
如果我们想把
hot_fix
分支合并到master
分支,那么我们当前所在的分支必须为master
,所以现在我们切换分支为master
1 | git checkout master |
在
master
分支上执行git merge hot_fix
命令
1 | git merge hot_fix |
查看
temp.txt
文件的内容
- 解决合并分支时产生的冲突
编辑文件,删除特殊符号
将产生冲突文件修改到满意程度,保存退出
使用
git add [文件名]
使用
git commit -m "日志信息"
这里的
git commit
后面不能附带文件名
修改
temp.txt
文件中的某一行,然后提交到本地库。切换到
hot_fix
分支,然后修改temp.txt
文件中的同一行数据,提交到本地库由于这个时候两个分支修改的是同一个文件的同一行,所以 merge 时会产生冲突。
再次切换回 master 分支,进行合并
1 | git merge hot_fix |
此时提示自动合并失败,所以我们需要手动合并,此时我们可以看到命令行中不只是展示 master 分支,而是 master | MERGING
查看产生冲突的
temp.txt
文件,可以看到冲突的表现
编辑产生冲突的
temp.txt
文件,删除 特殊符号,留下自己觉得需要保留的数据(此时需要和另外一个分支的作者进行商量),保存退出。
使用
git add [产生冲突的文件名]
将解决冲突后的内容提交到暂存区
1 | git add temp.txt |
此时直接使用
git commit
继续进行分支合并,这个时候不能添加文件名。
1 | git commit |
2.8、测试远程交互
1、创建一个新的本地库
创建一个新的本地库
wuhu
,使用git init
初始化
新建一个
temp.txt
,填入测试内容后推送到本地仓库在
gitee
上创建一个仓库在
git
上为我们创建的远程仓库起一个别名,我们需要先获取该仓库在gitee
上的地址。
1 | https://gitee.com/sutianxin/git_study.git |
- 使用
git remote add origin https://gitee.com/sutianxin/git_study.git
起别名
上面的命令为
https://gitee.com/sutianxin/git_study.git
起了个 origin 别名
1 | git remote add origin https://gitee.com/sutianxin/git_study.git |
- 使用
git remote -v
查看仓库和别名的对应关系
2、执行推送
- 使用
git push [远程仓库别名] 要推送的分支
来进行推送操作 - 推送本地库到 远程仓库
git_study
1 | git push origin master |
查看远程仓库
3、从远程库 clone 代码
git clone 做了以下三件事
- 完整将远程库下载到本地。
- 创建 origin 远程地址别名
- 初始化本地库
- 使用
git clone [远程仓库地址]
克隆远程仓库
1 | git clone https://gitee.com/sutianxin/git_study.git |
克隆之后的工作目录里面直接有
.git
目录, git 在克隆时直接帮我们初始化了。
4、邀请其他成员进入团队
如果没有进入团队直接
push
代码到远程库会报403
在
gitee
中演示邀请成员
进入以下页面
此时就可以进行远程推送。
5、远程库的拉取
pull = fetch + merge
git fetch [远程库地址别名] [远程分支名]
git merge [远程地址别名] / [远程分支名]
pull (拉取) 其实分为两个操作,分别为:
pull 和 fetch 不需要权限。
- fetch
- merge
在
gitee
上直接修改temp.txt
文件内容fetch 远程仓库的内容
1 | git fetch origin master |
- fetch 后并没有直接修改本地库文件,我们可以查看
temp.txt
- 使用 merge 合并远程分支
1 | git merge origin/master |
- 现在查看 本地的
temp.txt
文件
6、推送冲突文件
- 如果不是基于 GitHub 远程库的最新版所做的修改,不能推送,必须先拉取。
如果有两个人修改了同个文件的同个位置,那么只有先推送的可以推送成功,后推送的需要先将远程库拉取到自己的本地库,然后再次进行推送。
- 拉取下来后如果进入冲突状态,则按照“分支冲突解决”操作解决即可。
2.9、跨团队协作
使用 fork + pull request + merge 来实现跨团队协作。
1、fork 远程仓库
在要 fork 的远程仓库中点击
fork
即可将该仓库克隆到自己的远程账号
新建一个 pull request
在该页面中提交pull request,然后由原仓库所有者进行审核。
三、在 IDEA 中使用 Git
3.1、使用 IDEA 创建 Git 本地库
在上面的选项栏中,点击 VSC ->
Import into Version Control
(导入版本控制) ->Create Git Repository
(创建本地仓库)。此时
IDEA
会让我们要添加本地库的目录
选择后该项目的文件变色了。
同时
grain
目录下出现了一个.git
文件夹。
3.2、选择不提交到本地库的文件
在不打算提交的文件/目录中直接右键 –> Git –> 添加到
gitignore
3.3、将项目添加到暂存区
在项目/模块中点击右键 –> Git –> Add,将项目添加到暂存区,添加后可以看到项目文件变为绿色
在项目/模块中点击右键 –> Git –> Commit Directory,提交到本地库,或者直接点击 Idea 文件的按钮即可。
输入日志,提交
可以看到正在分析代码
3.4、使用 IDEA 进行版本切换
1、先复制要回退的版本的哈希值
在历史记录中选择要回退的版本,右击后选择
复制修订号
2、在模块中回退版本
右击模块–>Git–>Repository–>Reset HEAD,在To Commit处输入复制的修订号 b39036c13fcfb3eae8604edf15e1c45da0a1ba37
然后选择重置即可。
3.5、创建分支及合并分支
1、创建分支
在 git –> Repository –>
branchs
可以查看分支,添加分支
点击新建分支即可创建新分支
2、切换分支
点击检出(checkout)即可
3、合并分支
Git –>
Merge Changes
,选择要合并的分支,合并即可。
3.6、解决冲突
出现冲突的文件
此时 IDEA 会弹出一个框,框中有三个选项
- 使用你的
- 使用他的
- 你自己手动进行合并,排除冲突
点击
Merge
后会出现以下情况
3.7、将本地库推送到 Gitee
远程仓库上
1、创建仓库,复制远程地址
最好复制
Https
地址。
2、推送到远程仓库
项目/模块上右键 –> Git –> Repository –> Push
点击定义远程仓库
3.8、从远程仓库上获取最新的数据以更新本地库
如果当前本地库不是在远程库最新版本上进行的修改,那么 push 会被拒绝,我们需要先从远程 pull 最新的远程库,然后进行修改,最后 push
- 此时需要合并远程代码,并解决冲突(如果有)