分支是数据库修改内容的分叉保存,即可以对一个项目同时分叉进行多个线路的修改,它们之间相互不会影响,并且可以合并。
不同用户可以设立自己的分支独立工作,在需要的时候进行总体的合并,每一个分支的修改记录也会被保存,对日后的纠错查因带来了很大的方便。
“Merge”分支: 作为一个随时可以发布release的分支,故要保证其稳定性,在对项目进行修改,添加新功能等时,一般先创建以Merge分支为源分支的Topic分支。
通常,我们直接用master作为Merge分支。
“Topic”分支: 为了添加功能,修复bug而建立的分支,从稳定的Merge分支创建,任务完成后再合并至Merge分支。
如果要同时进行多项任务,就创建多个Topic分支。
checkout会使工作树的状态还原至目标分支的修改内容,切换分支后的提交将会追加在目标分支。
HEAD指向现在使用分支的最后一次更新,默认指向master的最后一次更新。通过移动HEAD指向,就可以达到对不同分支进行操作。
~(Tilde):可以指定HEAD之前的提交记录
^(caret):HEAD之前的提交记录存在合并,则会有分支出现,而使用caret可以指定哪一个节点状态作为根节点。
stash是临时保存文件修改内容的区域。
在未提交当前工作树或索引中的修改内容时进行checkout操作,会使修改内容从原来的分支移动至切换后的分支;
但切换后的分支中有相同的文件内容也被修改时,checkout操作会失败。
这时要么先提交修改内容再切换,要么可以将修改内容暂存在stash中,之后再取出并选择应用在哪一条分支上。
merge可以合并多个历史记录的流程。
**fast-forward(快进)合并:**当topic分支(使用bugfix分支为例)合并至master分支时,master分支并没有进行修改,则可以使master的HEAD直接指向bugfix,这就是快进合并。
但大多情况下,bugfix合并时,master分支已经做了修改,此时合并需要让master和bugfix修改进行一次新的提交,HEAD指向此提交。
non fast-forward:此选项会让可以进行fast-forward合并的情况下仍进行一次新提交并合并。
优点:分支会维持原状,便于查找历史操作记录。
rebase bugfix分支和master分支会让bugfix的历史记录添加到master分支后面,这时移动提交X,Y有可能会发生冲突,故需要修改冲突部分。
然后直接让master分支的HEAD指向bugfix分支的HEAD即可。
对于历史记录合并:
merge为保持所有的历史记录修改过程,这样的话,修改记录就会很复杂。
rebase合并的历史记录简单,实在原有历史记录的前提上把差异反映进去,这也导致可能合并后的原本提交内容无法正常运行。
master分支: 只负责管理发布版本的状态。提交时使用标签记录版本号。
develop分支: 针对发布的日常开发使用的分支。
feature分支: 作用相当于topic分支,以develop分支作为源分支创建的分支,进行bug修复,新功能添加,任务完成后直接合并至develop分支发布新的版本。
ps:feature分支一般不需要共享特性分支的操作,故不需要远端控制。
release分支: 通常会在分支名称前加上release-。在develop分支上进行开发,到了可以release的时候,创建此分支,进行最后的bug修正等修改。修改完成后合并至master分支,并在合并提交时添加release的版本号。
完成之后也要把release分支的修改合并至develop分支继续进行开发。
hotfix分支: 用于产品进行紧急修正时,通常在分支名称前加上hotfix-。
从master分支直接创建。
在develop分支开发尚不完整时,需要紧急修改,从develop分支开发至可以release的版本耗费时间太久,我们就从master分支上直接创建一个hotfix分支进行修改并合并分支。
完成之后也要把hotfix分支的修改合并至develop分支继续进行开发。
过程为:首先确认本地的数据库是否更改,
若没有更改:
则本地的数据库master分支对远程数据库的master分支进行fast-forward合并并提交。
若有更改:
则需要合并双方的修改,pull使双方合并,若没有冲突,则直接合并提交;若有冲突,则需要手动解决冲突,再手动提交。
当不想自动合并只想取得远程数据库的内容时,使用fetch可以取得最新的历史记录并导入到没有名字的分支中,该分支可以从名为FETCH_HEAD的链接中退出。
这个状态下,如果需要合并,则可以合并FETCH_HEAD,或重新执行pull指令。
ps:FETCH_HEAD指向从远程数据库获取的历史记录中的末端最新版本。
push至远程数据库,要fast-forward合并push的分支。
如果发生冲突,push就会被拒绝。
ps:基本上,远程数据库的提交时不能修改的。
标签是为了更简洁明了地参考提交而设置地一个名称。
Git可使用的有两种标签,分别是轻标签和注解标签。
标签是固定的,不可移动。
轻标签为
- 添加名称
注解标签为
- 添加名称
- 添加注解
- 添加签名
一般来说,轻标签用于本地暂时或一次性使用,版本发布标签用注解标签添加注解或签名。