简介
Git是目前世界上最先进的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目
Git的作用:
1. 协同开发
2. 版本记录
3. 解决冲突
4. 历史追查
5. 代码备份
6. 版本还原
7. 权限管理
8. 分支管理
9. 代码审查
...
Git 完整命令手册地址:http://git-scm.com/docs
PDF 版命令手册:https://www.runoob.com/manual/github-git-cheat-sheet.pdf
Git和SVN的区别
1. Git是分布式的,SVN,CVS是集中式的:
这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
2. Git把内容按元数据方式存储,而SVN是按文件:
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn、.cvs等的文件夹里。
3. Git分支和SVN的分支不同:
分支在SVN中一点都不特别,其实它就是版本库中的另外一个目录。
4. Git没有一个全局的版本号,而 SVN 有:
目前为止这是跟SVN相比Git缺少的最大的一个特征。
5. Git的内容完整性要优于SVN:
Git的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
![]()
Git的安装
1. 命令行工具:git for windows(要写相应的命令)
下载地址:https://gitforwindows.org/
官网慢,可以用国内的镜像:https://npm.taobao.org/mirrors/git-for-windows/
2. 可视化工具:TortoiseGit(不用命令行来提交)
下载地址:https://tortoiseGit.org/
3. IDEA的插件
4. github网站:http://www.github.com
配置Git签名
选中你要作为git工程存放的目录,然后单击鼠标右键,选中git bash即可
由于git是分布式版本控制工具,所以我们需要填写用户名和邮箱作为一个标志
在 C:\用户(Users)\对应的用户名 的路径下,在.gitconfig文件里可以看到--global属性,所有的git项目都会共用此属性
进入git bash后,输入命令:
git config --global user.name '用户名'
git config --global user.email '邮箱'
创建版本库
在git bash中输入命令初始化版本库:git init
随后会在此目录下生成一个.git文件夹
Git相关的命令
1. 查看文件状态:
git status
2. 将文件或目录添加到临时暂存区:(此时的文件并没有真正的提交)
git add 文件名/目录名
3. 提交文件(把所有在临时暂存区的文件都一起提交):
git commit
git commit -m '提交的提示信息'
注:每当有文件被修改/删除/添加时,都需要重新git add,然后再git commit
4. 查看日志(历史记录):
git log
git log --pretty=oneline (显示出来比较简洁)
5. 回退历史(回退到某一次的提交版本):
git reset --hard HEAD^1 (回退到上一次提交的版本)
git reset --hard HEAD~n (回退到n个版本之前的版本)
git reset --hard HEAD 版本号 (回退到对应版本号的版本)
(HEAD是一个指针,永远指向最新的版本,^1表示让HEAD指针指向上一个版本)
(--hard:不仅回退版本,还会将指定数据抹除,不会保留任何修改的记录)
(--soft:回退版本,并会保留任何修改的记录,会自动git add)
(--mix:回退版本,并会保留任何修改的记录,但是不会自动git add)
此方式虽然可以恢复到之前某个提交的版本,但恢复后,当前版本之后的版本将会消失
6. 版本穿越:
git reflog (查看历史记录的版本号)
git reset --hard 对应版本的id号 (会穿越到对应id号的版本)
7. 还原文件:
git checkout 文件名
8. 删除文件:
1) 手动删除文件
2) git add
3) git commit
或
1) git rm -rf 文件名 (从版本库中删除该文件)
2) git commit
9. 查看当前文件和本地库对应文件的区别:
git diff head --文件名
(git对文件修改跟踪的是修改记录,而不是整个文件)
10. 文件撤销修改
情况一:数据只在工作区
git checkout --文件名 (丢弃工作区的修改)
情况二:数据使用add添加到暂存区
git reset HEAD 文件名(先从暂存区移除相应的文件)
git checkout --文件名 (再丢弃工作区的修改)
情况三:数据使用add添加到暂存区并commit到本地库
git reset --hard HEAD...(使用版本回退)
Git---工作区,暂存区,本地库间的关系
工作区:工程的目录
本地库:工作区里的一个隐藏目录.git,就是Git的本地库
暂存区:一般存储在.git目录下的index文件,所以暂存区有时候也称作索引
关系图:
![]()
Git分支
分支图:
![]()
分支的相关命令:
1. 查看分支:
git branch -v
2. 创建分支:
git branch 分支名
3. 创建分支并切换分支:
git checkout -b 分支名
4. 切换分支:
git checkout 分支名
5. 删除分支:
git branch -d 分支名
6. 合并分支:(将其他子分支合并到主分支(master)上)
1) 切换到主分支:git checkout master
2) 合并:git merge 子分支名
7. 在合并分支时默认会使用Fast forward模式
禁用Fast forward模式:git merge --no-ff 子分支名
Fast Forward和no fast foward合并模式的对比:
![]()
分支策略:
![]()
8. bug分支的使用场景:
现有主分支master
从主分支切了一个dev分支开发一个功能,但只写了一半
此时线上和master项目有重大的bug需要立刻修复
但现在还在dev分支上开发新功能,但还没开发完不能提交,所以可以先把这部分的工作现场储存起来:git stash
然后切换到master分支上,新建并切换到bug分支来解决bug
当解决完bug后,再回到master分支上合并这个bug分支,随后删掉此bug分支
然后可以回到dev继续开发原来的功能,恢复之前的工作现场:git stash pop(恢复第一个工作现场)
(git stash list:显示当前分支储藏的工作区的集合)
Git---分支合并冲突
冲突一般指同一个文件同一位置的代码,在两种版本的仓库合并时,版本的管理软件无法判断到底保留哪一个版本,因此会提示该文件发生冲突
冲突一般都需要程序员手动解决
查看冲突:
git diff
在分支合并的时候解决冲突
解决冲突:
切换到发生冲突的目录中,查看对应的文件
(可根据需求删除对应的东西)
再重新git add和git commit
Git一般的工作流程
1. 克隆 Git 资源作为工作目录。
2. 在克隆的资源上添加或修改文件。
3. 如果其他人修改了,你可以更新资源。
4. 在提交前查看修改。
5. 提交修改。
6. 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
流程图:
![]()
关于github
github是一个git项目托管网站,主要提供基于git的版本托管服务
官网:https://github.com/ (全球)
https://gitee.com/ (中国)
注册账号时的注意事项:
不要使用163邮箱,有可能收不到校验邮件
较长时间不使用,有可能被冻结账号
若账号被冻结,可进入网址:http://github.com/contact 恢复解冻申请
![]()
github的一些操作
远程仓库配置:
创建SSH Key
ssh-keygen -t rsa -C '邮箱'
(详情可查看之前发布的文章《git上传代码到远程仓库(附:生成秘钥)》)
1. 新建本地仓库
1) 创建相应的子目录
2) 搭建代码库
git init
git config user.name "xxx"
git config user.email "xxx"
3) 提交代码
git add
git commit
2. 注册github账号
3. 创建github的项目仓库
![]()
4. 推送代码从git本地库到github远程库(把本地库和远程库进行关联)
1) 增加远程地址(关联)
git remote add <远端代号> <远端地址>
(远端代号:远程链接的代号,一般直接用origin,也可自定义)
(远端地址:远程链接的url)
2) 推送到远程库
git push <远端代号> <分支名>
(多人协作)
5. 下载github上的项目仓库
1) 从github上克隆
git clone <远端地址> <项目的目录名>
(项目的目录名:指为克隆的项目在本地新建的一个目录名(可以不填,默认使用github仓库名))
(在clone时默认是把当前地址里的所有分支全部clone下来,但只有master显示,原因是没有关联。若想要显示其他的分支:git checkout -b dev <远端代号>/子分支名)
2)当在此克隆的项目库中修改文件,并想要重新推送到远程仓库时,往往会有权限不够的问题导致失败
相关的权限设置:(邀请相应的合作伙伴,允许其修改)
![]()
设置完相关的东西后,在对应的克隆项目的目录下重新输入命令进行提交并推送到远程库中
git add ...
git commit ...
git push origin master
3) 被修改的用户同步更新代码
从github中更新项目,在被修改的用户的目录下输入命令:
git pull <远程代码> <远程分支>
e.g. git pull origin master
查看远程库的信息:git remote -v
多人协作的演示思路:
![]()
协作冲突
协作冲突:在上传或同步代码时,由于你和他人都修改了同一文件同一位置的代码,版本管理工具无法判断究竟以谁为准,这就会报告冲突,需要程序员手动解决
![]()
解决方法:
1. 修改合并
2. git add
3. git commit
第三方协作场景(利用fork来修改)
![]()
第三方用户fork出某个对应库
![]()
第三方用户修改fork出来的某个文件后,再同步提交
![]()
操作完成后,项目管理者就会收到一封请求同步的邮件,并到github上确认同步
![]()
第三方通过对目标仓库进行fork,并修改里面的东西
要想把此修改的东西同步提交到原始的目标仓库中,可以使用pull request(即同步代码)
gitee的使用
1. 在gitee配置ssh(生成ssh在上面有说)
头像 --> 设置 --> ssh公钥
![]()
2. 初始化本地仓库
3. 在gitee上创建仓库
4. 把本地仓库和gitee上的仓库关联
![]()
5. 把本地仓库推送到gitee
git push -u origin 分支名
6. 把远程仓库clone到本地库
git clone <远程地址>
GitLab(了解)
称为"自架私服版"的github
官网:https://about.gitlab.com
安装:(在linux环境下)
1. 下载依赖
CentOS7:
sudo yum install -y curl policycoreutils-python openssh-server`
sudo systemctl enable sshd
sudo systemctl start sshd
sudo firewall-cmd --permanent --add-service=http
sudo systemctl reload firewalld
CentOS6:
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
2. 下载并添加GitLab软件包仓库
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
3. 安装软件包
sudo EXTERNAL_URL="自己访问gitlab的url(域名或地址)" yum -y install gitlab-ee
4. 配置https需要另外配置
5. 预配gitlib的组件
gitlab-ctl reconfigure
6. 修改gitlab的配置url
vi /etc/gitlab/gitlab.rb
external _url 自己访问gitlab的url(域名或地址)
vi /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
7. 修改windows的hosts
在相应的ip地址后面加上自己访问gitlab的url(域名或地址)
启动gitlab:
gitlab-ctl start(启动)/ stop(停止)/ restart(重启)
然后在浏览器上输入自己相应的gitlab网址,即可访问
IDEA软件整合git(了解)
1. 在github上创建一个库
2. 打开IDEA软件,选择setting --> Version Control --> git
3. 然后选择github,添加账户(需要先在github中生成授权的令牌)
使用令牌添加github的账户
然后就可以开始使用git的一些特性了
任何想要上传到github的文件:
右键此文件 --> git --> add/commit
想要推送到远程仓库:
repostory --> clone/push/pull
如果有冲突,则选择merge