最近在写业务需求的时候,总是和导师的代码发生冲突,自己在处理的时候还是挺耗费时间的。导师一直提醒我更改和添加代码后要及时提交,但是我总是一股脑写完一串后才提交,没有养成良好的提交习惯。在进行协同工作时,导师提问git的使用原理,而我却只能零星的几个命令的作用。现在就对常用的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
ssh-keygen -t rsa -C "[email protected]"
,如果执行成功,切换到 ~/.ssh 目录下输入命令查看vim ~/.ssh/id_rsa.pub
。当然你也可以使用windows电脑在c盘下进行查找文件:
//码云
ssh -T [email protected]
//Hi hanmeimei! You've successfully authenticated, but GITEE.COM does not provide shell access.表示连接成功
//github
ssh -T [email protected]
//Hi hanmeimei! You've successfully authenticated, but GitHub does not provide shell access.表示连接成功。
经历了以上五步,你就已经顺利完成了git环境的配置,可以和git进行愉快地玩耍了。之所以让你配置那么多,这是因为可以让你避免使用需要你频繁输入账户和密码的https方式。具体的,通过ssh配置git可以通过本地私钥和远程仓库配置的公钥进行匹配,判读是否为一对密钥,可以让你开发效率得以提升。
前面只是开胃菜,接下来将呈上正菜,硬菜干货。
一句话概括:git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何项目。
git最核心的特点就是分布式,其实就是去中心化,让它之间的依赖变弱。它是按照元数据方式存储内容数据,将文件的元信息通过SHA-1哈希算法进行处理隐藏在类似.svn、.cvs等文件中。
git的其它几个特点是:
协同修改,多人并行不悖地修改同一服务器的同一文件。
数据备份,不仅保存目录和文件的当前状态,还能够保存每个提交过的历史状态。
版本管理,在保存每个版本的文件信息时,要做到不重复保存数据,节约存储空间,提升运行效率。
权限控制,对团队成员进行权限控制,对团队外开发者的代码进行审核提交。
历史记录,查看修改人员、修改时间、修改内容、日志信息等,将本地文件回复到某一个历史状态。
分支管理, 允许开发团队在工作过程中多条生产线并行工作,提升工作效率。
关于git是如何进行工作和代码管理的,那么我们得先去了解git的工作区域是如何划分的,这样我们才能在合适的区域使用合适的命令。
在本地系统中的git划分为:工作区、暂存区和本地库(版本库),它们的大致作用如下:
工作区(Workspace):就是本地系统的文件目录,是当前开发过程中看到的最新代码
暂存区(Index):在执行git add
命令后,工作区的文件就临时存储在暂存区中,而暂存区就会对当前移入的文件进行标记索引(index),告知那些文件是被git管理的。(在实际开发中,要养成使用git暂存代码的好习惯,完成某个需求或功能后立刻使用git add
提交到暂存区,防止自己手贱删除)。
本地库(Respository):本地系统作为本地仓库存储着开发项目的历史版本,在执行git commit
命令后便会将提交暂存区的内容到本地仓库存储。
在上图所示流程中,我们可以看到本地库也是栈存储的,在最后提交的文件会存放在最上面,在进行git回滚的时候取得head文件也是最后一次提交的文件内容。
当然将项目文件只存储在本地仓库是没有任何意义的,我们使用git的目的不就是为了协同开发嘛?那么我们就应该将代码从本地库上传到远程库。
git push
命令将代码从本地库同步到远程库中,这样便能实现仓库内容分布在多个地点多个电脑进行协同操作。简而言之,git的工作流程就是:
git add
添加到暂存区git commit
提交到本地仓库git push
推送到远程库,方便分布协同工作git的工作就是创建和保存项目的快照以及与之后的快照进行对比,接下来就让我们上手实践git常用命令。
git init
:在本项目目录下创建本地仓库git remote add origin
:将本地仓库与远程仓库进行链接,origin默认是远程仓库的别名urlgit help (--help)
:查询git命令的帮助信息git help -a
:查询git命令大纲全部信息列表git help
:查询具体命令说明手册git status
:查看本地系统的git状态git reflog
:查看git历史操作记录信息git log
:查看git操作日志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 fetch && git merge
。
git pull --rebase <远程主机名> <远程分支名>:<本地分支名>
:使用rebase模式进行合并
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
指的是只回退到HEADgit diff
:用于比较当前工作区和暂存区的文件差异git diff --cached
:比较暂存区和本地库最近一次commit提交的内容git diff HEAD
:比较工作区和本地库最近一次commit提交的内容在本篇文章中是笔者在工作实际开发和阅读文章总结的,可以快速让你上手git开发,事半功倍,希望对你工作和招聘有所帮助。
《「一劳永逸」一张脑图带你掌握Git命令》
《我在工作中是如何使用 git 的》
《Git 常用操作总结》
《菜鸟教程》
git官网
我是前端小菜鸡,感谢大家的阅读,我将继续和大家分享更多优秀的文章,此文参考了大量书籍和文章,如果有错误和纰漏,希望能给予指正。
更多最新文章敬请关注笔者掘金账号一川萤火和公众号前端万有引力。