git这只猫你撸的还顺手吗
前言
如大家所知,Git是一个免费且开源的分布式版本控制系统,它能自动记录每次文件的改动,还可以让开发者协作编辑。如果想查看某次改动,只需要在软件里瞄一眼就可以。现在大部分公司都是使用git作为版本控制工具,这也是我们每天都要打交道的工具。那么,你能撸顺git这只猫吗?
git基本命令
git init
//表示初始化,把这个文件变成Git可以管理的仓库。初始化后打开隐藏的文件可以看到有一个.git文件
git init
复制代码
git add
作用就是将需要提交的代码从工作区添加到暂存区,就是告诉git系统,要提交哪些文件,之后就可以使用git commit命令进行提交了。
//不加参数默认为将修改操作的文件和未跟踪新添加的文件添加到git系统的暂存区,即添加当前仓库所有改动,注意不包括删除
git add .
//-u 表示将已跟踪文件中的修改和删除的文件添加到暂存区,不包括新增加的文件,注意这些被删除的文件被加入到暂存区再被提交并推送到服务器的版本库之后这个文件就会从git系统中消失了。
git add -u .
//-A 表示将所有的已跟踪的文件的修改与删除和新增的未跟踪的文件都添加到暂存区。
git add -A .
复制代码
Git commit
主要是将暂存区里的改动给提交到本地的版本库。每次使用git commit命令我们都会在本地版本库生成一个40位的哈希值,这个哈希值也叫commit-id
//把暂存区的全部文件提交到本地仓库。-m后接说明
git commit -m ‘message’
//-a参数可以将所有已跟踪文件中的执行修改或删除操作的文件都提交到本地仓库,即使它们没有经过git add添加到暂存区,但是新加的文件(即没有被git系统管理的文件)是不能被提交到本地仓库的。
git commit -am ‘message’ -am等同于-a -m
复制代码
Git push
在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了。git push的一般形式为 git push <远程主机名> <本地分支名> <远程分支名> ,例如 git push origin master:refs/for/master ,即是将本地的master分支推送到远程主机origin上的对应master分支, origin 是远程主机名。第一个master是本地分支名,第二个master是远程分支名。
//如果远程分支被省略,如上则表示将本地分支推送到与之存在追踪关系的远程分支(通常两者同名),如果该远程分支不存在,则会被新建
git push origin master
//如果省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支,等同于 git
git push origin :refs/for/master
//如果当前分支与远程分支存在追踪关系,则本地分支和远程分支都可以省略,将当前分支推送到origin主机的对应分支
push origin –delete master
git push origin
//如果当前分支只有一个远程分支,那么主机名都可以省略,形如git push,可以使用git branch -r,查看远程的分支名
git push
复制代码
git pull
//从远程仓库拉取代码并合并到本地,可简写为 git pull 等同于 git fetch && git merge
git pull <远程主机名> <远程分支名>:<本地分支名>
//使用rebase的模式进行合并
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
复制代码
git fetch
//这个命令将某个远程主机的更新全部取回本地
git fetch <远程主机名>
//如果只想取回特定分支的更新,可以指定分支名
git fetch <远程主机名> <分支名> //注意之间有空格
//最常见的命令如取回origin 主机的master 分支
git fetch origin master
//取回更新后,会返回一个FETCH_HEAD ,指的是某个branch在服务器上的最新状态,可以在本地通过它查看刚取回的更新信息:
git log -p FETCH_HEAD
复制代码
git branch
创建分支
//基于当前commit创建test分支。.git/HEAD 文件中记录了当前分支名字。
git branch test:
复制代码
删除分支
//删除本地test分支
git branch -d test
//test分支还没有合入当前分支,所以要用-D参数才能删掉。
git branch -D test
复制代码
查看分支
//列出当前分支清单
git branch
//查看远程分支和本地分支
git branch -a
//查看各个分支最后一个提交信息
git branch -v
//查看哪些分支已经合并入当前分支
git branch --merged
复制代码
git提交规范
commit message应该清晰明了,说明本次提交的目的,以AngularJS的提交规范为例讲一下git提交规范。每次提交Commit message都包括三个部分:header,body 和 footer。
():
其中header是必需的,body和footer可以省略。建议任何一行都不要超过72个字符(或100个字符),避免自动换行影响美观。
Header
Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)。
type
用于说明commit的类别,只允许使用下面7个标识。
feat:新功能(feature)
fix:修补bug
docs:文档(documentation)
style:格式(不影响代码运行的变动)
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
test:增加测试
chore:构建过程或辅助工具的变动
scope
scope用于说明commit影响的范围,比如数据层、控制层、视图层等等,或者写明影响的功能模块,以便快速定位。如果你的修改影响了不止一个scope,你可以使用*代替。
subject
subject是本次提交的简短描述,应该像一个文章标题一样,不要过长。
Body
Body部分是对本次commit的详细描述,罗列代码功能,可以分成多行。body是可选的,subject描述的足够清楚的话body可以不用写。
footer
描述与本次提交相关联的break change或issue。适用于以下情况:
1.不兼容变动:如果当前代码与上一个版本不兼容,则Footer部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。
2.关闭 Issue:如果当前commit针对某个issue,那么可以在Footer部分关闭这个issue 。
常见问题
修改提交git账号
首次用git提交某次修改时会让你输入对应的name和email,这会作为当前节点的的全局配置,在后续的提交都是用的这个账号。若是需要修改账号可用以下操作:
通过命令git config --list查看当前的git相关配置,找到user.name 和user.email,修改即可。
修改全局(修改全局默认值)name和email,通过以下命令:
git config --global user.name yourName;
git config --global user.email yourEmail;
复制代码
只修改当前project的name和email,在当前project目录下通过命令:
git config user.name yourName;
git config user.email yourEmail;
复制代码
撤消本地提交
git reset HEAD~2 # undo last two commits, keep changes
git reset --hard HEAD~2 # undo last two commits, discard changes
复制代码
hard选项会重置working tree以及索引,造成所有的修改全部丢失。
改错代码分支
日常开发中可能会出现当开发了完功能准备提交代码时发现修改在了错误的分支上面,那么怎么处理呢?
还未commit的情况:
git add --all #把所有改动暂存
git stash #把暂存的文件提交到git的暂存栈
git checkout #切换到正确的分支
git stash pop #将暂存栈中的代码放出来
复制代码
已经commit的情况:
先切换到改错了的分支
git reset HEAD~1 #把最近一次提交放回暂存区, 并取消此次提交
git stash #把暂存的文件提交到git的暂存栈
git checkout #切换到正确的分支
git stash pop #将暂存栈中的代码放出来
git push origin 错误的分支 -f #把远程里面不该提交的移除
复制代码
git处理冲突
当拉取下来的文件与本地修改的文件有冲突,先提交你的改变,或者先将你的改变暂时存储起来
git stash #将本地修改存储起来
git pull #pull内容
git stash pop stash@{0} #还原暂存的内容
git stash pop #简写
复制代码
找到合并后破坏了某些内容的提交
跟踪在大型合并之后引入了bug的提交非常耗时。git有个二进制搜索工具git-bisect。首先执行初始设置:
git bisect start # starts the bisecting session
git bisect bad # marks the current revision as bad
git bisect good revision # marks the last known good revision
复制代码
再次运行spec文件并提交相应的“good”或“bad”标记。
git bisect good # or git bisec bad
复制代码
总结
本文总结了工作中使用较为高频的Git命令的用法,以及git的提交规范,常见问题的处理。在我们的日常开发中少不了对Git的使用,我们要像撸猫一样,撸的顺手,漂亮!
作者:西vvi
链接:https://juejin.cn/post/7025786618632437797
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。