Git
第一部分:Git的安装
为什么要使用代码版本控制系统
Git和 SVN的对比
Git的下载和安装
GUI是git提供的图形化操作 ,bash是git提供的命令行操作
可以在任意一个文件夹下右键打开git
使用git version可以查看git的版本
tortoiseGit的安装和汉化(git的图形化操作的软件)
下图:在安装的这一步要绑定git的bin目录
、
可以按照tortoise的中文语言包
- 软件安装中重点注意点
看到下图三个选项表示安装成功
Git操作入门
- git分为本地仓库和远程仓库
git区域介绍 - 本地仓库
通过本地历史仓库控制代码版本
Git常用命令
- 示例
- 1.创建工作目录,并将其初始化成本地的git仓库
工作目录其实就是一个普通的文件夹,初始化时我们需要进行到文件夹中打开git命令行执行git init命令 - 下图为在git命令行中执行git init命令
可以将下图中上面的隐藏的项目勾选上,将显示出一个git文件夹,说明git本地仓库初始化成功
2.新建一个test.txt文件(暂时不执行添加操作)
- 直接通过右键创建
3.使用status命令,查看状态
此时显示我们的test.txt文件没有被添加(add),红色表示该文件没有被提交
4.使用add命令添加,并查看状态
- 执行git add 文件名
此时的文件变成了+的符号
如果电脑是第一次安装tortoisegit可能不会看到+这个符号,需要重启电脑后才能看到
- 再使用git status命令查看状态
此时没有红色的文件,而变成了绿色表示有一个新文件
我们只只执行add操作仅仅是把文件添加到了暂存区
5. 执行commit命令将暂存区的文件提交到本地历史仓库
commit命令是把暂存区所有的文件提交到历史仓库,所有不需要执行文件
- 仅仅git commit会被告知不能识别生分
- 在提交到本地仓库时需要进行提交者身份的设置
需要通过以下的命令来配置用户的信息
- 再次来提交
此时则提交成功
此时的test.txt文件符号显示成了对勾
6.使用log命令,查看日志
黄色文字为该文件在历史仓库中唯一的索引标识。以及该文件的作者和作者的邮箱,和提交的日期和时间,以及作者在提交是提交文件的描述
将来我可以对这个文件有一个修改,修改之后又会有与之前不同的唯一的标识
7.修改test.txt文件
我们修改并保存这个文件后,如果没有进行add,我们的文件会被标上红色叹号的标识
8.进行添加 提交并查看日志
细节:此时第二次修改add文件符号并不会改变(应该是该文件已经在暂存区中了),add并commit文件符号变成对勾
- 查看日志
此时我们可以发现有2条提交信息,并有2条不同的唯一标识
那么这个相同文件的不同编号标识有什么用呢?
可以用来进行版本切换,比如该版本的一些功能被修改坏了,可以通过版本标识来切换到其他版本
- 总结
执行add操作后,文件会有+图标,没有可以重启电脑
TortoiseGit操作(git基本操作使用图形化工具实现)
和上面的一样,先创建一个工作目录,然后将工作目录初始成git仓库
此时只需要右键该文件夹,并点击git在这里创建版本库
下面的选项不要勾选,免得出现不必要的错误
此时文件夹中出现.git文件,表示git版本库初始化成功
2.已经创建test.txt文件,下面进行add操作
此时只需要右键该文件选择Tortoise,然后选择添加即可
3.提交暂存区里面的文件
右键选择提交即可,并在打开的页面中填写你的提交信息,进度条结束即提交完成
4.修改文件中的内容
5.添加并提交新修改的文件
此时直接提交即可(不需要添加)
6.查看提交日志
右键该文件,选择查看日志即可
- 将以图形化的方式显示日志信息
Git版本管理
历史版本切换
-
问题的引出
git reflog可以理解为可以精简我们的日志信息,可以减少我们版本编号的位数
增加一次修改是为了更明显的看到效果 -
修改之后进行第三次添加并提交
-
我们通过查看可以发现有了3次记录
我们现在需要把代码切换到最初的版本
执行 git reset --hard 版本号 将代码回退到指定的版本
此时我们的文件里面是空白的,回到了第一次提交的状态
- 此时再回到第三次提交时
可以回到所提交的任意一个状态
总结
第三部分:分支管理
分支管理介绍
- 从分身引出分支
- 分支使用场景
1.理解为将已经写好的20%的代码使用一个分支进行版本控制,然后在这个分支上进行修改,而我们主线开发新功能还是可以不受影响的继续,然后当分支代码dug修改完毕,可以进行分支合并
分支工作流程
分支是由每次提交的代码串成的一条时间线,在没有创建新的分支时,只有一条主分支
- Master不仅仅表示主分支,还是一个指针的概念。当提交第一个代码版本,Master执行第一个版本,提交第二个Master指向第二个版本,以此类推
- Head指针
Head分支指向当前所使用的分支 - 在git中使用别的分支只需要挪动Head指针即可
分支的合并
- 当我们一个分支的工作开发完毕,并将代码版本提交后
只需要让Master指针指向刚刚提交的代码版本,并且让Head指针指向主分支即可(分支合并),如果新分支不需要了,可以将其删除 - 对分支的操作
创建和切换分支
- 通过命令或者是后面的括号里面的内容可以知道当前我们正在使用的分支
- 使用命令git brach可以查看存在的分支
- 使用git checkout 分支名 可以切换到指定的分支
现在在新分支中创建一个文件并提交,验证各个分支独立指向互不干扰
- 添加并提交test2.txt
ls命令可以查看当前分支下的文件
- 我们在xiaoming分支下查看可以看到有2个文件
- 而当我们切换到master分支中时却发现只有一个文件
从这里可以发现我们的各个分支是相互独立,互不干扰的
- 总结
合并分支
也可以把master分支合并到新创建的分支,但是一般习惯把新创建的分支合并到master分支中
先切换到主分支(合并成主分支)然后执行分支合并命令
-
合并后可以发现仓库列表变成了2个文件
-
而且在master分支下名查看文件列表,也可以看到有2个文件
-
此时xiaoming分支没有用了需要删除他,执行git branch -d 分支名进行删除分支
-
此时查看分支发现创库里面只有master一个分支了
-
总结
-
本地历史仓库和工作目录之间可以进行分支切换操作
第四部分:远程仓库
远程仓库工作流程
有一个新的员工上班,需要在现有的代码版本上进行开发。需要获取所有版本的代码版本,可以在老员工的电脑上进行拷贝一份,但是这样的话只能获取最新版本的代码版本,并不能获取历史的代表版本,解决方案是从远程仓库中复制一份代码到新员工的本地仓库中
克隆是远程仓库所有的历史版本代码都复制到本地仓库里面来
- 工作流程
常见代码托管平台介绍
github可能会存在网络问题,所以在这里使用gitee,需要先注册一个gitee
远程仓库创建-SSH公钥配置
-
2种操作情况
情况1
-
上加号键创建仓库
并且仓库的路径和根据我们输入的仓库名自动生成
需要把我们的项目从本地仓库推送到远程仓库中
1.设置全局账户和邮箱
2.生成SSH公钥
注意:1.前面的-和2边不能有空格2.-C的C是大写
光标这此处停止,提示我们是否将生成的密钥放在C盘下的具体位置,直接回车默认即可,然后再2次回车
- 到达下面的页表,表示公钥生成完毕
- 查看生成的公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDVRPJLoqCLVb8iwGuib2+bRbOl6ueUmSeH3OcB0TbFi6wYGWxy4ArACr8WXSI5SnUtZuPMfzanwmYxco9HoQsTNAmMrQGj1Kz0wdYutlUSBrr+CCKlh8dsOpdTuyeNanDmaPMs6c7yj8kQr67z3lLZZOAyIA0Ao2RsoPhC6huY8FuWN3kfay/YJzMkrHn0zZhv9UTxfc1UtJOVRablfSFKCztSNwYks86j0PkPeyZcDQVAWt+Q4E15E2v9NrY3SJLhPY65ApKQ0wX2hVajhTFR2rIiddz3a42oNArO37D6ffB+YRySY/XxskKZ/IUDRu5EDaW0UQU6Od+wRFqYpUKK5Rquw9tflIiGRKy0fUrRxcA0OtrZ6TxRgCmODfr8mHutLenLJ+BODOk7ROnaadGumCXHqCP/NjPxRhCDLyeapemuzD60YzwrERvMqQxQT3tTKt1KZRSy2K1LR0ncLsnF/utmb9wEAVowQHwRqONsh5UJWmgFZGXiIdeuxOjJl/M= 3072545028@qq.com - 设置公钥总结
3.设置账户公钥(将该账户下生成的公钥设置到gitee中)
- 当把公钥粘贴后发现自动匹配出了我们的邮箱
- 在设置公钥时会验证远程仓库密码(即gitee的登陆密码)
4.公钥测试(测试公钥有没有被设置成功)
- Successfully公钥配置成功
本地代码推送到远程仓库
1.为远程仓库的URL自定义仓库名
git中快捷键:复制: ctrl + insert
粘贴: shift + insert(感觉不好用,可以指定复制的东西进行鼠标右键,或者指定站特的地方右键)(copy 复制,paste粘贴)
- 注意:URL选择上SSH和https都可以
2.推送代码到远程仓库
注意可能在推送的时候会验证你的gitee的用户名和密码
-
此时我们打开gitee就可以看到我们推送的分支了
-
推送总结
克隆和拉取操作
-
克隆
-
此时在我们的页面中就出现了远程库的代码
-
修改(更新)克隆的代码并推送到远程库
-
1.必须先添加到暂存区并提交到本地仓库才能推送
-
提取代码到远程仓库
-
刷新远程仓库发现代码已经更新
而此时我们的前面的本地历史库是没有更新的,我们可以通过拉去的操作进行更新
-
此时我们的园项目的历史仓库更新了
-
总结
代码冲突
代码冲突出现的场景
2个程序员都从远程仓库中push了文件,A程序员在文件中添加了A然后push到了远程仓库,B程序员没有进行pull,它在文件中添加了B然后进行push。此时远程仓库将会出现代码冲突(远程仓库不知道该文件该怎样处理)
远程仓库该怎样处理呢?
-
演示该场景
假设2个程序员都已经冲远程仓库克隆了全部的代码,现在2个人都要对代码进行更改,然后进行提交。(用本机上2个历史仓库进行替代) -
在git-hello中我更改了test.txt文件
-
更改后进行提交,并且推送到远程仓库
- 此时我们的git-hell1仓库中并没有进行拉去跟新,而是和git-hello一样进行修改并提交,并push
- 然后我们也进行推送
此时它告诉我们,我们提交的代码存在冲突
当提交的代码存在冲突:远程仓库会阻止我们代码的提交,需要我们解决代码的冲突,然后才能提交代码
代码冲突的解决
-
在提交之前更新我们的仓库
-
此时我们文件夹中标黄的文件,将表示该文件存在冲突
-
使用cat 文件名查看该文件存在的冲突
-
尖括号中间表示代码冲突的部分
我们需要将冲突的部分进行修复,然后重新进行提交,冲突就会得到解决
-
修改冲突文件
-
我们将冲突文件改成目标文件
-
我们重新添加提交并推送
-
此时重新推送成功
避免代码冲突的方案
在以后我们在push我们的代码之前,建议先进行pull,将仓库的代码更新到最新的版本。这样可以避免代码出现冲突
1.在commit之后,push之前,pull代码,这样和前面差不多,只是看不到提示冲突的代码,和让你看到你的哪个文件哪里存在冲突,然后解决冲突然后再次提交,并推送即可
2.在commit之前(刚开始)就进行pull拉取,然后修改文件,添加 提交并推送,这样就有可能可以避免冲突了(因为此时2个用户面对的就不是一个版本的代码)
- 总结
IDEA集成git
创建本地仓库--提交代码
- IDEA中配置Git
- 具体到git.ext文件(test按钮可以用来测试是否配置成功)
- 演示IDEA中配置Git
- 在setting中的版本控制下找到git,发现IDEA已经自动检测出来了git的路径
我们按测试按钮,提示了git版本,说明这个git的可执行文件是可用的
一般来说IDEA都是集成好了Git的,我们只需要使用即可
1.我们要就代码交给git进行版本控制,首先需要先创建一个本地历史仓库
-
一个问题:我们应该将GitStudy作为版本仓库,还是将GitStudy的上一级目录ideaProject作为版本仓库
因为我们以后是要对这个项目进行管理,所有应该以该项目的上一级目录作为版本仓库 -
创建仓库后,我们可以IDEA右上角多了几个图标,并且有些文件被标红了
文件被标为红色表明该文件没有被版本控制,文件为绿色表明该文件处于暂存区,没有被提交(和在git命令行中展示的一样)
-
当我们创建一个文件时,IDEA会提示是否添加到git中,这步其实就是add(将该文件添加到本地仓库)
-
commit(右上角的对勾符号为commit)
- 当看到下面的提示,则说明代码提交成功
-
我们修改这个文件后再次进行提交
-
此时它选中的就只有一个文件了
-
怎么查看提交记录呢
-
左下角有个git或者是version control
-
点开就可以看到所有的提交记录了
总结
idea中进行版本切换
- 将代码回退到第一次提交的版本
**进入左下脚的git页面,找到相应的提交记录,右键
- 此时我们的这个文件的hello world从4行变成了2行
但是这种方式有个问题:当我们回退到前面的一个版本时,我们的之前的那个版本将会被舍弃,不会进行保存(这和我们使用git命令行的效果是不同的)
怎样可以使用可以进行版本切换又不会舍弃版本呢?
- 右键该记录选中revert commit(还原提交)
- 点击还原提交后发现有冲突(目前的代码和之前的代码有差异)我们需要进行合并
-
会显示目前的版本,和之后的版本
-
我们将叉都点击,将保留中间的版本(即回退的版本)
-
冲突处理完毕后会弹出一个提交的对话框(提交信息由他自动提示出来的)
commit之后我们发现代码确实回退到了指定的版本,并且不会舍弃任何版本的代码,并且将我们这次的版本回退也作为了一个修改记录记录下来了 -
总结
-
第一种回退
-
第二种回退
IDEA中的分支管理(重点在于分支的合并和冲突的处理)
-
当我们创建了本地仓库后上面就会出现一个git图标
-
下面的checkout branch(签出分支)勾选将会创建分支后切换到该分支
此时的idea的右下脚将会标识为dev01 -
怎样切换成原来的分支呢?
-
点击右下角的分支,找到分支,点击checkout(签出)即可
-
方法二
点击上面的git,找到分支,可以显示存在的分支,如果该分支存在铅笔的图标,表示正在使用该分支
-
点击指定的分支切换即可
-
此时我们在新的分支dev01中,写一句代码并提交
-
提交之后该分支的提交记录
-
当我们切换回master分支,发现并没有我们新增的代码
-
然后我们在master分支下也进行新增一些代码
此时我们的2个分支都进行了同样部分的修改,如果将这两个分支合并,会不会发生冲突? -
我们现在将master分支合并到dev01分支(在dev01分支下执行)
-
不出所料,出现了冲突
-
左边和右边分支2个分支具有冲突的代码块,深色的部分是具体冲突的代码,中间是合并的结果
点击对应的>>表示保留该代码 -
此时dev01分支中该段代码将同时保留冲突的2段代码
-
idea中的这个图可以看到此时的分支图
-
进行分支合并将额外生成一条记录
看上面合并之后的图可以知道此时的main分支已经有合并之后的结果,但是bugFix分支还是只有之前的结果,此时我们让bugFIX分支
合并main分支,让bugfix分支达到和main分支一样 -
换到我们演示的这种情况下,我们让master分支合并dev01分支
合并后我们可以发现此时的master分支下的代码和dev01一样了
我们将dev01分支的代码合并到master分支后,dev01分支就没有用了,此时我们可以把它删除了
- 总结
IDEA操作远程仓库
我们首先在gitee上面创建一个远程仓库
- 我们在远程仓库上面可以看到我们推送的内容
我们的SSH公钥用于安全的登录gitee,我们的代码进行推送,是推动到gitee中指定的仓库,所有在推送到时候需要对应仓库的路径地址,但在仓库的的地址每次推送都去进行复制会很麻烦,所以我们一般将远程仓库起别名为origin
将远程平台的代码克隆到本地
-
先关闭掉当前的项目
-
点击从vcs获取
-
输入远程仓库的路径,下面是项目保存的路径(可以根据需求进行更改)
可能在一些比较老的idea中,会有很多下一步的过程,一路下一步即可 -
之后我们的项目就克隆到本地了
-
总结