Git Tools Guide

Git Commands

Posted by lanbery on January 12, 2020

Git 常用命令

Branch 类

Git branch

使用Git创建本地分支,并push到远程

  • git branch -a //查看所有分支
  • git status //查看状态
  • git checkout -b newBranch //新建本地分支
  • git branch -d brachname //删除本地分支
  • git push origin newBranch[:newBranch] //创建远程分支,或者
  • git push –set-upstream origin sol5 //管理本地默认推送分支,直接git push
  • git push origin :newBranch //通过推送空分支的方式删除远程分支
  • git push origin –delete newBranch //删除远程分支

git tags

列出已有标签

git tag
git tag -l 'v1.0.*' # 过滤


checkout from tag and fixed bug workflow

git tag -l  # 列出分支 
git checkout v3.0.2  # checkout tag 
git checkout -b 3.0.2  # create local fixed bug branch 
git diff develop  src/xxx/xxx.js  # 对比文件差异
git commit -m "fixed bug #xxx" -a  # fixed bug and commit branch
git checkout develop #
git pull # let develop Keep consistent remote
git merge 3.0.2  # 合并分支 
git push  # 
git branch -D 3.0.2 # 删除本地分支

新建标签

git tag -a v1.0.2 -m "comments"  # 新建带注释标签
git show v1.0.2 #查看标签信息
git log --pretty=oneline #在后期对早先的某次提交加注标签。比如此示例展示的提交历史中

git push origin v1.0.2 # 上传tag到远程

验证标签 可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证

签署标签 如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可

git tag -s v1.5 -m 'my signed 1.5 tag'

git merge

假设要将develop 分支最新内容合并到master 分支

  • git checkout develop //切换至develop分支
  • git pull 或git fetch
  • git checkout master

git pull 和 git fetch

FETCH_HEAD: 是一个版本链接,记录在本地的一个文件中,指向着目前已经从远程仓库取下来的分支的末端版本

commit-id : 在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库

git fetch :在每次本地工作完成后,都会做一个git commit 操作来保存当前工作到本地的repo, 此时会产生一个commit-id,这是一个能唯一标识一个版本的序列号。 在使用git push后,这个序列号还会同步到远程仓库

最后总结:可以理解为git pull 是把git fetch 和git merge 合并的操作,当然有冲突是可能会失败

通过git fetch 更新远程仓库

  • git fetch origin master[:tmp] //将远程master更新至本地master[:tmp]省略即同名(本地叫master)
  • git diff tmp //对比本地当前分支与下载tmp区别
  • git merge tmp //用tmp 合并本地当前分支
  • git branch -d tmp //删除本地临时分支

对比两次提交具体文件差别

git log    // 查看commit list 
git diff hash1 hash2 --stat         // 对比所有更改
git diff hash hash ./file 

Git Message 规范

commit message格式

type(必须)

  • upd:更新某功能(不是 feat, 不是 fix)
  • feat:新功能(feature)
  • fix/to:修补 bug,fix 产生diff并自动修复此问题。适合于一次提交直接修复问题,to: 只产生diff不自动修复此问题。适合于多次提交
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动
  • perf:优化相关,比如提升性能、体验。
  • revert:回滚到上一个版本
  • merge:代码合并。
  • sync:同步主线或分支的Bug。

scope(可选)

scope用于说明 commit 影响的范围

subject(必须)

subject是commit目的的简短描述,不超过50个字符

fix(DAO):用户查询缺少username属性 
feat(Controller):用户查询接口开发

切换Remote Url

git remote -v                       //先检查remote Repositories
git remote set-url origin url       //url https://github.com/username/repository.git 
git remote -v                       //
git remote set-url origin git@ssh-host:(username/org)/repository.git   // set ssh push 

fix issue

Fix issue

commit -m ** fixes #

git commit -m "message, fixes #issueId"

类型

必须是以下之一:

build:影响构建系统或外部依赖关系的更改(示例范围:gulp, broccoli, npm)
ci: 更改我们的配置文件和脚本(示例范围:Travis, Circle, BrowserStack, SauceLabs)
docs: 仅文档更改,比如README, CHANGELOG, CONTRIBUTE等等
feat: 一个新功能
fix: 一个错误修复
perf: 一个改进性能的代码更改,比如提升性能、体验
refactor: 代码更改,既不修复错误也不添加功能
style: 不改变代码逻辑,仅仅修改代码风格(空格,格式化,分号分号等)
test: 添加缺失测试或更正现有测试(测试用例,包括单元测试、集成测试等)
revert: 回滚到某一个版本(带上版本号)

Git Submodule 子模块

add Submodule

git submodule add <url> <path>

# url为子模块的路径,path为该子模块存储的目录路径
# git status会看到项目中修改了.gitmodules
# git diff --cached查看修改内容可以看到增加了子模块 

子模块的使用

  git submodule init
  git submodule update

  git submodule update --init --recursive

加入不成功时

git rm --cached smart_v3
rm -rf submod_folder
git submodule add url ./submod_folder

子模块的更新

进入到子模块目录下,执行 git pull更新,查看git log查看相应提交

删除子模块

  - rm -rf 子模块目录 删除子模块目录及源码
  - vi .gitmodules 删除项目目录下.gitmodules文件中子模块相关条目
  - vi .git/config 删除配置项中子模块相关条目
  - rm .git/module/* 删除模块下的子模块目录,每个子模块对应一个目录,注意只删除对应的子模块目录即可

Git Proxy Setting

Git Proxy


Git 回滚 & 恢复

误删除本地文件恢复

git status # 
git reset HEAD <dir/file> # 针对目录或文件
git checkout src/ui

git reset HEAD src/ui

M       src/store/index.js
D       src/store/initial-p3-state.js
D       src/ui/scss/_all.scss
D       src/ui/scss/_brv-core.scss
D       src/ui/scss/_mixin.scss
D       src/ui/scss/_reset.scss
D       src/ui/scss/_utilities.scss
D       src/ui/scss/_variables.scss
D       src/ui/scss/utils/classname-util.js
M       src/widgets/select/select.scss

Git reset back commit hash

方式一

Git 回滚: 强制 push 方式

  • 0: 如本地有未提交代码,可git checkout -b for-reset-tmp && git add . && git commit -am ‘xxxx’ && git checkout current branch
  • 1: git pull 保证本地与remote 一致
  • 2: 备份当前分支(如有必要)
  • 3: git log [–pretty=online] 查找要回复的hash
  • 4: git reset –hard
  • 5: git push -f origin # 强制更新远程分支

方式二

从回滚位置生成新的commit hash,

  • 0: 如本地有未提交代码,可git checkout -b for-reset-tmp && git add . && git commit -am ‘xxxx’ && git checkout current branch
  • 1: git pull # 保证当前工作区是干净的,并且和远程分支代码一致
  • 2: 备份分支(如有必要)
  • 3: git revert # 不加 --no-commit 生成新的hash
  • 4: git push

lerna version

git push –follow-tags –no-verify –atomic origin main

造成这个错误很有可能是网络不稳定,连接超时导致的

nable to access 'https://github.com/*.git/': OpenSSL SSL_read: Connection was reset, errno 10054

解决方式

git config http.sslVerify "false"

Git commit 注释规范

AngularJS 在开发者文档中关于 git commit 的指导说明,提到严格的 git commit 格式规范可以在浏览项目历史的过程中看到更易读的信息,并且能用 git commit 的信息直接生成 AngularJS 的 changelog

规范模板

commit messages 由 header 、body 、footer 组成。

header 又包含 type 、scope 、subject 。header 是必需的,不过其中的 scope 是可选的。