目录
我们要想让Git管理某个目录,首先我们要让Git得到该目录的管理权,即初始化
一、Git概述
Git是一个免费的、开源的 分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目
Git易于学习,占地面积小,性能极快,它具有廉价的本地库,方便的暂存区域和多个工作流分支等
1.1 什么是版本控制
版本控制是一种记录文件内容变化,以便将来查询特定版本修订情况的系统
版本控制最重要的是可以记录文件修改历史记录,从而能让用户查看历史版本,方便版本切换
1.2 Git的工作机制
1.3 Git与代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库
在局域网下:
- GitLab
在互联网上:
- GitHub(外网)
- Gitee码云(国内网)
1.4 Git常用命令
1.4.1 设置用户签名
签名的作用是区分不同操作者身份,用户的签名信息在每一个版本下的提交信息中能够看到, 由此确认本次提交是谁执行的
注意:Git首次安装必须设置一下用户签名,否则无法提交代码
1.4.2 初始化本地库
我们要想让Git管理某个目录,首先我们要让Git得到该目录的管理权,即初始化
该命令比较简单,即:
git init
1.4.3查看本地库状态
git status
上图是我们在第一次执行该命令时的输出
上图是我在工作区添加一个.txt文件后查看本地库状态的输出
1.4.4 添加到暂存区
git add 文件
如上图所示,我们将HelloGit.txt文件使用命令添加到暂存区了之后,还可以使用下面这条命令将其从暂存区中删除
git rm --cached 文件
注意:该删除命令,只是将文件从暂存区中删除,在工作区中它依然存在
1.4.5 提交到本地库并查看版本信息
git commit 文件
git commit -m "日志信息" 文件
我们可以通过上面两种命令进行提交到本地库的操作
上面第一条命令我们没有 书写日志信息,在输入该命令后,还会跳出另外的让你输入日志信息的框,我们一般直接在输入 提交命令 后直接输入 日志信息
下图便是输入 提交命令后的输出
git reflog
git log
上面两条命令都可以使得我们查看到版本信息,区别在于输出信息的详细程度
git log命令输出完整的版本号且输出 命令使用者 和 提交日期 及日志信息
git reflog命令只输出前七位版本号和日志信息
1.4.6 修改文件
如图,我们使用vim将前面我们提交的文件内容做了修改,此时查看本地库状态的输出
此时提示我们需要更新,此时如果我们再次将该文件 保存到暂存区并且提交到本地库后,我们再次查看本地库状态,我们可以得到该文件的两个版本信息
1.4.7 版本穿梭
git reset --hard 版本号
如图我们更新了文件的版本已经有3个了
在输入版本穿梭的指令后输出如下,并且在该文件的版本信息中也会记录版本穿梭的操作记录
实际上,版本的穿梭底层其实是移动的head指针
1.5 Git分支
1.5.1 什么是分支
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以为每个任务创建单独的分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。实际上,分支可以简单地理解为副本,一个分支就是一个单独的副本(分支底层其实也是指针的引用)
1.5.2 分支的操作
如上图所示,我们先创建了一个分支hot-fix,并且切换到该分支后,对文件进行修改、保存到暂存区、提交到本地库
如上图所示,我们现在“站在hot-fix”分支上,我们对HelloGit.txt文件添加了“hot-fix it”即修改了该文件,此时我们再次切换回master分支上
我们发现在master分支上查看该文件时,并没有上面在hot-fix分支上做的修改
此时就需要使用到 分支的合并操作
git merge 分支名
该段代码的作用是“将指定的分支合并到当前所在的分支上”
如上图所示,我们将hot-fix分支合并到master上后,再次查看HelloGit.txt文件即可看到hot-fix分支上对其做的修改了
但是,上面的合并是建立在“正常情况下”,下面我们介绍“冲突合并”
如上图所示我“站在master分支上”对HelloGit.txt文件进行了修改后保存(记得提交)然后我们切换到hot-fix分支下再次对其进行修改同一行后(记得提交),同时切换回master分支合并hot-fix分支,此时
出现提示,提示我们在合并分支时出现了矛盾
此时,我们需要人为地选择/合并代码,我们打开被修改的文件
我们把我们想要保留的代码留下即可
此时再次提交即可
值得注意的是,再次提交的时候不需要带上文件名
1.6 Git的团队协作机制
1.6.1 团队内协作
1.6.2 跨团队协作
1.7 Git 与 GitHub
1.7.1 查看当前所有远程地址的别名
git remote -v
在git 中输入该命令即可查看当前所有远程仓库的别名
1.7.2 给远程地址创建一个别名
git remote add 别名 远程地址
具体命令如上,值得注意的是在起别名的时候我们一般都选择与本地仓库的名字保持一致
1.7.3 推送本地库到远程库
git push 别名 分支
具体命令如上
这里值得注意的是我们也可以输入远程地址代替别名,还有这里的推送最小单位是分支
1.7.4 拉取远程库到本地库
如图我们在代码托管中心上对我们的代码进行了修改并提交(在最下面新增了一行1111),此时我们的本地库便与远程库不同步了(我们总是需要让远程库与本地库保持同步)
此时我们在本地库查看我们的代码最后一行是没有我们新增的11111的
此时需要使用到拉取代码的命令
git pull 别名 分支
具体命令如上
如图所示,我们成功地从远程库中拉取(同步)了代码 ,此时也能看到我们在代码托管中心所做的修改了
1.7.5 克隆远程库到本地
git clone 远程地址
命令如上
成功克隆之后,我们会发现,clone会做三件事:
- 拉取代码
- 初始化本地库
- 创建别名
补充 clone与pull的区别
clone是使得我们的本地库“从无到有”,pull则是更新我们的本地库(即本地库本来就有)
顺便分享一篇不错的文章Git教程之git pull和git clone的区别(总结分享)-git-PHP中文网
1.7.6 团队内协作
前面我们已经学习了如何克隆远程库到本地,现在假设我们作为公司员工通过克隆得到代码后,现在完成了自己的任务,需要将自己的代码推送到远程库,因此,我们先将自己的代码提交到本地库后,使用 push 命令 尝试将其推送到远程库时,我们得到:
该提示的大概意思就是,我们没有权限可以将自己的代码推送到公司的远程库
这是因为github并不知道我们是公司的员工,尽管现实生活中我们是的,因此我们需要在github中将我们自己添加为公司员工,不过一般在公司中,我们作为员工得到的只是一封邀请函(或者说是一个链接),我们打开该链接后接受邀请即可
此后我们便可以push我们的代码到远程库了,别的成员也可以pull远程库中的代码(代码同步)
1.7.7 跨团队协作
有时候,我们在公司里需要跨团队协作,此时假设我们作为一个高手,看见别的团队所写的代码不太行,忍不住想帮他们修改,那么我们应该怎么做呢?
首先,我们需要先在GitHub中得到别人的代码,这一步可以通过在github中直接搜索来得到,也可以通过得到别人的“链接”来得到
此后我们便可以看到别人的代码了,那么我们想要修改它就需要先把它“叉过来”,如上图所示有一个fork按钮,点击后我们便可以在自己的github账号下看到别人的代码了
此时,如果我们想要修改它的话,我们可以选择将其“克隆”到本地库进行修改,也可以直接在github上进行修改
如图我们直接在github中对进行修改,修改成功后,别人肯定是看不到的
我们需要向别人发送一个pull request 即告诉别人“我已经帮你们改好了代码了,可以拿过去了”
这个pull request还有类似聊天室的功能我们可以进行团队交流
发送请求之后,别人就可以看到你的请求了
如果说别人认为你写的代码比我好,那么别人便可以接受你的请求
并且将你的代码与他的代码进行合并
以上便是跨团队协作的过程啦
1.7.8 GitHub SSH免密登陆
首先我们需要创建id_rsa.pub或id_dsa.pub文件
我们先在C盘下找到自己的用户目录,在该目录下打开git bash
执行上面这条命令后,连续敲击回车键即可生成id_rsa.pub或id_dsa.pub文件,生成成功后可以在该目录下看见.ssh文件夹,该文件夹里即有我们需要的文件
然后我们需要打开id_rsa.pub文件并且复制文件内容
将复制的内容在github的ssh设置中添加即可
补充 ssh VS https
使用ssh和https有什么不同:
- HTTPS:使用https url克隆对初学者来说会比较方便,复制https url然后到git Bash里面直接用clone命令克隆到本地就好了,但是每次fetch和push代码都需要输入账号和密码,这也是https方式的麻烦之处(发现了https免密登录的方式)。
- SSH:使用SSH url克隆却需要在克隆之前先配置和添加好SSH key,因此,如果你想要使用SSH url克隆的话,你必须是这个项目的拥有者或管理员,否则你是无法添加SSH key的。另外ssh默认是每次fetch和push代码都不需要输入账号和密码,如果你想要每次都输入账号密码才能进行fetch和push也可以另外进行设置
这里分享一篇不错的文章(2条消息) ssh原理以及与https的区别_PeipeiQ的博客-CSDN博客_ssh和https的区别
1.8 IDEA集成Git
1.8.1 配置忽略文件
在项目创建后,可能会存在一些文件是我们所不需要的,它们与项目的实际功能无关,不参与服务器的部署运行,把它们忽略掉可以屏蔽IDE工具之间的差异
1)创建 忽略规则文件xxxx.ignore
该文件的存放位置建议存放在用户家目录下,便于后续引用
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
实际上,该文件存放的内容就是我们想要去屏蔽的内容
3)让idea找到git
1.8.2 在IDEA中执行Git的常用命令
1)初始化(让git管理某个项目)
2)添加到暂存区以及commit
值得注意的是,与命令行显示一样,未添加到暂存区的文件会显示为红色,已经添加到暂存区但是未commit的文件是绿色,已经commit的文件是黑色(这些颜色的变化并不会影响我们运行某个程序)
3)切换版本
如下图所示,我们现在创建了一个类文件,并且将它添加到暂存区以及提交后
我们将其提交后又做了多次修改,即创建了多个版本信息,此时我们想查看当前的版本信息,应该怎么操作呢?
首先我们点击idea左下角的git按钮
就会出现下面的界面,就可以很清晰的看到各个版本信息了
此外,我们还可以通过鼠标右键想要的版本来进行穿梭
4)创建及切换分支
如下图所示在idea的右下角有一个master按钮,它显示的是当前我们处于哪个分支上,点击它之后会弹出一个窗口,我们可以进行分支的创建和切换
如下图我们已经创建了一个hot-fix分支,这里如果想切换会master分支就点击master分支进行操作即可
补充 切换分支的checkout与reset与revert的区别
Git 回滚 checkout、reset、revert_[奋斗不止]的博客-CSDN博客_git checkout revision
详情可以借鉴上面这篇不错的文章
5)分支的合并
如下图所示,我们在hot-fix分支下修改了当前的代码并且commit了
此时我们切回master分支时,是看不到改变的,因此我们需要合并分支
如下图所示,我们还是点击右下角的分支按钮(注意我们当前处于master分支下),点击hot-fix分支将其合并到当前分支上即可
这样我们就合并成功了
上面我们演示的是正常合并的情况
下面演示 合并冲突 的情况
如上图所示,我们在hot-fix分支和master分支上都在相同一行增加了代码,此时我们将hot-fix与master进行合并 这时idea会跳出一个窗口提示我们出现“合并冲突”的情况,此时我们需要进行手动合并代码
如上图所示,左边是master分支,右边是hot-fix分支,中间是原始代码
手动选择合并代码后,我们点击apply即可完成合并
1.9 IDEA集成GitHub
该内容比较简单,下面只会以简单过一下
- IDEA登陆,我们只需要再IDEA的设置中把自己的GitHub账号登陆上去即可
下面的操作均是基于已经在IDEA中成功登陆GitHub账号的情况进行讨论
- 在IDEA中有一个按钮,通过该按钮我们可以实现将自己的代码/项目分享到自己的远程库(实际上该操作相当于 创建远程库+push)
- push操作,在IDEA中我们很容易可以找到push按钮,即将自己的本地库推送到远程库中(注意在push之前先pull,养成良好习惯)
- pull操作,同push操作一样,在IDEA中很容易可以找到对应的按钮(注意在pull之前,尽量也别改本地,否则容易遇到合并问题)
- clone操作
如上图所示,输入链接即可
1.10 国内代码托管中心-码云
1.10.1 简介
Gitee几乎与GitHub的使用完全一样,这里便不再赘述,操作可参考IDEA集成GitHub