Git是一个免费的,开源的分布式版本控制系统,可以快速高效地从小型到大型地各种项目。
Git易于学习,占地面积小,性能极快,它具有廉价的本地库,方便的缓存区域个多个工作流分支等特性。其性能优于Subversion,CVS,Perforce和ClearCase等版本控制工具
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
个人开发过渡到团队协作,对代码的修改可能会把另一人对代码的修改给覆盖掉,所以需要git来实现版本控制
集中式版本控制工具
CVS,SVN(Subversion),VSS......
集中化的版本控制系统诸如CVS,SVN等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连接到这台服务器,取出最新的文件或者提交更新,多年来,这已成为版本控制系统的标准做法。
这种做法带来了许多好处,每个人都可以在一定程度上看到项目中其他人正在做些什么。而管理员可以轻松掌握每个开发者的权限,并且管理一个集中化的版本控制系统,要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做显而易见的缺点是中央服务器的单点故障。如果服务器宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。
分布式版本控制工具
Git,Mercurial,Bazaar,Darcs......
像Git这种分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码仓库完整的镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复。因为每个客户端的每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份。
分布式的版本控制系统出现以后,解决了集中式版本控制系统的缺陷
1、服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
2、每个客户端保存的都是完整项目(包含历史记录,更加安全)
每个客户端更新项目版本,都会把代码推送到远程库中。客户端在编写代码前要连接远程库,将最新的代码克隆到本地库。基于自己的本地库来做版本的控制。写好新的版本之后还要将代码推送到远程库,保证代码是最新的。
工作区:存放代码的位置;将工作区的代码添加到暂存区。此时的代码是可以删除的,还没有生成对应的历史版本。暂存区代码提交到本地库,生成对应的历史版本(删不掉了,除非删库跑路)。生成历史版本后,从本地库将代码推送到远程库(push)。
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单成为远程库。
局域网:GitLab
互联网:GitHub(外网),Gitee码云(国内网站)
Git官网:https://git-scm.com
点击DownLoad for Windows
选择相应版本即可,打不开就查看网页源代码,复制下载链接到迅雷
下载完成,打开
选择安装位置,路径最好非中文,没有空格
后面一路next,最后install,finish即可
桌面右键
安装成功
点击Git Bash Here,查看当前版本
签名的作用是区分不同操作者身份。用户的签名在每一个版本的提交信息中能够看到,以此确认本次提交是谁做的。Git首次安装必须设置以下用户签名,否则无法提交代码。
注意:这里设置的用户签名和将来登录GitHub的账号没有任何关系
可以在当前电脑用户下找到.gitconfig查看
比如你的项目代码如下,你要用git去管理它
首先进入到项目目录中,右键Git Bash Here
输入命令
此时就在项目目录下生成了空的git库,.git文件默认隐藏,需要设置查看
或者在命令行使用命令: ll -a 查看
所在分支,是否提交过,未被追踪的文件(只存在于工作区),使用git add命令添加到暂存区
自动转换行末换行符
再次查看本地库状态
此时这个文件就在缓存区了 ,使用提示命令将它从暂存区删除
将暂存区文件提交到本地库
git commit -m "日志信息" 文件名
提示帮我们转换了行末换行符,主干分支首次提交,一个文件被改变,3行内容被插入
方括号里的7位字符就是版本号的前七位
查看版本信息
详细信息
修改hello.txt
查看本地库状态
红色表示当前修改还没有被添加到暂存区
添加进暂存区
提交本地库
查看版本信息
详细信息
版本穿梭
git reset --hard 版本号
查看当前的版本
切换到第一次提交的版本
此时工作区中内容也会改变
查看版本信息
可以在.git/refs/heads/master中查看当前master分支版本号
Git切换版本,底层其实是移动的HEAD指针
在版本控制中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是一个单独的副本。(分支底层其实也是指针的引用)
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
查看分支
创建分支
查看分支
切换分支
修改hello.txt,保存
将其添加暂存区,提交本地库
合并分支
先切换回master分支
将hot-fix合并到当前分支
冲突合并
冲突产生的原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个,必须人为决定新代码内容。
先在master分支修改hello.txt,并添加暂存区,提交本地库
切换分支,修改同一位置,添加暂存区,提交本地库
切换回master分支,合并hot-fix分支,合并分支冲突
查看状态
手动合并,打开hello.txt
手动删除到自己想要的状态
将修改后的hello.txt,添加暂存区
提交本地库(注意不要加文件名)
合并成功
为什么要忽略它们呢?
因为它们与项目的实际功能无关,不参与在服务器上部署运行。把它们忽略掉能屏蔽IDE工具之间的差异。
怎么忽略?
创建忽略文件xxxx.ignore(建议时git.ignore)
这个文件可以存放在任何位置,但是为了便于让~/.gitconfig文件引用,建议也放在用户家目录下。
模板如下
# 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
在用户家目录(C:/用户/xxx)下新建文本文档,将模板复制进去,改下扩展名
在.gitconfig文件中引用忽略配置文件
选择自己的git.exe安装目录,test显示正确版本号即可
创建Git本地库
此时可以看到没有被忽略的文件变红了,说明它没有被添加到暂存区。
右键将其添加
变绿说明加入到了暂存区,但还没有提交到本地库
右键将其提交
填写Commit Message提交即可
此时文件颜色正常了,就是成功了
先对已提交代码进行修改
发现它变蓝了,说明这个文件被追踪过,但被修改了
将他进行添加暂存区,提交本地库(可以看到和上次提交代码的差别),又恢复正常颜色了
追踪过的文件可以直接提交本地库
查看版本信息
点击想要切换的版本,右键checkout revision
此时代码也切换到了对应的版本
输入要创建的分支的名字,并选择创建后切换分支
右下角显示当前所处分支
如何切换回来,点击它即可
切换回hot-fix分支,修改代码,提交本地库
再切换回master分支,将hot-fix合并到master分支
合并冲突的情况
切换回hot-fix分支,修改代码,提交本地库
再切换回master分支,修改同一个位置的代码,并提交本地库
再次合并,产生冲突
点击merge,手动合并