Git和SVN版本控制区别就是:GIT是分布式的,每一个用户都可以做版本控制;
版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据,以节约存储空 间,提高运行效率。这方面 SVN 采用的是增量式管理的方式,而 Git 采取了文 件系统快照的方式,效率高。
权限控制
对团队中参与开发的人员进行权限控制。
对团队外开发者贡献的代码进行审核——Git 独有。
Git和代码托管中心
代码托管中心的任务:维护远程库
局域网环境下: GitLab 服务器
外网环境下 :GitHub 、 码云
Git的优势
大部分操作在本地完成,不需要联网
完整性保证
尽可能添加数据而不是删除或修改数据
分支操作非常快捷流畅 ,类似于指针指向切换
与 Linux 命令全面兼容
Git 命令行操作
.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡 乱修改。
git init初始化,后需要设置签名 :区分不同开发人员的身份
这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关 系。
命令
项目级别/仓库级别:仅在当前本地库范围内有效
gitconfiguser.nametom_pro
信息保存位置:./.git/config 文件
系统用户级别:登录当前操作系统的用户范围
gitconfig--globaluser.nametom_glb [email protected]
信息保存位置:~/.gitconfig 文件
级别优先级
就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别 的签名
如果只有系统用户级别的签名,就以系统用户级别的签名为准
二者都没有不允许
基本操作
状态查看 git status :查看工作区、暂存区状态;
添加 git add [filename] : 将工作区的“新建/修改”添加到暂存区
提交 git commit -m "commitmessage" [filename] :将暂存区的内容提交到本地库
查看历史记录 git log 、git log--pretty=oneline 、git log--oneline、git reflog:多屏显示控制方式: 空格向下翻页 b 向上翻页 q 退出 git reflog:HEAD@{移动到当前版本需要多少步}
前进后退 :基于索引值操作[推荐] gitreset--hard[局部索引值] gitreset--harda6ace91 --hard 参数 在本地库移动 HEAD 指针 重置暂存区 重置工作区
删除文件并找回 前提:删除前,文件存在时的状态提交到了本地库。 操作:gitreset--hard[指针位置] 删除操作已经提交到本地库:指针位置指向历史记录 删除操作尚未提交到本地库:指针位置使用 HEAD
比较文件差异 gitdiff[文件名] 将工作区中的文件和暂存区进行比较 gitdiff[本地库中历史版本][文件名] 将工作区中的文件和本地库历史记录比较 不带文件名比较多个文件
分支操作
创建分支 git branch[分支名]
查看分支 git branch-v
切换分支 git checkout[分支名]
合并分支 第一步:切换到接受修改的分支(被合并,增加新内容)上 git checkout[被合并分支名] 第二步:执行 merge 命令 git merge[有新内容分支名]
Git 基本原理:
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下 几个共同点: ①不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定。 ②哈希算法确定,输入数据确定,输出数据能够保证不变 ③哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大 ④哈希算法不可逆 Git 底层采用的是 SHA-1 算法。 哈希算法可以被用来验证文件。原理如下图所示:
Git保存版本的机制
集中式版本控制工具的文件管理机制 以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本 文件和每个文件随时间逐步累积的差异。
Git 的文件管理机制 :Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前 的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改, Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的 工作方式可以称之为快照流。
Git 工作流
集中式工作流 像 SVN 一样,集中式工作流以中央仓库作为项目所有修改的单点实体。所有 修改都提交到 Master 这个分支上。 这种方式与SVN的主要区别就是开发人员有本地库。 Git很多特性并没有用到。
Gitflow 工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布 迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
Forking 工作流是在 GitFlow 基础上,充分利用了 Git 的 Fork 和 pullrequest 的 功能以达到代码审核的目的。更适合安全可靠地管理大团队的开发者,而且能接受 不信任贡献者的提交。
GitFlow 工作流详解
分支种类
主干分支 master 主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境 完全一致。
开发分支 develop 主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
bug 修理分支 hotfix 主要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修 理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
准生产分支(预发布分支) release 较大的版本上线前,会从开发分支中分出准生产分支,进行最后阶段的集 成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后 可以视情况删除。
功能分支 feature 为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支 中独立出来。 开发完成后会合并到开发分支。
1.创建项目并提交到远程Git仓库:创建好项目,选择VCS - > Import into Version Control -> Create Git Repository
下图是Git与提交有关的三个命令对应的操作,Add命令是把文件从IDE的工作目录添加到本地仓库的stage区,Commit命令把stage区的暂存文件提交到当前分支的仓库,并清空stage区。Push命令把本地仓库的提交同步到远程仓库。
IDEA中对操作做了一定的简化,Commit和Push可以在一步中完成。
具体操作,在项目上点击右键,选择Git菜单
因为是第一次提交,Push前需要指定远程仓库的地址。如下图,点击Define remote后,在弹出的窗口中输入远程仓库地址。
获取更新有两个命令:Fetch和Pull,Fetch是从远程仓库下载文件到本地的origin/master,然后可以手动对比修改决定是否合并到本地的master库。Push则是直接下载并合并。如果各成员在工作中都执行修改前先更新的规范,则可以直接使用Pull方式以简化操作。
2.新功能的任务,创建了一个分支并在分支上开发
建分支也是一个常用的操作,例如临时修改bug、开发不确定是否加入的功能等,都可以创建一个分支,再等待合适的时机合并到主干。
创建流程如下:
选择New Branch并输入一个分支的名称
创建完成后注意IDEA的右下角,如下图,Git: wangpangzi_branch表示已经自动切换到wangpangzi_branch分支,当前工作在这个分支上。
点击后弹出一个小窗口,在Local Branches中有其他可用的本地分支选项,点击后选择Checkout即可切换当前工作的分支。
如下图,点击Checkout
注意,这里创建的分支仅仅在本地仓库,如果想让组长小张获取到这个分支,还需要提交到远程仓库。
3.分支提交到远程Git仓库
切换到新建的分支,使用Push功能
4.获取提交的分支
使用Pull功能打开更新窗口,点击Remote栏后面的刷新按钮,会在Branches to merge栏中刷新出新的分支。这里并不想做合并,所以不要选中任何分支,直接点击Pull按钮完成操作。
更新后,再点击右下角,可以看到在Remote Branches区已经有了新的分支,点击后在弹出的子菜单中选择Checkout as new local branch,在本地仓库中创建该分支。完成后在Local Branches区也会出现该分支的选项,可以按上面的方法,点击后选择Checkout切换。
5、分支合并到主干
新功能开发完成,体验很好,项目组决定把该功能合并到主干上。
切换到master分支,选择Merge Changes
选择要合并的分支,点击Merge完成
1、选中要回退的文件或者项目
2、复制要回退版本的版本号:
3、然后在branches里check out你想要回退的版本
选择Checkout Tag or Revision…
在弹出的窗口粘贴刚刚复制的版本号,然后点击OK,版本回退成功。