配置 ssh 链接
场景:假设你刚加入一个新团队,你的三级问你要git账号密钥而不是git账号,此时他的意思是向你分配项目仓库权限,此时你应该这样做:
- 本地生成公钥和密钥,将储存在本地用户的 .ssh 目录下,默认文件名为id.rsa 和 id.rsa.pub
注:以下命令一路回车就行
ssh-keygen -t rsa -b 2048 -C "邮箱地址"
2. 将公钥配置到某个仓库拥有者的 SSH 设置上(公钥给你上级)
- 后续你上级将公钥配置进项目仓库里,你便可以通过 ssh 链接克隆项目到本地上开发了
常用操作命令
git init- 初始化仓库
git config- 配置代码提交时生成的提交纪录,包含其当前配置的用户名和邮箱
git config user.name gafish
git config user.email gafish@qq.com
git branch- 分支管理
创建dev分支
git branch dev
重命名分支dev为Dev
git branch -m dev Dev
查看当前项目所有分支列表
git branch
删除分支Dev
git branch -d Dev
回退指定版本或上一个合并版本
git reset --hard 版本号 或 HEAD^
切换到上一个分支
git checkout -
创建一个本地分支,不与远程分支建立跟踪关系
git checkout --no-track -b <branch-name>
git status-查看仓库信息,文件改动状态git add- 添加文件到暂存区中git commit将缓存区内容添加到版本仓库中git fetch [remote][branch]- 拉取远程仓库代码,手动合并git pull拉取远程仓库代码,自动合并
git pull [remote] [branch] //拉取远程仓库变化,并与当前所在的本地分支合并
git pull [remote] [branch]:[dev] //拉取远程仓库变化,并与本地dev分支合并
git merge
// 开发分支(dev)上的代码达到上线的标准后,要合并到 master 分支
git checkout dev
git pull
git checkout master
git merge dev
git push -u origin master
git push
git push [remote] [branch] //推送本地指定分支到远程仓库
git push [remote][branch] -force //强制推送,即使存在冲突
git push [remote] --all //推送所有分支到远程仓库
git log- 查看版本提交纪录,q 键退出git reset
git reset --hard HEAD ^ //回退到上一个版本
git reset --hard HEAD~100 //回退到前100个版本
git reset --hard versionNo.
git tag给分支打标记
// 以给 master 分支打标记为例
git checkout master
git tag 0.1.0
git tags // 查看所有标记
git push origin 0.1.0 // 推送 0.1.0 标记
git push origin --tags // 推送所有标记
git tag -d 0.1.0 // 删除标记
git push origin -d 0.1.0 // 删除远程仓库标记
实践日志
※ 避免产生过多 merge 日志
方案:在本地提交时,先拉取一下远程仓库代码,有冲突手动处理再合并
※ 查询提交信息
git log --grep="style: email content"
※ 回退版本
git reflog // 查看历史提交,按q退出
git reset --hard [版本哈希值]
git cherry-pick [版本哈希值]
※ 解除追踪报错
解决:该文件正在被使用,停止服务后再操作。
※ 处理大文件上传
方案:git-lfs.com/
※ 常见报错日志及处理方案
- fatal: unable to access 'github.com/alindas/acr….
原因:服务器SSL证书没有经过第三方机构签署
解决:先解除ssl验证,再次git
git config --global http.sslVerify "false"
git push origin master
- Git: husky > npm run -s precommit (node v14.16.0)
提交代码后代码自动回退到修改前版本
原因:Git 在提交信息前运行代码风格检查,如果代码不符合规范,则报错
解决方案:
- 理所当然地对代码不符合规范的地方进行修正;
git commit --no-verify -m [message]提交时不检查- 进入
.git文件夹,删除hooks文件夹下的pre-commit文件。
- 每次
git push、git pull都要输入账号密码
先 git config --global credential.helper store,在后一次执行的 push 和 pull会被
记录对应的账号密码,下次执行便不再需要输入账密。
- fatal: refusing to merge unrelated histories
原因:pull 和 push 中两个分支没有取得联系
解决方案:在操作命令后添加 --allow-unrelated-histories。
eg: git pull origin master --allow-unrelated-histories。
- 在签出前,请清理储存库工作树
由于 git 仓库上代码和本地仓库存在冲突导致。
解决方案:新建项目,重新拉取并合并;
git reset --hard 回退一个版本,清空暂存区,将已提交内容的版本恢复到本地,本地文件也将被恢复的版本代替。
git pull
解决:把对应项目 .git目录下的 hooks 文件夹清空。
- windows 的 cmd 下使用 git commit 出现 "error: pathspec **** dit not match any file know to git"
解决方案: 使用双引号包裹 message。
- Cannot read properties of null(reading 'pickAlgorithm')。A complete log of this run can be found in:
场景:github 或者运行别人的项目时,安装依赖出现的错误。
解决方案:先清除缓存npm cache clear --force之后再重新安装依赖。
- npm install 安装报错 this is a problem related to network connectivity, behind a proxy
原因:代理的默认地址为proxy=http://127.0.0 .1:8087
解决方案:npm config set proxy null
- 报错:fatal: Not a valid object name: 'master'.
原因:创建本地分支时还没具有 master 分支。
解决方案:给本地分支添加文件。
- 警告:签出会覆盖本地更改
原因:如果当前分支所做的修改没有提交就切换去其他分支也会看到相同的修改。
解决方案:
git stash隐藏当前工作现场。git stash list查看隐藏的工作现场git stash apply恢复工作现场(没有删除储存的记录)git stash drop删除隐藏工作现场的记录(顶部)git stash pop恢复工作现场并删除记录(顶部)git stash apply {stash 索引}取出指定的工作现场git stash drop {stash 索引}删除指定的工作现场git stash push -m 'your message here'为工作现场添加描述信息
git 分支命名规范
分支: 命名: 说明:
主分支 master 主分支,所有提供给用户使用的正式版本,都在这个主分支上发布
开发分支 dev 开发分支,永远是功能最新最全的分支
功能分支 feature-* 新功能分支,某个功能点正在开发阶段
发布版本 release-* 发布定期要上线的功能
修复分支 bug-* 修复线上代码的 bug
git commit 规范
参考资料
commit 三要素:标题、内容、备注。
标题
标题分为类型、改动范围和精简总结三部分。
- 类型(必须)
开发常用:
feat(feature): 新功能或功能变更相关
fix:修复 bug 相关
perf:性能改动,页面优化相关
docs: 文档改动相关
style: 代码格式化相关
refactor: 代码重构使用
build: 构建工具或外部依赖改动时使用,如 npm 包
release: 发布新版本
test: 测试相关
chore: 其他修改
- 改动范围(可选)
当项目划分多个模块时,指定改动的模块。
- 精简总结(必须)
不能超过 50 个字符。
- 第一个字母小写
- 结尾不加句点
eg:
fix: 修复了无限抽奖的 bug
术语
- PR。Pull request,在需要给为别人仓库贡献代码,希望原始仓库合并自己的代码,便需要 Pull request。
Commitizen
用于辅助撰写合格的 Commit Message 工具。
.gitignore 文件解析
-
每一行指定一个忽略规则,多处来源的规则优先级如下:
-
匹配示例
- bin/: 忽略当前路径下的bin文件夹,该文件夹下的所有内容都会被忽略,不忽略 bin 文件
- /bin: 忽略根目录下的bin文件
- /*.c: 忽略 cat.c,不忽略 build/cat.c
- debug/*.obj: 忽略 debug/io.obj,不忽略 debug/common/io.obj 和 tools/debug/io.obj
- **/foo: 忽略/foo, a/foo, a/b/foo等
- a/**/b: 忽略a/b, a/x/b, a/x/y/b等
- !/bin/run.sh: 不忽略 bin 目录下的 run.sh 文件
- *.log: 忽略所有 .log 文件
- config.php: 忽略当前路径的 config.php 文件
- 意外情况
- gitignore 只能忽略原先没有被添加到本地仓库的文件,当已被纳入版本管理中时,再修改 gitignore 无效。
一、刷新缓冲
// 先把本地缓冲删除
git rm -r --cached .
// 重新提交
git add .
git commit -m 'update .gitignore'
二、强制提交
git add -f [fileName]
- 使用
git check-ignore检查规程
// 检查影响 fileName 无法提交的规则
git check-ignore -v [fileName]