Git原理及特性
每个项目都有一个git
目录,它是Git
用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作目录。这些文件 实际上都是从git
目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对 这些文件进行编辑。
所谓的暂存区域只不过是个简单的文件,一般都放在 git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区域。
Git相比于其他版本管理工具的优点
- 直接快照,而非比较差异
- 近乎所有操作都可本地执行
- 时刻保持数据完整性
- 多数操作仅添加数据
- 三种状态:已提交(
committed
),已修改(modified
)和已暂存(staged
)
基本的 Git 工作流程如下所示:
- 在工作目录中修改某些文件。
- 对这些修改了的文件作快照,并保存到暂存区域。
- 提交更新,将保存在暂存区域的文件快照转储到 git 目录中。
git add
命令
这是个多功能命令,根据目标文件的状态不同,此命令的效果也不同:
- 可以用它开始跟踪新文件,
- 或者把已跟踪的文件放到暂存区,
- 还能用于合并时把有冲突的文件标记为已解决状态等
从远程仓库抓取数据
git fetch
,fetch
命令只是将远端的数据拉到本地仓库,并不自动合并到当前工作分支,只有当你确实准备好了,才能手工合并。git pull
,从原始克隆的远端仓库中抓取数据后,自动合并到工作目录中当前分支。
分支的合并
把一个分支整合到另一个分支的办法有两种:merge
(合并) 和 rebase
(衍合)。
我们假设开发进程分叉到两个不同分支,又各自提交了更新。
merge
合并
使用merge
命令,它会把两个分支最新的快照(C3
和C4
)以及二者最新的共同祖先(C2
)进行三方合并。
rebase
衍合(有人叫变基)
你可以把在C3
里产生的变化补丁重新在C4
的基础上打一遍。
它的原理是回到两个分支(你所在的分支和你想要衍合进去的分支)的共同祖先,提取你所在分支每次提交时产生的差异,把这些差异分别保存到临时文件里,然后从当前 分支转换到你需要衍合入的分支,依序施用每一个差异补丁文件。
现在,你可以回到master
分支然后进行一次快进合并。
使用衍合时需要注意:
永远不要衍合那些已经推送到公共仓库的更新
一个标准的Git工作流
master
是长期分支,一般用于管理对外发布版本,每个commit
对一个tag
,也就是一个发布版本。develop
是长期分支,一般用于作为日常开发汇总,即开发版的代码。feature
是短期分支,一般用于一个新功能的开发。hotfix
是短期分支 ,一般用于正式发布以后,出现bug
,需要创建一个分支,进行bug
修补。release
是短期分支,一般用于发布正式版本之前(即合并到master
分支之前),需要有的预发布的版本进行测试。release
分支在经历测试之后,测试确认验收,将会被合并的develop
和master
。
Git使用经验
问题:当你在开发时,发现主分支有了新的提交,该怎么办?
建议:使用衍合,把主分支的更新衍合到你的本地分支!