给测试小姐姐讲git命令

测试:你来给我讲讲git吧,我一直想了解一下git

me:你不是会用git么

测试:呃,只是能用,其实不知道怎么回事

me:好吧,那我就跟你讲讲,这个git啊,它...
me:这我不知道从哪开始讲起啊,要不你说说你想听点什么吧

测试:比如我们常用的pull,push,rebase和merge命令,我就一直不太明白push和rebase还有merge的区别

me:看来你是真的不明白,一般人都会问rebase和merge的区别。那我就从pull和push开始说吧,你知道git分本地和远程仓库么

测试:这个知道的,之前有人跟我讲过git分成本地文件,本地仓库和远程仓库

me:没毛病,为了方便后面跟你讲的东西,我先复习一下

几个文件分布

  • (working copy)工作区:就是本地文件,这也是你真正改代码的地方,其实你可以认为它和git还没啥关系
  • (stagging)暂存区:是本地文件和本地仓库的中间地带,你可以认为在这个地方的文件就是即将要提交到git仓库的
  • (local repo)本地仓库:这个是你机器上的git仓库,你可以把它理解为游戏存档
  • (remote repo)远端仓库:这个是真·git仓库,你可以把它理解成上传到服务器上可以和别人共用的游戏存档

测试:这个stagging是个什么东西,我怎么没听说过?

me:别急,还没复习完,我们再来复习一下平常用的最多的几个命令

各区域交互流程

  • git add .:add命令负责把工作区的文件添加到暂存区,我想很多人都喜欢这么玩,毕竟这么玩最方便,不过我不会用git命令,我都是用工具的,所以我不这么玩。喜欢用命令的话可以去翻翻官网的add命令教程,反正我不看
  • git commit -m "add README.md": commit 命令把暂存区的数据提交到本地仓库,之前说过我喜欢用工具,所以也不会这个命令,有兴趣的可以去看官网...
  • git push: push命令把本地仓库的数据推到远端仓库,push命令的玩法还挺多的,但是还是同上,我不会,看官网
  • git pull: pull命令把远端仓库的代码拉取到本地仓库,官网~

测试:哦,我说怎么每次commit之前都要add一下,原来是这样,commit只会提交暂存区的数据对吧

me:可以这么理解,不过commit也可以通过 -a参数来隐式调用add,比如‘git commit –a –m "add README.md"’就相当于“git add .”和“git commit -m "add README.md"”,

测试:好的我知道了,那merge和rebase呢

merge和reabse的区别

image.png

me:比如你现在拉一个feature分支改了代码(4,5),正准备合并到上去,但是这时候发现别人已经提交了一个版本(3)上去了,这个时候如果没有merge和rebase操作,你该怎么办呢

测试:。。。

me: 你看这样行不行,我把自己本地的改动全部删掉,然后从新冲远端进行一次pull操作,更新成最新的代码,然后再重新改一次。

测试:那多麻烦,而且我也不记得改过写什么了...

me:我只是做一个假设,其实你可以认为rebase就是再做这个事情


rebase

me:还有另一种方案,我进行一次新的提交,把远端和和自己改的合并到一起,像这样


merge

测试:所以这就是merge对吧

me:嗯,这就是merge做的事情。当然merge和rebase都是基于branch,或者准确的说是基于commit的,这里虽然说是同一个分支,但是远端和本地其实是有不同的版本的

测试:好的,那之前他们说的把commit合成一个是什么意思

rebase -i合成commit

me:还是之前的例子,你进行了两次commit(4和5),但是现在你发现其实这两次提交你在做同一个事情,只是花了比较长的时间,不得不分两次提交,那么现在你想把它搞成一次提交怎么办呢

me:如果是我,我就会把本地的全给删了,然后重新把所有的修改重新做一次,然后只commit一次

测试:哦!懂了,这就是rebase做的事情是吧

me:是的,你可以这么理解,但是rebase这个命令有点复杂,我们一般会使用--interactive指令来在rebase操作中对每个commit进行处理。每个commit我们都可以进行以下处理

  • pick:表示这次提交在rebase之后会被完整保留下来,包括注释
  • reword:表示这次提交在rebase之后会被保留下来,但不包括注释
  • squash:表示这次提交会被合并到前一次提交里面去
  • edit:我没用过,据说可以在同一个commit id下改代码,不看
  • fixup:没用过,据说和squash差不多,不看
  • exec:什么鬼,不看

测试:还有这么厉害的操作啊,我抽时间去看看

me:还有什么想知道的么

测试:嗯...对了,还有个reset,这个是什么意思

reset命令

me:reset命令用来回滚你当前分支的提交,你可以把它理解为rollback

测试:这个我知道,那我看他们用reset的时候喜欢后面跟一个--hard是什么意思

me:好问题!其实reset回滚有三种级别soft,mixed和hard,你应该还记得我之前提过的工作区、暂存区和本地仓库的概念。首先你要明确,reset命令是会回滚本地仓库的版本的,然后再来看这三个回滚级别有啥区别

  1. soft:听名字就知道这个回滚是很软的~,这种情况会回滚仓库中的版本,但是你修改过的文件会保留到工作区和暂存区,就是说你回滚了仓库代码,但是你打开编译器发现代码还是最新的,然后你commit一下它又和reset之前一样了
  2. hard:这是很强硬的回滚!这种情况会回滚你的分支版本、暂存区和工作区,就是说不管你本地的修改,还是被add到暂存区的东西,还是commit的东西,都没有了
  3. mixed:这个就是上面两个的折衷了,这种情况会回滚你的分支版本和暂存区,但是你修改过的文件还会保留到工作区,就是说你打开编译器发现代码还是最新的,然后通过add和commit操作又可以变会reset之前的样子

Tips

这些命令都没有这么简单

  这里讲到了add、commit、push、pull、merge、rebase、reset这些命令,我只是简单提了一下最常用的用法,但是这些命令本身是有点复杂的(毕竟官网一个命令就可以写好几页),有兴趣的可以去具体了解一下,反正我不看,太麻烦

工具是个好东西

  人,能制造工具并能熟练使用工具进行劳动的高等动物,这是新华字典说的,不是我说的。
  我觉得git命令还好,但是使用命令行来进行诸如diff、rebase之类的操作,实在有点反人类,工作中多用用工具还是很能提高效率的。比如JetBrains那一套里面集成的git工具,eclipse里面集成的git工具,tortoise git,source tree,这些都不错(我都用过,最喜欢JetBrains全家桶,虽然我用eclipse写代码)
  当然,学习的时候,用一用命令会让你对这些动作又更清晰的认知

你可能感兴趣的:(给测试小姐姐讲git命令)