一、Git概述
Git是一个免费、开源的分布式版本控制系统,旨在快速、高效的处理从小型到超大型项目的管理。
1.1 关于版本控制
-
什么是版本控制?
版本控制是一种记录一个或若干文件内容变化,记录文件修改的历史版本的系统,以便将来查阅特定版本修订情况,方便进行版本切换(将文件回溯到之前的某个状态)。 -
我们为什么需要版本控制?
从个人开发过渡到高效的团队协作。在接触到版本控制工具之前,我在需要不断修改某个项目的时候,最简单的做法就是修改一次就复制整个目录,并在命名时加上备份时间加以区分。但是修改频率高了就很难实施了,而且有不小心删掉或者覆盖掉某些重要版本的风险。最重要的是如果多人合作时,两个人同时修改某个文件的某个部分,到时候要如何做合并?如何记录谁在什么时候修改了什么内容?使用版本控制系统能几乎不增加额外工作量的情况下解决上面的问题。
1.2 版本控制工具
- 集中式 VS 分布式
- 集中式版本控制系统 (Centralized Version Control Systems) 比如SVN,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。这种做法的好处是每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个服务器要远比在各个客户端上维护本地数据库来得轻松容易。缺点就是中央服务器单点故障,在自己的本地工作区上不能做版本控制。
- 分布式版本控制系统(Distributed Version Control System) 比如Git,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。相比集中式这样做的好处一是版本控制在本地进行,远程服务器断网也能进行开发;二是每个客户端都保存完整的项目和历史记录,更加安全。
Git与SVN的区别
【参考菜鸟?】
1.3 Git简史
- 1991-2002年间,Linux内核开源项目有着为数众广的参与者。绝大多数的Linux内核维护工作都花在了提交补丁和保存归档的繁琐事务上(Linus Torvalds手动合并代码)。
- 到2002年,整个项目组开始启用一个专有的分布式版本控制系统BitKeeper来管理和维护代码。
- 到了2005年,开发BitKeeper的商业公司同Linux内核开源社区的合作关系结束,他们收回了Linux内核社区免费使用BitKeeper的权力。
- 从2005年4月3号开始开发, Linux之父Linus到4月7日仅四天时间就开发出了Git雏形。到同年6月份,Linux已经在使用Git管理代码了。
- Github诞生于2008年,现在已经是全球最大的代码托管平台。他们使用的技术栈非常简易,Ruby、Shell和C。
1.4 工作机制
。。。
1.5 托管中心/远程库
代码托管中心是基于网络服务器的远程代码仓库,比如GitHub(全球最大)、Gitee码云(中国)、GitLab(局域网)
二、Git客户端安装
Windows平台安装,下载exe文件并
官网 https://git-scm.com/download/win
官网慢,可以用国内镜像 https://npm.taobao.org/mirrors/git-for-windows/
2.1 安装
- 运行exe文件,一直点Next下一步保持默认即可,部分可选项的含义如下
- 安装成功:右键菜单有git bash和git gui选项,打开git bash,可以用Ctrl+滚轮调整字体大小,输入git --version可以查看版本号
2.2 配置
- git config用来配置或读取相应的工作环境变量。这些环境变量,决定了 Git 在各个环节的具体工作方式和行为,遵循就近原则。
git config --system #系统中对所有用户都适用的配置,读写的是安装目录[mingw64]/etc/gitconfig文件
git config --global #对当前用户的所有项目有效,读写的是[系统用户目录]/.gitconfig文件
git config #仅仅针对当前项目有效,读写的是当前项目的.git/config文件
- 当安装完 Git 应该做的第一件事就是设置用户名称与邮件地址,每一次Git提交都会使用这些信息,修改了文件总得让git知道是哪个用户修改的吧
git config --global user.name "TTK"
git config --global user.email test@qq.com
# 配置成功后可以看在[系统用户目录]下生成了.gitconfig文件,里面有刚配置的信息
# 也可以直接在文件里修改配置信息
-
可以使用
git config --list
命令来显示所有Git当时能找到的配置,用git config user.name
来查看具体某个配置。 -
可以用
git config --global core.editor vim
命令配置默认文本编辑器 -
还有一个比较常用的是,在解决合并冲突时使用哪种差异分析工具。比如要改用 vimdiff 的话:
git config --global merge.tool vimdiff
,
Linux平台安装。。。
三、Git本地仓库的使用
git bash中可以使用linux的命令,都是bash嘛
【做个表,记录所用常用命令?】
3.1 基本操作
创建本地库
- 进入到你想管理的那个目录下,执行下面的命令成功后项目中生成 .git 这个隐藏目录, 这就是你的Git本地仓库了。
git init #也可以指定文件路径,如git init D:/repo 路径也可以是相对的
- .git目录下各文件的作用
- config文件-- 包含一些配置选项
- objects目录–存储所有Git的数据对象
- HEAD文件–指定当前分支
- info目录–存放项目信息,默认包含一个全局exclude文件,用来放置不希望记录在.gitignore 中的忽略模式
- description文件–仅供GitWeb 程序使用
- hooks 目录–存放可在某些指令前后触发运行的钩子脚本,默认包含一些脚本样例
- refs目录–存储各个分支指向的目标提交
查看当前状态
- 使用
git status
命令查看当前的状态,新写个hello.txt文件之后再查看会发现状态不同了,有了一个Untracked files显示hello.txt未被纳入版本控制。
添加暂存区
- 使用
git add 文件名
命令把新建的文件添加到暂存区
- 可以使用
git rm --cached file
命令从暂存区删除file
提交本地库
git commit -m "注释内容" #将暂存区的所有内容提交到本地仓库
git commit -a #将所有已经使用git管理过的文件暂存后一并提交,相当于省略add操作
git commit -am "注释内容"
查看版本日志
git log #参数:-p展开每次提交的内容差异,-2显示最近的两次更新
git log --pretty=oneline #简化的一行显示,看起来比较舒服
git reflog #比上面那个还简化,一行显示且版本id只显示前几位
git log --author #查看指定用户的操作
git log --before={3.weeks.ago} --after={2020-04-18} #如果你要指定日期,可以执行几个选项:--since 和 --before,但是你也可以用 --until 和 --after
git log --graph #查看历史中什么时候出现了分支、合并
git log --reverse #逆向显示日志
版本穿梭
git reset --hard 版本号 #版本号可以写前几位,只要不重复就行
- git中是用指针来控制版本穿梭的,head指向分支(比如master),分支指向版本(某个版本号)
- 版本穿梭的操作也会生成版本日志
3.2 分支管理
什么是分支?
在版本控制过程中,同时推进多个任务。我们可以为每个任务创建单独的分支,可以同时推进多个功能模块的开发,提高开发效率;如果一个分支开发失败,不会对其他分支造成影响。简单的看起来,分支像是一个单独的副本(分支的底层其实是用指针的引用实现的)
基本命令
查看分支: git branch #查看分支名 可以加-v参数,会有详细信息
创建分支: git branch 分支名
选择分支: git checkout 分支名 #改变分支
合并分支: git merge 要被合并的分支名 #把指定的分支合并到当前分支
分支合并冲突
- 产生的原因:合并分支时,两个分支在同一个文件有两套完全不同的修改,Git无法决定使用哪一个,需要我们人为的修改,产生冲突的表现形式如下图所示
- 产生冲突后文件如下图所示,用一串
<<<<<
和>>>>>
特殊符号包裹有冲突的内容,=====
上面部分是当前分支下的内容,下面部分是要被合并的分支的内容,需要我们把提示信息删掉,手动修改要保留的内容,保存后执行add、commit操作,成功后分支名后面的MERGING字段就没有了
远程代码仓库github\gitee\gitlab 见这篇