一、Git 概述
Git是一个免费的、开源的分布式版本控制系统
,可以快速高效的处理从小型到大型的各种项目。
Git易于学习、占地面积小,性能极快。它具有廉价的本地库,方便的暂存区域和多个工作流分支等特性。其性能优于Subversion、cvs、perforce和clearcase等版本控制工具。
1.1 何为版本控制
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统
。
版本控制其实最重要是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
1.2 为什么需要版本控制
个人开发过渡到团队协作。
1.3 版本控制工具
1.3.1 集中式版本控制工具
CVS、svn、vss。。
集中化的版本控制系统诸如CVS、SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。多年以来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,每个人都可以一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据来的轻松容易。
事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障,。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
1.3.2 分布式版本控制工具
Git、Mercurial、Bazaar、Darcs…
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整的镜像下来(本地仓库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现之后,解决了集中式版本控制系统的缺陷:
(1)服务器断网情况下也可以进行开发(因为版本控制是在本地进行的)
(2)每个客户端保存的也都是整个完整的项目(包含历史记录更加安全)
1.4 Git工作机制
Git工作区(Working Directory)、暂存区(Staging Area),和本地库(Local Repository)是Git版本控制系统中的三个重要概念,它们分别用于不同的任务和扮演不同的角色:
工作区(Working Directory):
- 工作区是您计算机文件系统中的目录,通常是您项目的根目录。
- 工作区包含了实际的项目文件,这些文件是您正在编辑和修改的。
- 在工作区中,您可以创建、编辑、删除文件,这些更改尚未提交到Git版本控制。
暂存区(Staging Area):
- 暂存区是Git版本库中的一个临时区域,用于准备要提交的更改。
- 当您对工作区中的文件进行修改后,您可以使用 git add 命令将这些更改添加到暂存区。
- 暂存区允许您选择性地将某些更改添加到下一次提交中,而不是一次性提交所有更改。
- 一旦您将更改添加到暂存区,Git会记录这些更改,以便在下一次提交时将它们包含在提交中。
本地库(Local Repository):
-
本地库是包含Git版本控制系统的核心部分,通常位于项目的根目录下的.git目录中。
-
本地库包括了项目的所有版本历史、分支、提交记录等信息,以及一个称为暂存区的区域。
-
本地库用于记录项目的完整版本历史,并允许您执行各种Git操作,如提交更改、创建分支、合并分支等。执行 git commit 命令时,暂存区的内容将作为一个整体提交到本地库中。
在Git工作流程中,您首先对工作区中的文件进行修改,然后使用 git add 命令将需要提交的更改放入暂存区,最后使用 git commit 命令将暂存区的更改提交到本地库中。这个过程允许您有选择性地构建提交,以便更好地管理项目的版本历史。同时,本地库也记录了项目的完整版本历史,允许您回溯查看和比较不同的提交。
1.5 .git文件夹
在一个Git仓库中,本地库的主要文件是位于.git目录中的文件和子目录。这些文件和子目录存储了Git版本控制系统所需的所有信息和数据。以下是一些重要的本地库文件和子目录:
objects目录: 该目录位于.git/objects,包含了所有Git对象,如提交对象、树对象和blob对象。这些对象存储了项目文件的内容和版本历史。
refs目录: 该目录位于.git/refs,包含了分支和标签的引用。分支引用存储在.git/refs/heads目录中,而标签引用存储在.git/refs/tags目录中。
config文件: 位于.git/config,包含了项目的Git配置信息,例如远程仓库的URL、用户名、邮箱等。这些配置信息是项目特定的。
HEAD文件: 位于.git/HEAD,指示当前工作目录所在的分支。通常,它包含了对分支引用的引用,或者直接指向某个提交。
index文件: 位于.git/index,是Git的暂存区,它保存了将要提交到版本库的文件列表以及它们的SHA-1哈希值,以便在提交时能够快速检查更改。
logs目录: 该目录位于.git/logs,包含有关分支更新和提交历史的日志信息。这些日志对于跟踪项目的变更历史非常有用。
hooks目录: 该目录位于.git/hooks,包含Git钩子脚本,这些脚本可以在特定的Git操作(例如提交或推送)发生时执行自定义操作。
1.6 Git和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库一般我们简单称为远程库。
局域网:gitLib
互联网:GitHub、Gitee
二、Git安装
官网地址:https://git-scm.com/
查看GNU协议,可以直接点击下一步。
此处省略步骤,可以百度搜安装教程。
三、Git常用命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.email 邮箱 | 设置用户名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m “日志信息” 文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git reset --hard 版本号 | 版本穿梭 |
3.1 设置用户签名
基本语法:
)git config --global user.name 用户名
)git config --global user.email 邮箱
案例实操:
通过cat ~/.gitconfig 可以看到配置用户名和邮箱信息
或者C盘中当前用户目录中的.gitconfg文件中也能看到配置信息
说明:
签名的作用是区分不同操作者身份,用户的签字信息在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git首次安装必须设置一下用户签名,否则无法提交代码
。
3.2 初始化本地库
1)基本语法
git init
2)案例操作
新建了一个gitdemo文件夹,在文件夹里面右键打开git bash,然后初始化,文件夹中会有一个.git的文件生成
通过ll -a 命令可以看到有.git文件
3.3 查看本地库状态
命令:git status
(工作区没有任何文件)
3.4 添加暂存区
命令:git add 文件名 , 把文件从工作区添加到暂存区
F:/gitspace/gitdemo 这个文件地址只是一个工作区
git rm --cached hello.txt
把文件从暂存区删除,但是工作区还是有的
3.5 提交本地库
1)基本语法
git commit -m “日志信息” 文件名
2)案例实操
git reflog可以看到提交的日志信息
3.6 修改文件
1)查看状态(检测到工作区有文件被修改)
先vim修改文件,然后git staus 发现文件被修改
2)将修改的文件再次添加到暂存区
3)添加到暂存区之后提交到本地库
3.7 历史版本
1)查看历史版本
git reflog 查看版本信息
git log 查看版本详细信息
2)版本穿梭
git reset --hard 版本号
四、Git分支操作
4.1 概述和优点
什么是分支?
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离出来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
4.2 分支的好处
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
4.3 分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
4.3.1查看分支
1)基本语法:
git branch -v
4.3.2 创建分支
1)基本语法
git branch 分支名
4.4.3 切换分支
1)基本语法
git checkout 分支名
4.3.5 合并分支
1)基本语法
git merge 分支名
2)案例操作:在master分支上合并hot-fix分支
3)产生冲突
冲突的表现:后面的状态为MERGING
特殊符号:
<<<<<<<HEAD
当前分支代码
-=======
合并过来的代码
->>>>>>>>> hot-fix
冲突的原因:
合并分支时,两个分支在同一个文件的同一个位置
有两套不同的修改。Git无法替我们决定使用哪一个。必须人为
决定新代码内容。
查看状态:
4)解决冲突
(1)编辑有冲突的文件,删除特殊符号,决定要使用的内容
(2)添加到暂存区
(3)提交到本地库(注意:此时使用git commit 不能带文件名)
4.4 创建分支和切换分支图解
master、hot-fix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的。所以创建分支的本质就是多创建一个指针。
HEAD如果指向master,那么我们现在就在master分支上。
HEAD如果指向hot-fix,那么我们现在就在hot-fix分支上。
所以切换分支的本质就是移动HEAD指针。
五、Git团队协作机制
5.1 团队内协作
5.2 跨团队协作
六、gitHub操作
6.1 创建远程库
GitHub网址:https://github.com/
ps:全球最大同性交友网站,技术宅男的天堂,新世界的大门。
6.2 远程仓库操作
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名 |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
6.2.1 创建远程仓库别名
1)基本语法
git remote -v 查看当前所有远程库别名
git remote add 别名 远程地址
2)案例实操
fetch和push:既可以推送也可以拉去
6.2.2 推送本地分支到远程库
1) 基本语法
git push 别名 分支
2)案例实操
6.2.3 拉取远程库到本地库
1)基本语法
git pull 远程仓库别名 远程分支名
2)案例操作
6.2.4 克隆远程仓库到本地
1)基本语法
git clone 远程地址
2)案例操作
小结:clone会做如下操作:1、拉取代码 2、初始化本地库 3、创建别名
6.2.5 邀请加入团队
gitee或者github中仓库成员管理中设置。不在赘述。。。
6.3 跨团队协作
1)将远程仓库的地址复制发给邀请跨团队协作的人。比如发给东方不败。
东方不败点击 Fork,Fork完之后可以clone到本地修改代码然后提交,然后点击 pull request
6.4 SSH 免密登录
我们可以看到远程仓库中还有一个SSH的地址,因此我们可以使用SSH进行访问。
具体操作如下:
命令:ssh -keygen -t rsa -C 描述
执行命令之后生成公钥和私钥
然后复制公钥内容配置到gitee上
七、IDEA集成Git
7.1 配置git忽略文件
idea特定文件:
比如 .idea文件
问题1:为什么要忽略他们?
答:与项目的实际功能无关,不参与服务器上部署运行,把他们忽略掉能够屏蔽IDE工具之间的差异。
1)创建忽略规则文件 xxx.ignore(前缀名随便起,建议是git.ignore)
这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig文件引用,建议也放在用户家目录下
git.ignore 文件模板内容如下:
2)在.gitconfig文件中引用忽略配置文件(此文件在Windows的家目录下)
7.2 定位git程序
idea打开git设置,选择自己的git.exe安装目录,点击test看下是否出现版本号,出现表示设置成功。
7.3 初始化本地库&添加到在暂存区&提交本地库
点击VCS(version control setting),选择让git管理的项目
说明没有添加到暂存区的文件,可以右键git—>add添加,add之后会变成绿色,说明已经添加到暂存区,但是未提交到本地库。
添加到暂存区之后可以提交到本地库
7.4 切换版本
1)在IDEA的左下角,点击 Version Control,然后点击Log查看版本
2)如果想切换到上次提交的版本
7.5 创建分支
1)选择Git,选择new Branch
2)创建分支的名字
7.6 合并分支
在IDEA窗口的右下角,将hot-fix分支合并到当前master分支。
当出现合并冲突的时候怎么处理?
八、IDEA集成GitHub
8.1 设置GitHub账号
8.2 分享项目到GitHub
8.3 push 推送本地库到远程库
右键点击项目,可以将当前分支的内容push 到GitHub的远程仓库。
修改完之后先commit到本地库,在push到远程仓库。
注意:
push是将本地库代码推送到远程库,如果本地库代码跟远程库代码版本不一致,push的操作会被拒绝的。也就是说,要想push成功,一定要保证本地库的版本要比远程库的版本高。因此一个成熟的程序员在动手改代码之前,一定要先检查下远程库跟本地库代码的区别,如果本地库代码版本已经落后,切记要pull拉取一下远程库的代码,将本地代码更新到最新以后,然后再修改,提交,推送。
8.4 pull 拉取远程仓库到本地库
右键点击项目,可以将远程仓库的内容pull到本地仓库
注意:pull是拉取远程库代码到本地,如果远程库代码和本地库代码不一致,会自动合并,如果自动合并失败,还会涉及到手动解决冲突的问题。
8.5 克隆代码到本地
1、通过当打开idea时
2)通过git bash 克隆也可以
九、码云
9.1 IDEA集成码云
idea默认不带码云插件,我们需要再idea插件中安装Gitee。
2、idea中配置gitee,添加码云账号
3、把项目分享到码云
第二种方式分享到码云,前提是创建好一个远程仓库了,然后复制仓库地址。
十、自建代码托管平台-GitLab
10.1 gitLab安装
比较繁琐。。此处省略,如有需要可以百度(:
10.2 idea集成gitlab
此处省略,和idea集成github差不多。
十一、IDEA中使用git常见问题
11.1 idea中不提交当前分支修改的代码并切换分支
11.1.1 当前分支修改代码切换分支
日常开发中,我们可能会碰到我们正在修改当前 01 分支的代码,突然要去修改另外一个 02 分支的代码情况,而我们 01 分支写的代码还未经过测试,并不能马上提交,这个时候我们切换到 02 分支就会有问题,比如弹出这种截图
因为我们有这些代码没有提交,所以会让我们先操作一下
smart checkout:会把冲突的这部分内容带到目的分支(如果你没有点进窗口的那些文件处理冲突的话)
force checkout:不会把冲突的这部分内容带到目的分支,但是你在当前分支修改的所有内容就会被删除,再切回来就找不到了
dont checkout:不切换分支,继续留在当前分支
11.1.2 暂存当前分支代码
选中当前项目,右键->git->stash changes
填写描述,点击 create stash 就可以了,然后我们就可以切换到其他分支了
11.1.3 还原暂存的代码
当我们从其他分支再回到我们当前分支的时候,需要还原代码
选中当前项目,右键
点击apply stash即可还原