git阶段性小结


引言

使用git也有一段时间了,一直停留在基础使用阶段。 未做进一步研究。今天小伙伴发了一段命令给我,如下

git rebase -i origin/master

上面这段命令,发现自己看不懂。小小的梳理下git。

梳理git分布式关系

git和svn最大的区别在于,git是分布式的一张网,而svn是一棵树。 如下图所示(阮一峰博客摘抄) 图片

其中,远程也就是git服务器上本身的库叫远程库 然后咱们是git clone下来远程的库叫repository,其实就是master分支 基于master,建立新分支,叫本地分支,workspace. 具体关系看图所示即可。

git分支

http://www.ruanyifeng.com/blog/2012/07/git.html 阮一峰的网站对于分支的使用讲的已经较为成熟了,基础的就是分支的创建、合并、删除,这也是我们日常使用较多的。

那么rebase是个啥东东呢? rebase的使用背景也是用于分支合并,它和git merge之间的关系,实现的功能基本一致,但是细节上有所不同。

接下来具体讲讲二者的区别

应用场景

一般在开发过程中,都会建立自己的分支。有这样一种情景

我基于master新建了一个分支experiment,此时分支experiment和master均有提交。 如下图所示。 图片

此时我希望,master和experiment进行合并。有两种方式 1、git merge 2、git rebase

git merge

图片

大致思想是 将分支上在C2以后的所有的commit合并成一个commit后,再与master进行合并。 如果有合并冲突,首先是人工去除重复。接着在master上产生合并后的新commit。

git checkout master
git merge experiment

git rebase

图片

rebase的思想是: 将分支在c2以后的所有commit全部移动到master分支的最新commit之后,也就是c3移动到c4之后。

git checkout experiment
git rebase master
git checkout master
git merge experiment

rebase之后的commit log呈线性,更加清晰。此时如果experiment分支不再被需要,我们可以删除它。

git branch -d experiment

后续学习要点

经过小伙伴告知,使用git,有以下几个概念需要了解

  • DAG,有向无环图。git的历史就是一个有向无环图。
  • stage area:介于working copy和object store之间的区域。git add 将数据临时存放于stage area.git commit 将stage area的数据存储到object store
  • 基本概念。
    • commit tree blob
    • branch tag reflog
    • commit dag

强烈建议阅读以下文章

  1. http://git-scm.com/book/en/v2/Git-Branching-Rebasing
  2. http://gitbook.liuhui998.com/index.html
  3. http://git-scm.com/book/en/v2/
  4. http://wustrive2008.github.io/2016/01/06/%E7%89%88%E6%9C%AC%E6%8E%A7%E5%88%B6/Git%E5%85%A8%E8%A7%A3%E6%9E%90%E4%B9%8B%E5%85%88%E7%94%A8%E8%B5%B7%E6%9D%A5/
  5. http://blog.jobbole.com/50603/