在上一篇【Git】介绍、与SVN对比、支持的通信协议 我们介绍了 Git 及它支持的通信协议,这篇我们就来看看如何使用Git。
1.Git 核心命令
git 客户端安装(无脑下一步就行):
1.1 配置管理
在刚装完git的需要配置 email 和 name,然后才能使用 Git,那怎么配置呢?
#查看所有配置信息
git config -l
#查看系统级别配置(git安装目录下etc)
git config --system --list
#查看全局级别配置(当前用户之下表示的是全局级别的)
git config --global --list
#查看仓库级别配置(当前仓库级别下的.git>config文件)
git config --local --list
#添加配置
#用户信息配置
git config --global user.name "yourusername"
git config --global user.email "youremail@email.com"
#要求 Git 版本 1.9.5 以上
git config --global push.default simple
#让Git不要管Windows/Unix换行符转换的事
git config --global core.autocrlf false
#删除配置
git config --unset user.name
注:覆盖优先级为local > global > system。优先读取local,其次是global,最后是system。
1.2 本地初始化Git仓库
如何初始化一个 Git 本地仓库 ?
#当前目录初始化为 git 本地仓库(在同级目录下会出现一个隐藏的.git文件)
git init <directory>
#删除本地仓库=删除.git文件夹
#基于远程仓库克隆至本地
git clone <remote_url
1.3 本地添加
如何将工作空间的文件添加到暂存区?
#添加指定文件到暂存区
git add <fileName>
#添加指定目录至暂存区
git add <directory>
#添加所有
git add -A
#将指定目录及子目录移除出暂存区(注:本地文件还在)
git rm --cached <target> -r
#查看提交状态。如果还未提交到暂存区的文件会标红,在暂存区的文件会标绿。
git status
#添加勿略配置文件 .gitignore
如果我们不想让某个文件被git管理起来,所以如何让 git 忽略这个文件呢?
在仓库的根目录下创建一个.gitignore 文件,写入不想让git管理的文件。两点注意
- .gitignore本身就需要忽略,所以此文件也要写进去
- .gitignore 文件中可以使用“#”字符开头表示注释,文件夹路径是用“/”字符,文件名可以使用通配符“*”,另外还可以使用“!”字符表示排除。比如 * .class
- .gitignore只能忽略那些原来没有被追踪的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。那么解决方法就是先把本地缓存删除(改变成未被追踪状态),然后再提交
- 每一个文件夹沟可以创建自己的“.gitignore”文件,如果它上层的文件夹也有“.gitignore”文件,这个文件夹也会受到它的影响
1.4 本地提交
如何将暂存区的文件提交到本地仓库?
#提交指定文件到本地仓库
git commit <fileName>
#全部提交
git commit -a
#-m编写提交注释(注:如果在commit命令中指定了-m,那么就不会再弹出vim让写提交注释了)
git commit <fileName> -m <注释>
#快捷提交至本地仓库
git commit -am '快添加与提交全部暂存区文件'
1.5 日志管理
如何查看我当前库的历史提交信息?
#查看当前分支下所有提交日志
git log
#查看当前分支下所有提交日志
git log {branch}
# 单行显示日志
git log --oneline
# 比较两个版本的区别
git log master..experiment
#以图表的方式显示提交合并网络
git log --pretty=format:'%h %s' --graph
1.7 分支管理
如果我现在有多个开发人员,开发不同模块,都在master上写吗?
#查看当前分支, -avv查看远程分支
git branch [-avv]
#基于当前分支新建分支
git branch <branch name>
#基于提交新建分支
git branch <branch name> <commit id>
#切换分支
git checkout <branch name>
#删除分支(注:删除时必须在其他分支上)
git branch -d {dev}
#合并分支(比如将要将dev分支的内容合并到master分支,那么要在master分支执行该命令)
#注: 如果因冲突导致自动合并失败,此时 status 为mergeing 状态。需要手动修改后重新提交(commit)
git merge <merge target>
分支规范:
master分支:主分支。保持稳定
- 不允许直接往这个分支提交代码,只允许往这个分支发起 merge request
- 只允许 release 分支和 hotfix 分支进行合流 , 所有在 Master 分支上的 Commit 应该Tag
develop分支:开发分支。相对稳定的分支,用于日常开发,包括代码优化、功能性开发。
feature分支:特性分支。
- 从develop分支拉取,用于下个迭代版本的功能特性开发。
- 功能开发完毕合并到develop 分支, 合并完分支后一般会删点这个Feature分支,但是我们也可以保留。
release分支:发布分支。
从develop分支拉取,用于回归测试,bug修复
发布完成后打tag并合入master和develop, (注:一旦打了Release分支之后不要从Develop分支上合并新的改动到Release分支)
hotfix分支:热更新分支。
从develop分支拉取,用于紧急修复上线版本的问题
修复后打tag并合入master和develop
1.8 tag 管理
Commitid不容易记住,能不能用一种比较独特的方式去记住每个版本?答:Commitid相当于IP,Tag相当于域名。
#查看当前仓库的标签列表
git tag
#创建分支
git tag <tag name> <branch name>
#删除分支
git tag -d <tag name>
1.9 远程仓库
本地仓库说完了,那如果我不同地区的人要合作开发怎么搞?答:远程仓库,GitHub或Gitee。
#查看远程配置
git remote [-v]
#添加远程仓库地址(注:远程仓库一般命名为origin,不同的远程仓库需要配置不同的名字; url一般多采用http协议)
git remote add <github name> <url>
#删除远程地址
git remote remove <github name>
#拉取代码到本地
git clone <url>
git clone <url> <filepath>
#上传新分支至远程
git push -u <github name> <branch name>
或
#将本地分支与远程建立关联
git --track --set-upstream-to=<github name>/<remote branch> <local branch>
#直接使用git push 时只会上传的到一个远程仓库的一个分支,是上面 --track 设置的仓库和相应分支
git push
#拉取远端代码并与当前分支合并= git fetch + git merge
#注:如果不指定参数则是当前本地分支关联的远程分支
git pull <url> <branch>
或
#提取远程仓库(如果服务器有修改,不会到本地)
git fetch
#合并冲突(如果只是本地或远程一端修改的话,就不会冲突)
git merge <branch>
另外,无论是推送还是拉代码,需要有这样一个权限,也就是说你目前使用的这台电脑是否安全,如果不安全,人家不会让你去推送,而github采用的是RAS加密方式通讯
#1. 查看本地是否已经有公钥
cat ~/.ssh/id_rsa.pub
#2. 如果没有,则在本地中生成一个 ssh key。输入后一直回车即可完成。
ssh-keygen -t rsa -C youremail.com
#3. 把这个key告诉github/码云
Github Settings -> SSH and GPG keys --> New SSH key --> 将公钥粘贴并保存
另外,在向别人的代码库推送代码时必须要先拥有项目的开发者权限
1.10 代码回滚
如果线上新提交的代码有问题了,那怎么回退到上一个版本呢?
#回退
#仅仅只是撤销已提交的版本库,不会修改暂存区和工作区
git reset --soft <commitid>
#仅仅只是撤销已提交的版本库和暂存区,不会修改工作区
git reset --mixed <commitid>
#彻底将工作区、暂存区和版本库记录恢复到指定的版本库
git reset --hard <commitid>
#回滚
git revert -n <commitid>
关于回滚,一般步骤是
- 使用 git log 命令,查看分支提交历史,确认需要回退的版本
- 使用 git reset 或者 git revert 命令,进行版本回退
- 使用 git push 命令,推送至远程分支(必须!!否则只能本地回退)
这里就重点说一下 git reset 和 git revert 的区别
举个例子,比如在master分支,有以下提交历史(PS:该示例出自这篇文章):
42eae13 (HEAD -> master) 第四次修改
97ea0f9 第三次修改
e50b7c2 第二次修改
3a52650 第一次修改
可以看到,master最新版本为第四次修改。
如果发现,在第四次修改有错误,需要回滚到第三次修改,就可以用reset命令来回退。
执行 git reset --hard 97ea0f9,这个时候,git的提交历史变为:
97ea0f9 (HEAD -> master) 第三次修改
e50b7c2 第二次修改
3a52650 第一次修改
可以看到master当前指向97ea0f9这个版本,我们回到了第三次修改。
使用 reset 命令,Git 会把要回退版本之后提交的修改都删除掉。要从第四次修改回退到第一次修改,那么会删除第二、三、四次的修改。【注:这里并不是真正的物理删除】
那如果发现第三次修改有错误,想要恢复第三次修改,却要保留第四次修改呢?
这个时候就可以用revert命令:
git revert -n 97ea0f9
git commit -m "恢复第三次修改"
Git提交历史会变成:
33b8b30 (HEAD -> master) Revert "恢复第三次修改"
42eae13 第四次修改
97ea0f9 第三次修改
e50b7c2 第二次修改
3a52650 第一次修改
实际上,Git把第三次修改从提交中剔除(还原)了,还保留了第四次修改,并且产生了新的commit_id。
在实际生产环境中,代码是基于master分支发布到线上的,会有多人进行提交。可能会碰到自己或团队其他成员开发的某个功能在上线之后有Bug,需要及时做代码回滚的操作。
在确认要回滚的版本之后,如果别人没有最新提交,那么就可以直接用reset命令进行版本回退,否则,就可以考虑使用revert命令进行还原修改,不能影响到别人的提交。或者说,除非在非常有把握的情况下,否则不要使用reset强推。
小结
2.工具使用 Git
一般我们在实际开发更多是用现成IDE自带的GIT工具或者图形化工具去操作Git
- IDEA操作GIT:IDEA中的Git操作,看这一篇就够了!
- 可视化工具 SourceTree:这里放上我自己用的破解版(链接:https://pan.baidu.com/s/1i82Fkeb5ZzuLtdarWSlVDw 提取码:rubp)
后面博主有时间了会再出一篇搭建 Git 私服的教程(先挖个坑)…







发表评论