Git快速上手指南
安装初始化
MAC环境
官网下载安装https://git-scm.com/
Windows环境
官网下载安装https://git-scm.com/
配置初始化
$ git config --global user.name "Your Name"
$ git config --global user.email "email@example.com"
此处需要根据公司需求,设置用户名和邮箱。一般使用公司邮箱。
删除某个配置
$ git config --unset user.name
git config
git config有三个级别:
- system(系统级别)
- global(用户级别)
- local(仓库级别)
优先读取local,其次是global,最后是system。
通过以下命令可以查看相应级别配置
$ git config --system --list
$ git config --global --list
$ git config --local --list
GitHub
建立SSH连接
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "youremail@example.com"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,设置密码后,每次git pull和git push时都会进行密码验证,建议不设置密码。
如果一切顺利的话,可以在用户主目录里,windows一般位于C:\Users\用户名找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容,点“Add Key”,你就应该看到已经添加的Key。
SSH连接的原因:因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
当然,GitHub允许你添加多个Key。假定你有若干电脑,你一会儿在公司提交,一会儿在家里提交,只要把每台电脑的Key都添加到GitHub,就可以在每台电脑上往GitHub推送了。
最后友情提示,在GitHub上免费托管的Git仓库,任何人都可以看到喔(但只有你自己才能改)。所以,不要把敏感信息放进去。
如果你不想让别人看到Git库,有两个办法,一个是交点保护费,让GitHub把公开的仓库变成私有的,这样别人就看不见了(不可读更不可写)。
公司一般使用GitLab,设置方法大同小异。
Git基本图解
常用命令
git add
添加某个文件
git add <file>
添加所有文件
git add .
git add命令实际上就是把要提交的所有修改放到暂存区(Stage),然后,执行git commit就可以一次性把暂存区的所有修改提交到分支。
git commit
提交当前添加文件,并添加注释message。
git commit -m <message>
注意各个公司的代码注释规范。以阿里规范为例:阿里前端Git提交日志格式规约
type类型:
-
feat: 新增功能。
-
fix: 修复 bug。
-
docs: 文档相关的改动。
-
style: 对代码的格式化改动,代码逻辑并未产生任何变化。
-
test: 新增或修改测试用例。
-
refactor: 重构代码或其他优化举措。
-
chore: 项目工程方面的改动,代码逻辑并未产生任何变化。
git status
仓库当前的状态
$ git status
对比某个文件的差异
$ git diff <filename>
git log
查看commit提交日志
$ git log
简洁版
$ git log --pretty=oneline
git reset
回退版本
根据git log得到的日志,获取commit_id进行版本回退。git中用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
$ git reset --hard commit_id
当然如果回退到某个版本后,发现操作失误,想要回到“未来”也是可以的。通过git reflog找到对应的commit_id即可。
$ git reflog
暂存区回退工作区
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
$ git reset HEAD <file>
git checkout
丢弃工作区修改
git checkout -- file可以丢弃工作区的修改,注意命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令。
$ git checkout -- file
这条命令的意思是:把file文件在工作区的修改全部撤销,这里有两种情况:
file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
总之,就是让这个文件回到最近一次git commit或git add时的状态。
注意:git checkout -- file其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
切换分支
新版本的git switch命令更加符合语意
$ git checkout <branchname>
$ git switch master
创建并切换分支
$ git checkout -b <branchname>
$ git switch -c dev
创建与远程分支一致的分支
$ git checkout -b dev origin/dev
git push
关联远程仓库
要关联一个远程库,使用命令
$ git remote add origin git@server-name:path/repo-name.git
关联后,使用命令git push -u origin master第一次推送master分支的所有内容
向远程推送分支
推送分支,就是把该分支上的所有本地提交推送到远程库。推送时,要指定本地分支,这样,Git就会把该分支推送到远程库对应的远程分支上:
$ git push origin master
git clone
当远程有一个仓库时,通过以下命令,可以克隆出一个本地库。
$ git clone git@github.com:username/repository.git
Git支持两种协议,ssh和https。
git branch
查看分支
$ git branch
创建分支
$ git branch <branchname>
删除分支
$ git branch -d <branchname>
当一个分支还没有合并到其他分支,强行进行删除时,可以使用:
$ git branch -D <branchname>
建立本地分支与远程分支连接
$ git branch --set-upstream-to <branch-name> origin/<branch-name>
git merge
在GitLab中一般在左侧菜单栏发起merge请求。
Fast forward模式
此模式合并看不出来曾经做过合并,所以不推荐
git merge命令用于合并指定分支到当前分支。在master分支上执行下面的命令,含义是:将dev分支合并到master分支上
$ git merge dev
当Git无法自动合并分支时,就必须首先解决冲突。解决冲突后,再提交,合并完成。解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。
通过带参数的git log可以看到分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
普通模式
合并后的历史有分支,能看出来曾经做过合并
因为本次合并要创建一个新的commit,所以加上-m参数,把commit描述写进去。
$ git merge --no-ff -m "merge with no-ff" dev
通过带参数的git log可以看到分支合并图
$ git log --graph --pretty=oneline --abbrev-commit
git stash
将当前工作区进行储存。也就是说当前分支可以不进行add和commit操作,就可以切到新的分支,回头可以恢复到储存的状态。
$ git stash
通过git stash list命令查看储存,恢复储存有两种方式:
git stash apply恢复,但是恢复后,stash内容并不删除,需要用git stash drop来删除git stash pop,恢复的同时把stash内容也删了
可以使用多次stash,恢复的时候,先用git stash list查看,然后恢复指定的stash,用命令进行恢复
$ git stash apply stash@{0}
git cherry-pick
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。其中的<commit_id>指的是在修复bug后,进行提交的commitId。
$ git cherry-pick <commit_id>
git remote
远程仓库的默认名称是origin,要查看远程库的信息,用git remote。使用git remote -v显示更详细的信息。
$ git remote [-v]
git tag
为某个commit打上标签tag,方便查找。tag是与commit_id绑定的,所以如果多个分支上同一个commit_id,那么都会有tag。
首先,切换到需要打标签的分支上:
$ git branch
$ git checkout master
然后,敲命令git tag <name>就可以打一个新标签:
$ git tag v1.0
可以用命令git tag查看所有标签:
$ git tag
对某次commit进行打标签
$ git tag v0.9 commit_id
可以用git show <tagname>查看标签信息
创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" commit_id
删除标签
$ git tag -d v0.1
- 命令
git push origin <tagname>可以推送一个本地标签; - 命令
git push origin --tags可以推送全部未推送过的本地标签; - 命令
git tag -d <tagname>可以删除一个本地标签; - 命令
git push origin :refs/tags/<tagname>可以删除一个远程标签。
开发流程
- 首先,可以试图用
git push origin <branch-name>推送自己的修改; - 如果推送失败,则因为远程分支比你的本地更新,需要先用
git pull试图合并; - 如果合并有冲突,则解决冲突,并在本地提交;
- 没有冲突或者解决掉冲突后,再用
git push origin <branch-name>推送就能成功!
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。