文章目录
转载请注明原始链接:http://blog.csdn.net/a464057216/article/details/52823207
后续此博客不再更新,欢迎大家搜索关注微信公众号“测开之美”,测试开发工程师技术修炼小站,持续学习持续进步。
导语
推荐学习网站:
关于Git的教程网上有很多,推荐先学习廖雪峰老师的博客。使用Git一段时间以后再看下Git-tower中的教程,Git客户端的操作应该足够了。笔者作为测试开发工程师,除了日常开发使用Git工具本身以外,还做了一些开发流程上QA的思考,以期能够规范项目的开发,避免因为开发人员的误操作影响线上产品的质量,也推荐大家学习一下git-flow。
如下是我的一些备忘笔记,供自己参考之用(可能很多基础命令没有覆盖到)。
命令行
暂存
git stash
暂存与分支无关。
分支信息
git branch -va
:查看所有分支(本地+远端)详细信息。
git branch -vr
:查看远端分支详细信息。
git branch -v
:查看本地分支详细信息。
git checkout --track remote/branch
:根据远端分支创建本地分支并自动建立关联。
git branch -vva
:查看查看所有分支(本地+远端)详细信息(包含关联信息)。
撤销修改
修改本地的上一次提交,不能修改已经push到远端的修改
git commit --amend -m "commit message"
,可以只修改注释消息,或者将本来应该属于上一次的修改add到stage后,执行git commit --amend
修改上一次提交,从log上看会替换上一次提交,就像错误的提交不曾存在或一样。
撤销或删除本地未提交的修改
恢复已经提交的修改
git revert commit-hash
不会将仓库回滚到相应的commit-hash
对应的版本,而是尝试恢复回去(如果有冲突需要解决冲突)然后进行一次新的提交。
git reset --hard commit-hash
会真的丢弃中间版本,回滚到对应的版本,所以使用--hard
参数时一定要小心。不过,通过git reflog
命令能够查到HEAD历史上对应的commit-hash
信息,还能恢复回来。
比较差异
git diff
命令的习惯用法是git diff old_commit_hash..new_commit_hash
(查看不同提交之间的差异)或者git diff branchA..branchB
(查看不同分支之间的差异),其余用法如下:
撤销合并
合并冲突时,只要没有git commit
合并后的修改,就可以使用git merge --abort
命令随时撤销这次合并(恢复到git pull
以前的状态)。
git rebase
合并冲突时,如果使用git rebase branchB
合并分支B到当前分支A,过程如下:
1.首先将分支A的不同提交暂存起来
注:上述图片来自git tower。
2.将分支B上的提交整合到分支A(re-based):
注:上述图片来自git tower。
3.最后将分支A上的暂存内容挂到分支B的提交之后:
注:上述图片来自git tower。
rebase合并之后,分支A的历史记录被改写了,如果提交C3已经发布出去了的话,这样修改是非常危险的。所以git rebase
适合的场景是:与同事一起基于develop分支开发,同事先完成任务,将他开发的新功能A的分支rebased到develop分支,我们自己完成新功能B的开发以后,在develop分支将featuer-B功能rebase进来,这样develop分支的version tree看起来就是一条直线。最后本轮开发结束时,应该在master分支上执行git merge develop --no-ff
命令合并develop分支的开发,这样可以方便的保留开发合并记录。
子模块
添加子模块
在项目目录的lib目录中,执行如下命令添加子模块:
git submodule add https://github.com/djyde/ToProgress
子模块的内容并不包含在项目中,项目只保存子模块的路径、URL及其检出版本。
添加子模块之后,git status
命令可以看到改动已经提交到了stage,然后使用git commit -m message
命令提交改动到仓库即可。
clone子模块
clone一个包含子项目的Git项目时,需要使用git clone --recurse-submodules
命令在clone的同时初始化所有子模块。如果clone时没有使用--recurse-submodules
参数,可以使用git submodule update --init --recursive
命令初始化子模块。
指定子模块的版本
切换到子模块的项目目录(/lib/ToProgress
),执行git log --oneline --decorate
命令查看子模块的版本情况,然后检出一个版本,比如:git checkout 0.1.1
,在父项目目录执行git submodule status
可以查看子模块信息,然后在父项目执行git commit -a -m message
提交修改。
在与同事合作开发项目时,如果其他同事修改了子模块的版本,我们合并冲突后还需要使用git submodule update lib/ToProgress
命令更新相应的模块(工作区中模块的内容)。
更新子模块版本
如果要更新子模块到最新版本,需要在其上下文中执行git pull origin master
命令拉取其最新代码,然后git checkout master
到master分支,回到父目录执行git submodule status
可以查看是否更新成功。
删除子模块
删除子模块,需要先执行git submodule deinit module_name
指定清除子模块的配置文件,然后使用git rm lib/module_dir
删除子模块的内容,最后git commit -a -m message
提交更改。
git-flow工具
Mac上使用Oh-my-zsh上安装git-flow,如果在plugin中使能了git-flow以后,命令行补全功能不好使,需要重新安装git客户端:
$ brew uninstall git
$ brew install git --without-completions
然后安装git-flow:$ brew install git-flow
。
初始化一个git-flow仓库:
$ git init
$ git config user.name mars
$ git config user.email mars@loo.com
$ git flow init
开始一个功能分支开发:$ git flow feature start feature_name
。
分支功能开发完成以后:$ git flow feature finish feature_name
。
发布版本:$ git flow release start version_number
。
完成发布:$ git flow release finish version_number
。
开始hotfix:$ git flow hotfix start bug_number
。
结束hotfix:$ git flow hotfix finish bug_number
。
如果觉得我的文章对您有帮助,欢迎关注我(CSDN:Mars Loo的博客)或者为这篇文章点赞,谢谢!