git基础
[[toc]]
git emoji
执行 git commit 时使用 emoji 为本次提交打上一个 “标签”, 使得此次 commit 的主要工作得以凸现,也能够使得其在整个提交历史中易于区分与查找。
emoji | emoji 代码 | commit 说明 |
---|---|---|
:tada: (庆祝) | :tada: |
初次提交 |
:sparkles: (火花) | :sparkles: |
引入新功能 |
:bookmark: (书签) | :bookmark: |
发行/版本标签 |
:bug: (bug) | :bug: |
修复 bug |
:ambulance: (急救车) | :ambulance: |
重要补丁 |
:globe_with_meridians: (地球) | :globe_with_meridians: |
国际化与本地化 |
:lipstick: (口红) | :lipstick: |
更新 UI 和样式文件 |
:clapper: (场记板) | :clapper: |
更新演示/示例 |
:rotating_light: (警车灯) | :rotating_light: |
移除 linter 警告 |
:wrench: (扳手) | :wrench: |
修改配置文件 |
:heavy_plus_sign: (加号) | :heavy_plus_sign: |
增加一个依赖 |
:heavy_minus_sign: (减号) | :heavy_minus_sign: |
减少一个依赖 |
:arrow_up: (上升箭头) | :arrow_up: |
升级依赖 |
:arrow_down: (下降箭头) | :arrow_down: |
降级依赖 |
:zap: (闪电) :racehorse: (赛马) |
:zap: :racehorse: |
提升性能 |
:chart_with_upwards_trend: (上升趋势图) | :chart_with_upwards_trend: |
添加分析或跟踪代码 |
:rocket: (火箭) | :rocket: |
部署功能 |
:white_check_mark: (白色复选框) | :white_check_mark: |
增加测试 |
:memo: (备忘录) | :memo: |
撰写文档 |
:hammer: (锤子) | :hammer: |
重大重构 |
:art: (调色板) | :art: |
改进代码结构/代码格式 |
:fire: (火焰) | :fire: |
移除代码或文件 |
:pencil2: (铅笔) | :pencil2: |
修复 typo |
:construction: (施工) | :construction: |
工作进行中 |
:construction_worker: (工人) | :construction_worker: |
添加 CI 构建系统 |
:green_heart: (绿心) | :green_heart: |
修复 CI 构建问题 |
:lock: (锁) | :lock: |
修复安全问题 |
:whale: (鲸鱼) | :whale: |
Docker 相关工作 |
:apple: (苹果) | :apple: |
修复 macOS 下的问题 |
:penguin: (企鹅) | :penguin: |
修复 Linux 下的问题 |
:checkered_flag: (旗帜) | :checked_flag: |
修复 Windows 下的问题 |
最后附上gitmoji网站
https://gitmoji.carloscuesta.me
以及github支持的表情超市
https://www.webfx.com/tools/emoji-cheat-sheet
git实用命令
git rebase -i HEAD~4 合并commit 的记录 |
git revert 和 git reset 的区别
git revert
是用一次新的commit来回滚之前的commit,git reset
是直接删除指定的commit。在回滚这一操作上看,效果差不多。但是在日后继续merge以前的老版本时有区别。因为
git revert
是用一次逆向的commit“中和”之前的提交
,因此日后合并老的branch时,导致这部分改变不会再次出现,但是git reset
是之间把某些commit在某个branch上删除,
因而和老的branch再次merge时,这些被回滚的commit应该还会被引入。git reset
是把HEAD向后移动了一下,而git revert
是HEAD继续前进,只是新的commit的内容和要revert的内容正好相反,能够抵消要被revert的内容。
拉取代码 git pull –rebase
假设提交线图在执行 pull 前是这样的:
A---B---C remotes/origin/master |
如果是执行 git pull 后,提交线图会变成这样:
A---B---C remotes/origin/master |
结果多出了 H 这个没必要的提交记录。如果是执行 git pull –rebase 的话,提交线图就会变成这样:
remotes/origin/master |
F G 两个提交通过 rebase 方式重新拼接在 C 之后,多余的分叉去掉了,目的达到
::: danger 注意:
git pull = git fetch + git merge
git pull –rebase = git fetch + git rebase
:::
rebase合并分支
master分支,节点链表指向为: c1<–C3<–c4
dev分支,节点链表指向为: c1<–C2<–c5
master分支和dev分支祖先为c1,假定在master分支上做git merge dev合并,得到的提交历史为:
c1<–c2<–c3<–c4<–c5<–C6 (c1、 c4、 c5做了-次三方合并发现冲突,手工处理完毕后git add/commit增加了提交节点c6)
采用git merge dev处理提交log是按照时间戳先后顺序的。
假定采用的是git rebase处理过程为:
git checkout dev |
git分支命名
master:主分支,负责记录上线版本的迭代,该分支代码与线上代码是完全一致的。
develop:开发分支,该分支记录相对稳定的版本,所有的feature分支和bugfix分支都从该分支创建。其它分支为短期分支,其完成功能开发之后需要删除
feature/*:特性(功能)分支,用于开发新的功能,不同的功能创建不同的功能分支,功能分支开发完成并自测通过之后,需要合并到 develop 分支,之后删除该分支。
bugfix/*:bug修复分支,用于修复不紧急的bug,普通bug均需要创建bugfix分支开发,开发完成自测没问题后合并到 develop 分支后,删除该分支。
release/*:发布分支,用于代码上线准备,该分支从develop分支创建,创建之后由测试同学发布到测试环境进行测试,测试过程中发现bug需要开发人员在该release分支上进行bug修复,所有bug修复完后,在上线之前,需要合并该release分支到master分支和develop分支。
hotfix/*:紧急bug修复分支,该分支只有在紧急情况下使用,从master分支创建,用于紧急修复线上bug,修复完成后,需要合并该分支到master分支以便上线,同时需要再合并到develop分支。
gitlab的key
ssh-keygen -t rsa -C “feng960106@163.com“
cat ~/.ssh/id_rsa.pub
迁移 github
sed -i ‘’ “s/115.28.166.109/123.57.86.216/g” .git/config
git 无法添加文件夹下文件
最近做项目时,发现无法提交某个子文件夹下的文件。
google后发现可能是该子文件夹下有.git文件夹导致无法上传。
删除子文件夹下.git后,依然无法提交子文件夹下的文件。
继续google,
尝试以下方法:
git rm –cached directory
git add directory
注: directory为子文件夹的路径。
但是执行 git rm –cached directory 时,提示
fatal: Unable to create ‘xx/.git/index.lock’: File exists.
执行 rm -f xx/.git/index.lock
后解决
扫盲 .git
// .git |
git获取最后一次提交的的时间和commit id
获取最后一次commit的时间
git show –pretty=format:”%ci %cr” | head -1
2022-05-11 14:54:23 +0800 37 minutes ago
获取最后一次提交的commit Id
git rev-parse HEAD
31cab83b6cc7b844dc407291d47ac72f1d495690
获取最后一次提交的short commit Id
git rev-parse –short HEAD
31cab83b6
git怎么删除所有tag
# 只能在终端用 命令后面有个空格 |
删除本地tag
git tag -d $(git tag -l)
拉取远程tag
git fetch
删除远程tag
git push origin –delete $(git tag -l)
删除本地tag
git tag -d $(git tag -l)
获取最后一次 tag 的名称
git describe –abbrev=0
git放弃本地文件修改
未使用git add 缓存代码
使用git checkout – 文件名,注意中间有 –
git checkout -- filename |
放弃所有文件修改 git checkout .
git checkout . |
此命令用来放弃掉所有还没有加入到缓存区(就是 git add 命令)的修改:内容修改与整个文件删除。
此命令不会删除新建的文件,因为新建的文件还没加入git管理系统中,所以对git来说是未知,只需手动删除即可。
已使用git add 缓存代码,未使用git commit
使用 git reset HEAD 文件名
git reset HEAD filename |
放弃所有文件修改 git reset HEAD
git reset HEAD |
此命令用来清除 git 对于文件修改的缓存。相当于撤销 git add 命令所在的工作。在使用本命令后,本地的修改并不会消失,而是回到了第一步 1. 未使用git add 缓存代码,继续使用用git checkout –filename,就可以放弃本地修改。
已经用 git commit 提交了代码
使用 git reset –hard HEAD^ 来回退到上一次commit的状态。
git reset --hard HEAD^ |
或者回退到任意版本git reset –hard commit id ,使用git log命令查看git提交历史和commit id。
git reset --hard commit id |
git diff
git diff 命令可以对比两个版本的差异,具体来说包括:
本地工作区和暂存区的diff信息:git diff 或者 git diff file
暂存区和版本库的diff信息(使用git add 将工作区修改保存到了暂存区后):git diff –cached
版本库中不同commit、分支的diff信息(使用git commit 将暂存区修改提交到了版本库):git diff commit1 commit2 或 git diff branch1 branch2
可以查看最近一次提交的版本与往过去时间线前数X个的版本之间的所有文件之间的增删改 git diff HEAD~X 或 git diff HEAD^1
如何使git diff写入stdout
- git --no-pager diff