写在前面
最近在写业务需求的时候,总是和导师的代码发生冲突,自己在处理的时候还是挺耗费时间的。导师一直提醒我更改和添加代码后要及时提交,但是我总是一股脑写完一串后才提交,没有养成良好的提交习惯。在进行协同工作时,导师提问git的使用原理,而我却只能零星的几个命令的作用。现在就对常用的git命令的作用和原理进行总结,希望能够帮助更多人少走弯路,提升开发效率。
1. git下载&配置
工欲善其事,必先利其器。你想要顺利的使用git管理代码,必须先下载和在本地配置好你的git环境。
- 下载git工具,前往git官网自行根据电脑系统选择对应版本即可。
- 配置和ssh账户信息,在命令行输入配置git账号信息并可以进行查看。
当然,配置git账户信息也分为项目级别和系统级别的,采用就近原则(项目级别优先于系统级别,二者都有时采用项目级别的签名),如果只有系统级别则以系统级别为准,但是不允许二者都没有。通常的,设置系统级别账户信息即可。
- // 创建系统级别账户信息
- $ git config --global user.name "我的姓名"
- $ git config --global user.email "我的邮箱"
- // 查看系统级别账户信息
- $ git config --global user.name
- $ git config --global user.email
项目账户信息存储在.git/config文件中,系统账户信息存储在~/.gitconfig中。
- // 创建项目级别账户信息
- $ git config user.name "我的姓名"
- $ git config user.email "我的邮箱"
- // 查看项目级别账户信息
- $ git config user.name
- $ git config user.email
3.本地生成ssh密钥,输入并执行 ssh-keygen -t rsa -C "xxxxx@xxxxx.com",如果执行成功,切换到 ~/.ssh 目录下输入命令查看vim ~/.ssh/id_rsa.pub。
当然你也可以使用windows电脑在c盘下进行查找文件:
4.复制公钥到github、gitlab以及码云等git仓库(切记三个平台可以使用同一个公钥)
5.查看ssh密钥是否配置成功
- //码云
- ssh -T git@gitee.com
- //Hi hanmeimei! You've successfully authenticated, but GITEE.COM does not provide shell access.表示连接成功
- //github
- ssh -T git@github.com
- //Hi hanmeimei! You've successfully authenticated, but GitHub does not provide shell access.表示连接成功。
经历了以上五步,你就已经顺利完成了git环境的配置,可以和git进行愉快地玩耍了。之所以让你配置那么多,这是因为可以让你避免使用需要你频繁输入账户和密码的https方式。具体的,通过ssh配置git可以通过本地私钥和远程仓库配置的公钥进行匹配,判读是否为一对密钥,可以让你开发效率得以提升。
前面只是开胃菜,接下来将呈上正菜,硬菜干货。
二. git简要概述
一句话概括:git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何项目。
git的特点
git最核心的特点就是分布式,其实就是去中心化,让它之间的依赖变弱。它是按照元数据方式存储内容数据,将文件的元信息通过SHA-1哈希算法进行处理隐藏在类似.svn、.cvs等文件中。
git的其它几个特点是:
- 协同修改,多人并行不悖地修改同一服务器的同一文件。
- 数据备份,不仅保存目录和文件的当前状态,还能够保存每个提交过的历史状态。
- 版本管理,在保存每个版本的文件信息时,要做到不重复保存数据,节约存储空间,提升运行效率。
- 权限控制,对团队成员进行权限控制,对团队外开发者的代码进行审核提交。
- 历史记录,查看修改人员、修改时间、修改内容、日志信息等,将本地文件回复到某一个历史状态。
- 分支管理, 允许开发团队在工作过程中多条生产线并行工作,提升工作效率。
git的工作区域和流程
关于git是如何进行工作和代码管理的,那么我们得先去了解git的工作区域是如何划分的,这样我们才能在合适的区域使用合适的命令。
在本地系统中的git划分为:工作区、暂存区和本地库(版本库),它们的大致作用如下:
- 工作区(Workspace):就是本地系统的文件目录,是当前开发过程中看到的最新代码
- 暂存区(Index):在执行git add命令后,工作区的文件就临时存储在暂存区中,而暂存区就会对当前移入的文件进行标记索引(index),告知那些文件是被git管理的。(在实际开发中,要养成使用git暂存代码的好习惯,完成某个需求或功能后立刻使用git add 提交到暂存区,防止自己手贱删除)。
- 本地库(Respository):本地系统作为本地仓库存储着开发项目的历史版本,在执行git commit命令后便会将提交暂存区的内容到本地仓库存储。
本地系统的git工作区域
在上图所示流程中,我们可以看到本地库也是栈存储的,在最后提交的文件会存放在最上面,在进行git回滚的时候取得head文件也是最后一次提交的文件内容。
当然将项目文件只存储在本地仓库是没有任何意义的,我们使用git的目的不就是为了协同开发嘛?那么我们就应该将代码从本地库上传到远程库。
- 远程库(Remote):就是用来托管代码的服务器作为远程仓库,通过执git push命令将代码从本地库同步到远程库中,这样便能实现仓库内容分布在多个地点多个电脑进行协同操作。
完整的git工作区域
简而言之,git的工作流程就是:
- 在工作区修改、添加文件
- 将工作区中操作后的代码通过git add添加到暂存区
- 将暂存区的文件通过git commit提交到本地仓库
- 将本地库的修改通过git push推送到远程库,方便分布协同工作
三. git常用命令
git的工作就是创建和保存项目的快照以及与之后的快照进行对比,接下来就让我们上手实践git常用命令。
创建本地仓库和链接远程仓库
- git init:在本项目目录下创建本地仓库
- git remote add origin:将本地仓库与远程仓库进行链接,origin默认是远程仓库的别名url
查询操作
文档查询
- git help (--help):查询git命令的帮助信息
- git help -a:查询git命令大纲全部信息列表
- git help:查询具体命令说明手册
状态查询
- git status:查看本地系统的git状态
- git reflog:查看git历史操作记录信息
- git log:查看git操作日志
文件提交 git commit
- git commit:提交暂存文件到本地库,会打开编辑器进行编辑。
- git commit -m "filename message":提交暂存文件到本地库,记录下提交文件的备注。
- git commit -am:提交暂存文件到本地库,等价于git add . && git commit -m。
- git commit --amend:提交暂存文件到本地库,对最近的一次提交信息进行修改,会修改commit的hash值。
拉取文件 git pull
- git pull <远程主机名> <远程分支名>:<本地分支名>:从远程仓库拉取代码合并到本地工作区,当然日常拉取可以简写为git pull等价于git fetch && git merge。
- git pull --rebase <远程主机名> <远程分支名>:<本地分支名>:使用rebase模式进行合并
拉取远程更改文件 git fetch
git fetch和git pull都是进行远程文件拉取,区别在于git pull是将指定分支的所有文件合并到本地,而git fetch是将指定分支的更新文件进行拉取,但是不会进行合并
- git fetch <远程主机名> <远程分支名>:<本地分支名>:从远程仓库拉取指定分支的更新内容到本地指定分支。
- git fetch --all:从远程仓库拉取所有分支的更新内容
分支管理
- git branch:查看本地分支
- git branch -r:查看远程分支
- git branch -a:查看本地和远程分支
- git checkout <其它分支>:从当前分支切换到其它分支
- git checkout -b <新建分支名>:创建并切换到新建分支
- git branch -d <待删除的分支名>:删除指定的本地分支
- git merge <指定分支名>:将当前分支与指定分支进行合并
- git branch -m <旧分支名>:<新分支名>,将旧分支名更改为新分支名
- git branch --merged:查看当前有哪些分支已与当前所处分支合并
- git branch --no-merged:查看当前有哪些分支尚未与当前分支合并
- git branch -v:查看本地的各个分支最后一次提交对象的信息
- git branch -b <本地分支名> <远程分支名>,拉取远程分支并创建本地分支
撤销操作
git checkout --:撤销工作区的修改操作
git reset HEAD:撤销暂存区的最后一次提交操作(不会覆盖工作区)
git reset --(soft|mixed|hard) |<指定commit id>:将当前代码回滚到指定版本
- --hard指的是回滚全部代码,包括HEAD、index、工作树
- --mixed指的是回滚部分代码,包括HEAD、index
- --soft指的是只回退到HEAD
差异比较
- git diff:用于比较当前工作区和暂存区的文件差异
- git diff --cached:比较暂存区和本地库最近一次commit提交的内容
- git diff HEAD:比较工作区和本地库最近一次commit提交的内容
思维导图
小结
在本篇文章中是笔者在工作实际开发和阅读文章总结的,可以快速让你上手git开发,事半功倍,希望对你工作和招聘有所帮助。