Git

Git常用命令

Posted by sunzhongliang on February 27, 2020

本地操作

1.其他

  • git init: 初始化本地库
  • git status: 查看工作区、暂存区的状态
  • git add <file name>: 将工作区的“新建/修改”添加到索引区
      git add .  # 将所有修改添加到暂存区
      git add *Controller   # 将以Controller结尾的文件的所有修改添加到暂存区
      git add Hello*   # 将所有以Hello开头的文件的修改添加到暂存区
      git add Hello?   # 将以Hello开头后面只有一位的文件的修改提交到暂存区
    
  • git rm --cached <file name>: 移除暂存区的修改
  • git commit <file name>: 将暂存区的修改提交到本地库
  • git commit -m "提交日志" <file name>: 文件从暂存区到本地库

2.日志

  • git log: 查看历史提交(空格向下翻页,b向上翻页,q退出)
  • git log --pretty=oneline: 以漂亮的一行显示,包含全部哈希索引值
  • git log --oneline: 以简洁的一行显示,包含简洁哈希索引值
  • git reflog: 以简洁的一行显示,包含简洁哈希索引值,同时显示移动到某个历史版本所需的步数

3.版本控制

  • git reset --hard 简洁/完整哈希索引值: 回到指定哈希值所对应的版本
  • git reset --hard HEAD: 强制工作区、暂存区、本地库为当前HEAD指针所在的版本
  • git reset --hard HEAD^: 后退一个版本(一个^表示回退一个版本)
  • git reset --hard HEAD~1: 后退一个版本(~后的1表示后退几个版本)

4.比较差异

  • git diff: 比较工作区和暂存区的所有文件差异
  • git diff <file name>: 比较工作区和暂存区的指定文件的差异
  • git diff HEAD|HEAD^|HEAD~|哈希索引值 <file name>: 比较工作区跟本地库的某个版本的指定文件的差异

5.分支操作

  • git branch -v: 查看所有分支
  • git branch -d <分支名>: 删除本地分支
  • git branch <分支名>: 新建分支
  • git checkout <分支名>: 切换分支
  • git merge <被合并分支名>: 合并分支
    • 如果master分支合并到hot_fix分支,那么当前必须处于master分支上,然后执行git merge hot_fix命令
    • 如果出现合并冲突
      1. 打开文件删除git自动标记符号,如««HEAD 、»»等
      2. 修改完成后,保存退出
      3. git add
      4. git commit -m “日志信息”,此时后面不要带文件名

本地库跟远程库交互

  • git clone <远程库地址>: 克隆远程库
    1. 完整的克隆远程库为本地库
    2. 为本地库新建origin别名
    3. 初始化本地库
  • git remote -v: 查看远程库地址别名
  • git remote add <别名> <远程库地址>: 新建远程库地址别名
  • git remote rm <别名>: 删除本地库中远程库别名
  • git push <别名> <分支名>: 把远程库的修改拉取到本地
    • 该命令包括git fetch, git merge
  • git fetch <远程库别名> <远程库分支名>: 抓取远程库的指定分支到本地,但没有合并
  • git merge <远程库别名/远程库分支名>: 将抓下来的远程的分支,跟当前所在分支进行合并
  • git fork: 复制远程库
    • 一般是外面团队的开发人员fork本团队项目,然后进行开发,之后外面团队发起pull request,然后本团队进行审核,如无问题本团队进行merge(合并)到团队自己的远程库,整个流程就是本团队跟外面团队的协同开发流程。如在github上向第三方仓库提交代码就是这种操作

fork项目如何更新源项目代码

当源项目代码有更新时,我们可以通过remote的方式去获取更新

更新步骤:

  • 查看目前仓库可以远程更新的信息 git remote -v
  • 配置一个远程更新链接,要拥有git仓库访问权限的 git remote add upstream git@github.com:xxx/xxx.git
  • 拉取远程仓库的代码 git fetch upstream
  • 合并远程仓库的代码 git merge upstream/master
  • 把远程仓库的代码作为新源提交到自己的服务器仓库中 git push

约定式提交

约定式提交的目的是提供人机可读的信息的规范, changelog的生成, 版本号的更新都依赖正确的提交信息, 进一步了解更多的细节: https://www.conventionalcommits.org/zh-hans/v1.0.0-beta.4/

配置好git的信息

git config --global user.name "你的真实姓名(中文)"
git config --global user.email "你的邮箱"

对不同项目使用不同的提交信息
如果对于公司和个人项目期望使用不同的提交作者信息的话, 可以在.gitconfig里通过includeIf来为不同路径的项目配置不同的信息
例如:

为 shm/ 目录下的项目指定使用工作的配置 (.gitconfig-work), 会覆盖上边已经有的配置项
[includeIf "gitdir:shm/"]
path = /Users/roc/.gitconfig-work

安装好LFS插件

// mac上可以通过Homebrew安装, 也可以通过其他的方式
brew install git-lfs
// 安装好git lfs以后, 还需要执行一下初始化的命令 - 只需全局执行一次
git lfs install

关于使用lfs
需要让lfs管理的文件, 需要在提交前通过git lfs track添加到lfs, 例如: 把所有当前目录的png文件添加到lfs: git lfs track *.png 这个脚本可以帮着查找目录下大于1M的文件: find ./ -type f -size +1M

提交的信息按约定式提交的格式填写

git commit -m "{type}: {message}"
示例:
git commit -m "feat: shm-XXXX 添加了XXX功能"

注意: feat:<此处有空格>xxxxxx

支持的Type:
'docs', // 仅仅修改了文档,比如README等
'chore', // 改变构建流程、或者增加依赖库、工具等
'feat', // 添加新功能
'fix', // 修复bug
'refactor', // 代码重构,包括优化相关合代码风格调整
'revert', // 回滚
'test', // 测试用例,包括单元测试、集成测试等
'conf', //配置修改

注:type必须小写

关于提交的message
message为提交的具体内容,如果有明确的Jira,须将jira号包含在message内(可以在jira中关联至该提交)

Breaking change:
对于组件的维护来说, 沟通有与之前版本不兼容的改动是很重要的, 如果有不兼容的改动, 需要在提交信息里通过以下方式之一:
type后边加上!, 例如 refactor!: remove deprecated api - xxx.yyy 提交信息(多行)正文最后标记 BREAKING CHANGE: xxxx 根据提交信息, CI构建的语义化版本号会相应的更新, 体现版本会有不兼容.

常见问题

  1. 一个commit有两件事怎么写? 尽量拆分成两个可交付的子任务,拆不了的就写重要的,次要的可以写入body部分。
  2. 如果我不小心使用了错误的提交类型,该怎么办呢? 刚提交的可以用 git commit –amend 来修改,已经push到远端 (特别是master分支的) 不建议rebase改历史, 因为会影响其他人拉取代码更新。
  3. 如果一个jira对应的工作量很大,需要多次提交该怎么办呢? 可将jira分出多个小jira(子任务)。
  4. 如果一个jira pending了,需要进行其他的任务该怎么办呢? 可用git stash保存之前任务的进度。或者切到不同的分支去进行不同的任务

本文首次发布于 孙忠良 Blog, 作者 [@sunzhongliang] , 转载请保留原文链接.