给测试小姐姐讲git命令

2018-12-03  本文已影响0人  Vongola々骸

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

me:你不是会用git么

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

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

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

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

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

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

几个文件分布

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

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

各区域交互流程

测试:哦,我说怎么每次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我们都可以进行以下处理

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

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写代码)
  当然,学习的时候,用一用命令会让你对这些动作又更清晰的认知

上一篇 下一篇

猜你喜欢

热点阅读