这是我参与「第三届青训营 -后端场」笔记创作活动的的第3篇笔记
如果有错误和其他意见,麻烦留言指正💖
Git的正确使用姿势
Git是什么
Git: 版本控制,记录若干文件内容变化。
版本控制类型:(和其流行的工具)
本地版本控制 RCS 本地
集中式版本控制 SVN 远端服务器来维护,多人协作(很多游戏和美术团队仍在使用)
分布式版本控制 GIT 每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题
Git发展历史
Git作者是Linux作者:Linus Torvalds(开源的)
- Github 全球最大代码托管平台
- Gitlab 全球最大开源代码托管平台
- Gerrit Google开发的代码托管平台, Android就在其上 ......
Git的基本命令
项目初始化:
mkdir demo
cd demo
git init
tree .git
在新文件夹下初始化init,默认现在处于在master分支下
cat .git/HEAD 查看当前分支
工作区和暂存区
配置 Git config
不同级别的配置,每个级别配置可能重复,但是低级别配置会覆盖高级别配置
--global //第二高
--system //最高
--local // 本地
常见Git配置:
- 用户名配置:(必)
git config --global user.name "Your Name"
git config --global user.email "email@example.com"
-
Instead of 配置
git config --global url.git@github.com:.insteadOf http://github.com/做URL替换,如把ssh协议换成http协议 -
命令别名配置(可加)
alias.*用来设置别名,一般用于简化命令,例如:
git config --global alias.cin "commit --amend --no-edit"
用于简化命令,以后用cin 替换commit..这段命令
远程仓库 Git Remote 配置
查看Remotegit remote -v
添加Remote
git remote add origin_ssh git@github.com:git/git.git
git remote add origin_http https://github.com/git/git.git
然后查看remote:
表示源
这个时候输入cat .git/config
可以看到两个remote的配置修改,每个Remote命令本质上都是在config上修改的
Tips: 打错了的话可以输入git remote -h 即help 查看remove的修改命令把打错的修改回来
免密配置
-
HTTP Remote (可能没那么安全,没那么方便,不推荐)
-
ssh Remote(从而实现本地连接上远端代码管理) 通过公钥秘钥机制,将生成的公钥存放在服务器,从而实现免密登录。(同于ssh登录远程云服务器)
目前Key的四种类型:dsa, rsa, ecdsa, ed25519, 默认使用rsa
终端指令:ssh-keygen -t ed25519 -C "your_email@example.com"然后回车
此时密钥默认存在 cat ~/.ssh/id_ed25519.pub
复制这段公钥存到github上(setting - ssh and GPc kekys - new ssh - add ssh_key ......)
提交代码
基本操作
git add添加文件(git add . 是添加本地全部)git status查看现状
-
可以通过命令直接查看文件内容:
git cat-file -p <object下的文件夹名><文件id> -
git commit -m "version_name"提交版本 -
git log查看所有提交的树
- 分支
git checkout -b branch_name 创建并切换到branch_name这个分支
git branch branch_name 创建新分支
git checkout branch_name 切换到branch_name这个分支
用tree .git看创建新分支后的区别
- ref 指针向对应的commit版本, branch分支用于开发阶段可以不断添加,Tag表示稳定版本,一般不会变更,用于发布版本
用
git tag Vx.x.x发布tag
git tag -a vx.x.x -m "附注内容"给tag创建附注标签
版本
追溯历史版本
- 获取当前版本 (通过ref指向的commit获取唯一的代码版本)
- 获取历史版本 (通过commit串联历史版本)
git reset --hard HEAD^: 将代码库回滚到上一个版本
git reset --hard HEAD^^: 往上回滚两次,以此类推
git reset --hard HEAD~100:往上回滚100个版本
git reset --hard 版本号: 回滚到某一特定版本
修改历史版本:
git commit --amend修改最近一次的commit信息(修改之后commit的id会变)
注:第一行"readme2"是commit -m 的"version_name"
Git GC
-
GC: 通过git gc 命令删除不需要的一些object,以及对object进行一些打包压缩。
-
reflog reflog用于记录操作日志,防止误删后数据丢失。
-
指定时间
操作:
git reflog expire --expire=now --all
git gc --prune=now
打包了object成压缩后格式,删除了不需要的object
(以上都为本地管理)
远端同步
Git clone & Pull & Fetch
- clone 拉取
- Fetch 将远端分支不合并,会修改refs/remote内的分支信息
- Pull 拉取远端分支并合并 (=
git ferch+git merge branch_name, 可能会冲突,所以推荐上)
GIT push
- 常用命令
git push -u(第一次需要-u以后不需要):将当前分支推送到远程仓库
git push origin branch_name :将本地的某个分支推送到远程仓库
- 冲突问题
可以通过
git push origin -f来强推(团队确认后,且一般不会在主干分支进行)