git
git version 2.34.1 - 64 bit
Git结构
- 工作区
- 暂存区
- 本地库
Git和托管中心
局域网:
- GitLab服务器
外网:
GitHub
Gitee
本地库和远程库
私人库或者团队内部协作:
- push 可以将本地库的代码推送到远程库
- clone 将远程库的代码下载到本地库
- 团队外的人不可以push到远程库
团队外协作:
fork 复制到自己的远程库
clone 下载到自己的本地库
push 到自己的远程库
pull request 申请将自己的远程库内容合并到对方远程库
merge 远程库合并
pull 然后就可以拉取合并后的代码
本地库初始化
命令:
- git init
- git add
设置签名:
形式:
用户名
Email
作用: 区分不同开发人员身份
这里的签名和登录远程库的账号密码没有关系
命令
- 项目级别/仓库级别
- git config user.name tom
- git config user.email tom@gmail.com
- 可以使用
git config --unset <credential name>
取消设置的签名
- 系统用户级别: 登录当前操作系统的用户范围
- git config –global …
- 优先级
- 就近原则: 项目级别优先于系统用户级别, 二者都有的时候采用项目级别的签名
- 如果只有系统用户级别的签名, 就以系统用户级别的签名为准
- 二者都没有不允许
- 项目级别/仓库级别
设置完成以后可以使用cat ./git/config
, 查看项目级别的签名
系统用户级别的签名在C:\user\用户名下的.gitconfig
里面
添加提交
git status 查看状态:
- on branch
- no commits files:
- untracked files
- nothing to commit / change to be committed
添加提交文件:
用
git add <file>
将文件加入到暂存区用
git rm --cached <file>
将文件从暂存区中删除用
git commit <file>
提交到本地库用
git add <file>
将修改过的文件更新到暂存区, 也可以直接git commit -a
直接提交用
git restore <file>
将修改过的内容取消用
git commit -m "<messages>" <file>
不用进vim直接设置提交日志并提交
本地版本穿梭
git log
查看本地仓库历史版本git log --pretty=oneline
以简洁方式显示git log --oneline
更简洁git reflog
简洁, 但是显示更多有价值的信息HEAD{}
显示了从当前版本去到对应版本所需要的步数
前进后退
基于索引值操作:
git reset --hard <索引值>
退回历史版本- 往前进也是一样的指令
基于^的操作:
- 只能后退不能往前
git reset --hard HEAD^^^
回退3个记录
基于~的操作:
也是只能后退
git reset --hard HEAD~3
后退三个记录
软硬参数对比
hard``soft``mixed
三个参数的区别
- soft
- 不会碰暂存区
- 仅仅移动HEAD指针
- mixed
- 移动HEAD指针
- 重置暂存区
- hard
- 在本地库移动HEAD
- 重置暂存区
- 重置工作区
删除文件后找回: 就直接退回到对应还有该文件的版本就好了, 之前的版本记录一直都存在, 前提是删除前提交过该文件到本地库
比较文件
git diff <filename>
与暂存区的文件进行比较git diff HEAD <filename>
与本地库文件进行比较git diff HEAD^ <filename>
或者和某个特定本地库记录比较
git diff
不指定文件名就可以比较所有文件
分支管理
分支的功能
每个分支开发过程中彼此独立
如果某个分支出问题可以直接删除分支, 不影响其他分支
开发完成后合并到主分支
主分支出bug一般开一个hot_fix分支进行修复
分支操作
git branch -v
查看分支git branch <branch name>
创建新分支git checkout <branch name>
切换分支
合并分支:
- 切换到被合并的分支上
- 执行merge命令
- git merge
把较为新的分支合并到当前分支
- git merge
解决冲突
- 编辑文件删除特殊符号,
- 把文件修改到满意的程度
git add
标记冲突解决git commit -m "<log>"
结束合并不可以带文件名
Git基本原理
哈希
一种加密算法, 明文->加密算法->密文
- 不管输入数据量多大, 输入同一个算法, 得到的加密长度一致
- 哈希算法确定, 输入数据确定, 输出数据就也能保持不变
- 只要更改输入数据, 输出一定改变
- 不可逆
常见hash加密算法:
- MD5
- SHA1
- CRC32
哈希值的变化可以代表数据的更改和丢失
git底层采用的是sha1的算法
版本数据管理机制
- SVN的版本控制方式是增量式版本控制, 换言之就是只保存更改或者添加的内容, 然后进行拼接
- git是快照机制, 如果文件没有更改, 则指针指向之前文件, 不会重复保存快照
- 每个文件都会做一次哈希, 所有对象包装成tree对象也有哈希值, 然后再包装成提交数据, 也有哈希值
- 每个提交对象还会指向一个父节点, 这样就可以管理历史版本
分支管理
- HEAD 指向初始分支master
- 新分支只是创建了一个指针, 提交的时候指向新的对象
- 切换分支的时候只是指针变了, 所以速度非常快
远程库Github
先创建远程库,
git remote add origin https://[USERNAME]:[TOKEN]@git.mycompany.com/[ORGANIZATION]/[REPO].git
用授权token添加远程地址git remote set-url origin <url>
重新设置远程库地址git remove -v
查看设置好的地址git push origin <branch name>
将本地库推送至远程库- 注意: 如果之前使用了签名, 需要删除签名github才会显示对应账号名, 不然是以签名作为一个虚拟身份commit to repo
此处测试暂时使用的token: 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, 7天过期
参考:
如何获得授权token:
如何使用token将本地库文件推送至远程库:
https://stackoverflow.com/questions/18935539/authenticate-with-github-using-a-token
在远程库删除新加入.gitignore中的文件
克隆clone
克隆特点:
- 完整把远程库下载到本地
- 创建origin远程地址别名
- 初始化好了本地库
命令:
git clone <url>
远程库的拉取(更新)
fetch 加 merge 就是pull
fetch merge分开操作流程:
git fetch origin master
下载下来但是没有修改本地文件git checkout origin/master
切换到下载下来的远程库, 可以看到下载后的内容git checkout master
返回本地分支git merge origin/master
将远程库内容进行合并- 这样就完成了分开操作
pull操作流程:
git pull origin master
直接完成合并操作, 当程序比较简单不会产生冲突的时候可以使用
协同开发时的冲突
当远程库有内容发生冲突的时候, 后推送的人就无法推送了, 必须先拉取下来, 再本地库解决了冲突才能再推送
- 使用fetch修改, 或者使用pull命令直接进入merging状态
- 修改冲突文件
- 重复之前解决冲突时的方法, (
git add <conflict/modified file name>
) - 然后
git commit
结束merging状态 git push origin master
结束推送状态
要点:
- 不是基于最新修改, 不能推送, 必须先拉取
- 拉取后进入冲突状态, 按照”分支解决冲突”的操作解决
还有其他解决冲突的方法, 比如 stash 命令
…
github跨团队协作
团队外成员操作:
- 在对方的repo远程仓库里面点击fork, 就复制了一份到自己的本地仓库
- 然后正常执行 clone, commit, push
- 在此仓库中怎么修改都不会影响原仓库
- 发起pull request, new pull request
- create pull request
然后团队内部人员审核pull request:
点击对应pull request 查看pull request
可以进行对话
看commits和files changes 审核代码
点击merge pull request进行合并
confirm merge
再将合并后的内容拉取到本地就完成了
SSH
cd ~
进入HOME目录ssh-keygen -t rsa -C <username>
生成ssh密钥进入生成到的目录
cat id_rsa.pub
查看密钥到github中设置ssh密钥
先从repo复制ssh的地址,
git remote add origin_ssh <ssh_url>
push 推送
这样就不需要密码进行推送
.gitignore
默认自动ignore该文件里定义的路径和文件
1 | git config core.excludesfile .gitignore |
只能忽略还没有被track的文件, 如果以及commit了, ignore就是无效的
可以使用指令
1 | git rm -r --cached <directory/file name> |
查看哪些文件被ignore了
1 | git status --ignored |
IDEA使用ignore插件
https://blog.csdn.net/qq_34745957/article/details/80035578
.gitignore 使用
Git工作流
- 集中式
- GitFlow
- Forking
GitFlow
master 分支: 主分支
release分支: 预发布分支, 完成后合并到主分支
develop分支: 开发基准分支, 开发完成合并到主分支
多个feature_name分支: 各种单个功能开发, 开发完成合并到develop分支
hotfix分支: 热修复bug, 完成后到合并到主分支
GitLab服务器
gitlab是在服务器自行搭建的私人局域网远程库
- 将gitlab 的rpm包上传到linux服务器
- 到指定目录(opt)
安装命令:
CentOS 7
1 | sudo yum install -y curl policycoreutils-python openssh-server cronie |
使用rpm包的话就先装rpm包
1 | sudo rpm -ivh /opt/gitlab-ce....x86.rpm |
可以将命令写到.sh脚本文件中, 然后统一跑
操作
gitlab-ctl reconfigure
初始化配置gitlab
gitlab-ctl start
启动
gitlab-ctl stop
停止
直接去访问ip地址, 如果不成功就检查防火墙是否停止
service firework stop
停止防火墙
正常情况需要设置防火墙策略, 而不是关闭
初次启动设置root的账号密码
—end—