本地操作
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
命令 - 如果出现合并冲突
- 打开文件删除git自动标记符号,如««HEAD 、»»等
- 修改完成后,保存退出
- git add
- git commit -m “日志信息”,此时后面不要带文件名
- 如果
本地库跟远程库交互
git clone <远程库地址>
: 克隆远程库- 完整的克隆远程库为本地库
- 为本地库新建origin别名
- 初始化本地库
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构建
的语义化版本号会相应的更新, 体现版本会有不兼容.
常见问题
- 一个commit有两件事怎么写? 尽量拆分成两个可交付的子任务,拆不了的就写重要的,次要的可以写入body部分。
- 如果我不小心使用了错误的提交类型,该怎么办呢? 刚提交的可以用 git commit –amend 来修改,已经push到远端 (特别是master分支的) 不建议rebase改历史, 因为会影响其他人拉取代码更新。
- 如果一个jira对应的工作量很大,需要多次提交该怎么办呢? 可将jira分出多个小jira(子任务)。
- 如果一个jira pending了,需要进行其他的任务该怎么办呢? 可用git stash保存之前任务的进度。或者切到不同的分支去进行不同的任务
本文首次发布于 孙忠良 Blog, 作者 [@sunzhongliang] , 转载请保留原文链接.