参考:
git 的使用(4)-git暂缓区工作区原理和修改删除等命令
Git 菜鸟变大神 (三) 工作区、暂存区、版本库之间的关系案例
需求:
使用需要
在初始化git版本库之后会生成一个隐藏的文件 .git ,可以将该文件理解为git的版本库 repository,而我们自己建立的项目文件夹即工作区 working directory ,在.git 文件夹里面还有很多文件,其中有一个index 文件 就是暂存区也可以叫做 stage ,git还为我们自动生成了一个分支master以及指向该分支的指针head.
从图中可以看出来respository包括分支master和stage, working diretory 可以理解为我们打开开发环境如eclipse,里面的内容即工作区的内容,在工作区里面有的代码以及配置文件等我们需要提交到版本库里面,最终是到了分支master上面,暂存区只是一个临时保存修改文件的地方。
一、工作区、暂存区和版本库的关系及区别
1. 工作区
工作区(working Directory),就是我们项目的目录,也就是我们例子中的learngit 目录,这就是我们所说的工作区,比较简单。
2. 版本库
版本库(Repository) ,工作区有一个隐藏目录“.git”,如上图所示,这个目录不算工作区,而是Git的版本库。我们打开这个.git文件夹,里面有很多文件:
其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
3. 暂缓区
我们先来看一张图,用来区分工作区和暂缓区以及分支的概念:
- 上图中,工作区就是我们的本地目录,也就是learngit目录,stage就是暂缓区,master分支就是主分支。
- 我们先把这三个关系说一下,然后我们再具体的例子来说明:
前面讲了我们把文件往git版本库里添加的时候,是分两步执行的:
第一步是用“git add”把文件添加进去,实际上就是把文件修改添加到暂存区;
第二步是用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支。
因为我们创建git版本库时,git自动为我们创建了唯一一个master分支,所以,现在,commit就是往master分支上提交更改。
你可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
4.举个例子
见git 的使用(4)-git暂缓区工作区原理和修改删除等命令
5. git跟踪的是修改
上面很详细的说了暂存区的一些基本的东西,下面我们通过管理修改的例子,说学习一下为毛git这么快,比其他的版本工具来优秀,因为git跟踪并管理的是修改,并不是文件。
git 中如何定义修改呢:你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改。
SVN中是跟踪的是这个文件,只要这个文件发生变化,我们就认为是有diff的。但是GIT跟踪的是修改,一个修改只要没被add到缓存区,都不算diff。
二、撤销修改
1. 还在工作区
2. 已经add加到暂存区
三、删除文件
四、其它
-
撤销merge
$ git reset --hard HEAD
-
没有共同祖先的两个分支如何合并?合并后会有什么问题?
"git merge" used to allow merging two branches that have no common base by default, which led to a brand new history of an existing project created and then get pulled by an unsuspecting maintainer, which allowed an unnecessary parallel history merged into the existing project. The command has been taught not to allow this by default, with an escape hatch "--allow-unrelated-histories" option to be used in a rare event that merges histories of two projects that started their lives independently.
使用 git merge 合并两个没有共同祖先的分支,这导致了一个创建的现有项目的全新历史,然后被一个不知情的维护者拉出,这使得不必要的并行历史合并到现有项目中。 --allow-unrelated-histories 参数用于将两个独立的分支(即 没有共同祖先)合并
如果非得将两个没有共同祖先的分支合并,这样的后果是项目的全部文件都当作这次提交的内容,而实际上这次提交的内容应该就是几个不同的文件而已,也就是所有文件都会被认为有冲突。
-
merge远程分支。
A merge B是把A中的改动放到B分支上,B merge A是把B中的改动merge到A中,例如把master分支上的改动移到分支fb_xhf上,可以这样merge。
1、转到master分支上,然后更新master最新更新。
2、再转到fb_xhf上,然后在Local Branches中选择master分支,选择merge,这样就把本地的master merge到 本地仓库的fb_xhf上,然后再选择git push ,这样就把远程master merge到 fb_xhf上, 并会提示: Merged master to fb_xhf。