目录
介绍
版本控制工具应该具备的功能
- 协同修改
多人并行不悖的修改服务器端的同一个文件。 - 数据备份
不仅保存目录和文件的当前状态, 还能够保存每一个提交过的历史状态。 - 版本管理
在保存每一个版本的文件信息的时候要做到不保存重复数据, 以节约存储空
间, 提高运行效率。 这方面 SVN 采用的是增量式管理的方式, 而 Git 采取了文
件系统快照的方式。 - 权限控制
对团队中参与开发的人员进行权限控制。
对团队外开发者贡献的代码进行审核——Git 独有。 - 历史记录
查看修改人、 修改时间、 修改内容、 日志信息。
将本地文件恢复到某一个历史状态。 - 分支管理
允许开发团队在工作过程中多条生产线同时推进任务, 进一步提高效率。
Git
Git 的优势
- 大部分操作在本地完成, 不需要联网
- 完整性保证
- 尽可能添加数据而不是删除或修改数据
- 分支操作非常快捷流畅
- 与 Linux 命令全面兼容
Git的安装
- 在git官网下载git安装程序,全部默认安装即可;
Git结构
Git跟代码托管中心
代码托管中心:维护远程库
- 局域网
- GitLab服务器
- 外网
- GitHub
- 码云
本地库跟远程库交互
- 团队内部协作
- 跨团队协作
使用
本地库初始化
- 命令:git init
- 说明:在某个目录下执行该命令,则以当前目录为本地库
设置签名
- 形式:
用户名,Email地址 - 作用:区分不同开发人员的身份
- 这里设置的签名跟登录远程库的账号密码没有任何关系
- 命令
- 项目级别/本地仓库级别:仅仅在本地范围有效
- git config user.name huzd
- git config user.email huzd@123.com
- 最终会在master目录的.git目录的config文件下记录
- 系统用户级别:登录当前操作系的用户范围
- git config --global user.name huzd
- git config --global user.email huzd@123.com
- 最终会在用户家目录(cd ~),下面有个.gitconfig文件中记录
- 级别优先级:两者必须设置一个,并且就近原则;
- 项目级别/本地仓库级别:仅仅在本地范围有效
基本操作
- 状态查看:git status
- 添加:git add [file name]
- 提交:git commit -m “commit message” [file name]
- 查看历史记录:
git log- git log --pretty=oneline:一行显示
- git log --oneline:一行显示
git reflog:显示指针等信息
- 前进后退:
- git reset --hard 索引值
- 使用^符号(只能后退,并且一个符号退一个版本):git reset --hard^
- 使用~符号:git reset --hard~3表示退三步
- reset的三个参数对比
- –soft参数:仅仅在本地库移动HEAD
- –mixed参数:在本地库移动HEAD指针并重置缓冲区
- –hard参数:在本地库中移动HEAD指针并重置缓存区跟工作区;
- 删除:
- 删除本地库:其实就是本地库已经存在了记录,在工作区删除文件了之后将这个状态还是用git add 添加到暂存区,然后再提交即可,那么本地库中的文件也会被删除,但是所有的删除都是有历史记录的,可以恢复;
- 删除暂存区:git reset --hard HEAD,意思就是以目前本地库中最新内容同步暂存区中数据
- 比较文件差异
- 比较与暂存区中文件的差异:git diff file
- 比较与本地库中文件的差异:git diff HEAD file
- 比较与本地库中上个版本的差异:git diff HEAD^ file
分支
- 解释:在版本控制中,使用多条线路同时推进多个任务
- 好处
- 同时并行推进多个任务,提高效率
- 各个分支相互独立开发,互不影响;
- 使用
- 创建分支:git branch name
- 查看分支:git branch -v
- 切换分支:git checkout name
- 合并分支:
- 切换到被合并分支:git checkout 被合并分支
- 使用merge命令:git merge 合并分支
- 解决冲突:
- 第一步: 编辑文件, 删除特殊符号
- 把文件修改到满意的程度, 保存退出
- git add [文件名]
- git commit -m “日志信息”
注意: 此时 commit 一定不能带具体文件名
Git基本原理
- 哈希
- 不管输入数据的数据量多大,输入同一个哈希算法,得到加密的结果长度一致
- 哈希算法确定,输入数据确定,输出数据不变
- 哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
- 哈希算法不可逆
- Git的“提交对象”
- 分支创建
刚开始只有master分支,创建testing分支之后指向相同
切换到testing分支
testing分支做修改
切换回master分支
主分支也进行修改
- 分支创建
与GitHub使用
推送到远程库(团队内协作)
- 在GitHub官网注册用户
- 在用户下创建新库并且复制新库地址
- 设置remote信息
- 查看远程库信息:git remote -v [show name]
- 增加远程库信息:git remote add origin 远程库地址
- 使用git push origin master将本地库主分支推送到远程库新库中;
clone到本地文件夹中
- 直接复制git项目路径
- 在本地某个目录下执行 git clone 远程地址
- 效果
- 完整的把远程库下载到本地
- 创建origin远程地址别名
- 初始化本地库
添加团队
- 若其他人clone下来做了处理之后想推送到原库中,需要添加到团队,需要由原创建者在项目中的Collaborators中增加对方账号;
- 然后复制链接给对方登录同意即可;
pull拉取
- git fetch origin master:将远程库中的主分支设置为FETCH_HEAD,参考
- git merge orgin/master:将origin/master合并到当前分支
- git pull origin master:pull=getch+merge,直接合并远程分支到当前分支
跨团队协作
在eclipse中使用
- 初始化本地项目
工程→右键→Team→Share Project→Git - 概念: Eclipse 特定文件
这些都是 Eclipse 为了管理我们创建的工程而维护的文件, 和开发的代码没有
直接关系。 最好不要在 Git 中进行追踪, 也就是把它们忽略。
.classpath 文件
.project 文件
.settings 目录下所有文件 - 为什么要忽略 Eclipse 特定文件呢
同一个团队中很难保证大家使用相同的 IDE 工具, 而 IDE 工具不同时, 相关工
程特定文件就有可能不同。 如果这些文件加入版本控制, 那么开发时很可能需要为
了这些文件解决冲突 - 添加冲突文件:在.gitconfig文件同级目录增加Java.gitignore
- 可参考https://github.com/github/gitignore
# 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
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.settings
.project
target
- 主要需要使用/不能使用\
推送到远程库
- 右键–team–remote–push然后填入相关信息即可;
clone到本地
- import–projects from git–clone url然后填入相关即可
- 注意只能选择普通项目导入,因为缺少相关eclipse文件支持
- 然后右键–configure–convert to maven project;
解决冲突
- 先pull下来,然后右键–team-merge tool 处理即可;