目录
版本控制(Version Control)
作用是追踪文件的变化。为什么需要版本控制?简单说,就是当你出错了,可以很容易地回到没出错时的状态。
在不破坏源文件的基础上,得到一个类似的新文件。文件的多版本保存是一个常见问题,通常的解决办法是这样的:
做一个文件备份(比如Document.old.txt)。
在文件名中加入版本号或日期(比如Document_V1.txt,DocumentMarch2007.txt)。
在多人编辑的环境下,共享一个文件目录,并且要求每个人编辑完以后,在文件上做出标识。
通过文件名识别版本,对于小型项目或者单个文件也许可行。但是对于软件开发来说,是不适用的。大型的、频繁修改的、多人编写的软件项目,需要一个版本控制系统(简称VCS,行话叫做"文件数据库"),追踪文件的变化,避免出现混乱。
VCS应该做到以下几点功能:
- 备份(Backup)和恢复(Restore)。文件的每一次编辑都得到保存,可以恢复到任意一个日期。需要2007年2月23日的版本?没问题。
- 同步(Synchronization)。让不同用户随时都能得到文件的最新版本。
- 短期撤销(Short-term undo)。文件被你搞乱了,怎么办?那就撤销编辑,回到最近一次的无差错版本。
- 长期撤销(Long-term undo)。有时候,你会过了很久才发现出错了。如果你想撤销一年前的一次编辑,怎么办?那就去取回一年之前的那个版本。
- 追踪修改(Track Changes)。文件的每一次编辑,你都可以写下注解,解释编辑的原因。(这些信息储存在VCS中,而不是文件中。)这样就很容易看出,长期中文件变化的脉络和原因。
- 追踪权限(Track Ownership)。VCS会记录每一次提交新版本的用户名。这样就容易追踪责任。
- 试验功能(Sandboxing)。当你对文件做出重大变更时,你可以把编辑内容暂时性地保存在一个单独的区域,不断进行测试和除错。等到确认正确以后,再加入主版本。
- 分支(Branching)和合并(merging)。分支功能可以看成是一个更大的测试版本。你将整个的代码做一份拷贝,然后再起一个独立的名字,追踪其变化,与原版本脱离关系,这就是分支。以后,你还可以将分支版本再并入源版本,这就是合并。
上有许多VCS软件可供选择,并且都有详细的教程或手册,比如SVN、CVS、RCS、Git、Perforce等等
GIT
GIT工作流
http://www.ruanyifeng.com/blog/2015/12/git-workflow.html
1. 集中式工作流
和svn一样,服务器只有一个仓库, 所以人都往这里提交,要特别注意公共文件的提交冲突
2. 功能分支工作流
为各个新功能分配一个专门的分支来开发,开发完成再合并
3. GitFlow 工作流
为不同的分支分配一个很明确的角色, 明确定义分支之间如何和什么时候进行交互, 将开发、发布、部署、bug修复分隔开来。
两个永久分支(master, develop),所有的开发工作都围绕这两个分支进行派生跟合并
短期分支(hotfix , frature , release ) ,完成后一般都要进行删除
- master 分支:正式发布的版本
- develop 功能集成分支:派生于master
- hotfix 维护/热修复分支:派生于master,专门处理bug的分支,修复完成应该马上合并于master、develop
- frature 功能分支:派生于develop,每个功能新开一个功能分支,开发完成后合并于develop
- release 发布准备分支:派生于develop,专门用于改善发布的功能分支。清理发布、执行所有测试、更新文档和其它为下个发布做准备操作的地方。完成应该马上合并于master、develop
4. Forking 工作流
分布式工作流, 而让各个开发者都有一个服务端仓库。网友贡献的代码可以被集成在项目维护者的正式仓库
5. Pull Requests
消息通知+论坛,在提议的修改合并到正式项目之前对修改进行讨论。
分支工作流使用场景:
第一次拉取代码
- clone(克隆) master分支到本地, 本地只有一份代码
开发一个功能并提交到远程仓库
- branch(分支)创建一个frature分支, checkout(检出)到这个分支(本地代码变成这个分支的), 开发...
- 开发完成后 add(添加) 到暂存区, commit(提交)到本地仓库
- merge(合并) frature到develop
- push(推送) 本地develop到远程develop
拉取远程仓库其他人提交的代码到本地分支
- checkout(检出) 到本地对应的分支, pull(拉取) 远程仓库的分支
常见场景操作:
将代码从一个分支转移到另一个分支
1. A分支的全部提交 合并 到B分支:git merge
2. A分支的单个提交 合并 到B分支:git cherry-pick
http://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html
回滚与重置区别
回滚
回滚1, 后续的234依旧存在
重置
重置1, 后续的234全部重置
修改最近一次提交的备注信息
git commit --amend
详细日志查看
1. git log 查看提交历史记录
2. git log --oneline 或者 git log --pretty=oneline 以精简模式显示
3. git log --graph 以图形模式显示
4. git log --stat 显示文件更改列表
5. git log --author= 'name' 显示某个作者的日志
6. git log -p filepath 查看某个文件的详细修改
7. git log -L start,end:filepath 查看某个文件某几行范围内的修改记录
8. git log --stat commitId 或者 git show --stat commitId 查看某一次提交的文件修改列表
冲突解决
<<<<<<< .mine
这里的是你本地的内容
=======
而这里的是资源库中的内容,这是更新之时自动合并产生的结果;
>>>>>>>.r3541
工具SourceTree
https://jingyan.baidu.com/article/dca1fa6f19c0abf1a5405246.html
http://www.ruanyifeng.com/blog/2008/12/a_visual_guide_to_version_control.html