一:实用指令
1.初始化本地git仓库(git init)
在某个文件夹下使用git init初始化git仓库,会生成一个隐藏文件夹.git
注意:.git 目录中存放的是本地库相关的子目录和文件,不要删除,也不要胡乱修改。
2.设置签名(git config [--global] user.name / git config [--global] user.email)
作用:区分不同开发人员的身份,这里设置的签名和登录远程库(代码托管中心)的账号、密码没有任何关系
项目级别/仓库级别:仅在当前本地库范围内有效。
系统用户级别:登录当前操作系统的用户范围
级别优先级:
1)就近原则:项目级别优先于系统用户级别,二者都有时采用项目级别的签名
2)如果只有系统用户级别的签名,就以系统用户级别的签名为准
3)二者都没有不允许
3.状态查看(git status)
作用:查看工作区、暂存区状态
4.添加(git add [file name])
作用:将工作区的“新建/修改”添加到暂存区
先建a.txt
5.还原到提交前状态(git rm --cached [file name])
6.提交(git commit -m "备注信息" [file name])
7.查看历史记录(git log)
多屏显示控制方式:空格向下翻页,b 向上翻页,q 退出
为了测试方便,多次修改多次提交
git log --pretty=oneline / git log --oneline(每条日志只显示一行)
git reflog(可以显示移动到某版本需要几步)
8.前进后退
原理:就是HEAD指针的移动
基于索引值进行前进后退(推荐使用)
git reset --hard [局部索引值]
使用^符号/~符号:只能后退
git reset --hard HEAD^ / git reset --hard HEAD~n
注:一个^表示后退一步,n 个表示后退 n 步,~n表示后退n不
reset 命令的三个参数对比:
--soft 参数:仅仅在本地库移动 HEAD 指针
--mixed 参数:在本地库移动 HEAD 指针,重置暂存区
--hard 参数:在本地库移动 HEAD 指针,重置暂存区,重置工作区
9.删除文件并找回(git reset --hard [指针位置])
前提:删除前,文件存在时的状态提交到了本地库。
删除操作已经提交到本地库:指针位置指向历史记录
删除操作尚未提交到本地库:指针位置使用 HEAD
10.比较文件差异
git diff [文件名]:将工作区中的文件和暂存区进行比较
git diff [本地库中历史版本] [文件名]:将工作区中的文件和本地库历史记录比较,不带文件名比较多个文件
11.创建分支(git branch [分支名]),查看分支(git branch -v),切换分支(git checkout [分支名])
12.合并分支
第一步:切换到接受修改的分支(被合并,增加新内容)上
第二步:执行 merge 命令(git merge [有新内容分支名])
解决冲突:
冲突表现,分别在master及hot_fix分支对a.txt文件进行修改并提交到本地库
冲突的解决:
1)编辑文件,删除特殊符号
2)把文件修改到满意的程度,保存退出
3)git add [文件名]
4)git commit -m "日志信息",此时 commit 一定不能带具体文件名
二:Git基本原理
1.哈希加密算法
哈希是一个系列的加密算法,各个不同的哈希算法虽然加密强度不同,但是有以下几个共同点:
1)不管输入数据的数据量有多大,输入同一个哈希算法,得到的加密结果长度固定
2)哈希算法确定,输入数据确定,输出数据能够保证不变
3)哈希算法确定,输入数据有变化,输出数据一定有变化,而且通常变化很大
4)哈希算法不可逆
Git 底层采用的是 SHA-1 算法,哈希算法可以被用来验证文件。原理如下图所示
Git 就是靠这种机制来从根本上保证数据完整性的。
2.Git 保存版本的机制
集中式版本控制工具的文件管理机制:以文件变更列表的方式存储信息。这类系统将它们保存的信息看作是一组基本文件和每个文件随时间逐步累积的差异。
Git 的文件管理机制:Git 把数据看作是小型文件系统的一组快照。每次提交更新时 Git 都会对当前的全部文件制作一个快照并保存这个快照的索引。为了高效,如果文件没有修改,Git 不再重新存储该文件,而是只保留一个链接指向之前存储的文件。所以 Git 的工作方式可以称之为快照流。
Git 文件管理机制细节
Git 的“提交对象”
提交对象及其父对象形成的链条
Git 分支管理机制
分支的创建:
分支的切换:
三:GitHub
1.远程库创建
1)创建本地库,并创建github.txt文件,提交到本地库。
GitHub上创建远程库
2)在本地创建远程库地址别名(git remote add [别名] [远程库地址])
3)推送(git push [别名] [分支名])
切换提交的用户及密码,需要删除GitHub的凭据管理器
4)克隆(git clone [远程地址])
新建GitHubTest2本地库
克隆后会将远程库下载到本地,创建origin远程地址别名,初始化本地库。
5)团队成员邀请
此时,被邀请账号在本地就可以提交到远程库了。
6)拉取
pull=fetch+merge
git fetch [远程库地址别名] [远程分支名] 抓取
git merge [远程库地址别名/远程分支名] 合并
git pull [远程库地址别名] [远程分支名] 抓取+合并
7)解决冲突
使用一个GitHub账号提交到远程库后,在使用另外一个账号也提进行交,会出现冲突
所以需要先拉取下来,解决冲突在提交
重新提交成功
8)跨团队协作
另一方团队先将远程库fork一份,复制远程库地址给另一方团队,另一方团队访问地址,fork一份
fork成功
另一方团队将其克隆到本地库就可以进行修改了,修改后提交到远程库,就可以发起pull requests给项目团队查看
另一方团队pull requests后,项目团队就可以查看代码了
项目团队如果过有问题,可以通过消息询问
另一方团队可以回复
项目团队审核代码
如果没有问题,就可以合并了
9)SSH 登录
进入当前用户的家目录(cd ~)
删除.ssh 目录(rm -rvf .ssh)
运行命令生成.ssh 密钥目录(ssh-keygen -t rsa -C [GitHub用户名]),之后一路回车
复制.ssh/id_rsa.pub中的内容,配置GitHub
回到配置用户的的本地仓库中,修改文件,重新提交,以为之前有Http形式的别名,所以需要新建SSH别名
提交成功
四:Eclipse中使用Git
1)将eclipse中的工程初始化为本地库
工程→右键→Team→Share Project→Git
eclipse设置本地库用户名及email
2)eclipse 中忽略文件
在用户家目录下(C:\Users\asus我的电脑家目录)添加Java.gitignore文件,文件内容为
# Compiled class file 配置eclipse通过Git提交时忽略的文件类型
*.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
.project
.settings
target
在.gitconfig文件中引用Java.gitignore文件
[core]
excludesfile=C:/Users/asus/Java.gitignore
注意:这里路径中一定要使用“/”,不能使用“\”
3)eclipse中git的相关基本操作
添加到暂存区(工程→右键→Team→Add to Index)
添加到本地库(工程→右键→Team→Commit)
也可以直接commit,不用add to index
通过快捷键(ctrl+#)直接执行上面两步
4)推送到远程库
首先需要在GitHub上新建一个远程仓库
复制Http地址,在项目上右键->Team->Remote->push
5)将远程库克隆到eclipse中(eclipse版本不同,操作会有不同,这里以Oxygen为例)
工作空间右键->import->git->Projects from Git->next->Clone URI->next
之后finish即可,如果是maven工程,可将其转换为maven工程(Configure->Convert to Maven Project)
6)eclipse中解决冲突
出现冲突,需要先pull,拉取最新,解决冲突后在提交本地库,在提交到远程库,可以通过冲突文件右键->Team->Merge Tool查看冲突位置
7)eclipse中分支的使用
创建新分支(项目右键->Team->Switch To->New Branch),会自动切换到新建分支
操作修改后,提交到本地库,提交到远程库。
其他人员进行拉取操作后,切换分支(项目右键->Team->Switch To->Other)进行审查
最后Finish
审查没问题后就合并分支,合并前切换到要合并到的分支(我这里要将hot_fix合并到master,所以就切换到master),之后合并(项目右键->Team->Merge)
合并完成后,就可以将master提交到远程库。
五:GitLab服务器搭建
准备:虚拟机中安装CentOS7(跳过),将GitLab安装包上传到linux中(跳过)
GitLab下载地址:https://packages.gitlab.com/gitlab/gitlab-ce
这里以gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm为例安装,下载地址:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
1.安装GitLab
实际问题:yum 安装 gitlab-ee(或 ce)时,需要联网下载几百 M 的安装文件,非常耗时,所以应提前把所需 RPM 包下载并安装好。
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ee
调整后的安装过程
sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
sudo yum install -y curl policycoreutils-python openssh-server cronie
sudo lokkit -s http -s ssh
sudo yum install postfix
sudo service postfix start
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
当前步骤完成后重启。
2.配置并启动GitLab
初始化配置 gitlab(gitlab-ctl reconfigure)
启动 gitlab 服务(gitlab-ctl start)
停止 gitlab 服务(gitlab-ctl stop)
浏览器访问:访问 Linux 服务器 IP 地址即可,如果想访问 EXTERNAL_URL 指定的域名还需要配置域名服务器或本地 hosts 文件。初次登录时需要为 gitlab 的 root 用户设置密码。若是访问不成功,可关闭防火墙service firewalld stop
六:GitHub实用操作
1.in关键词限制搜索范围
公式:XXX关键词 in:name或description或readme----->seckill in:name,description,readme,在名字,描述,readme中包含秒杀的项目
2.stars或fork数量关键词查找
公式:XXX关键词 stars:[通配符]/[区间数字]
查询springboot点赞数>=5000的项目----->SpringBoot stars:>=5000
查找fork数>500的springcloud项目----->springcloud fork:>500
查找fork在100-200之间stars在80-100之间的springboot项目------>springboot fork:100..200 stars:80..100
3.awesome加强搜索
公式:awesome 关键字
4.高亮显示某一行代码
给别人指出关键代码的行号,#L #Ln行号
https://github.com/liyifeng1994/seckill/blob/master/src/test/java/org/seckill/BaseTest.java#L3(第3行)
https://github.com/liyifeng1994/seckill/blob/master/src/test/java/org/seckill/BaseTest.java#L3-L5(3-5行)
5.项目内搜索
在项目中按下小写字母t
6.搜索某个地区内的大佬
公式:location:地区 language:语言