TortoiseGit、Git在项目中的应用
TortoiseGit、Git在项目中的应用
Git是目前世界上最先进的分布式版本控制系统。源码版本管理工具有很多,常见的有:CVS、SVN、GIT、Mercurial等。
版本管理工具各有优缺点,实际项目中具体选择哪种也是根据实际情况而定。
本文主要介绍TortoiseGit在项目中的应用。TortoiseGit是一个开放的,对git封装起来的程序,用来简化git操作,不仅可以实现git仓库管理,还可以通过它实现权限控制。TortoiseGit支持windows。
其它涉及到的知识,需要另外了解。
本文使用注解
本文并没有贴TortoiseGit的操作图,原因如下:
- 希望大家花一点时间思考并理解git开发流程图和git开发的一般步骤原理,方便以后遇到问题,能够根据原理找到解决思路。实际使用或练习过程中跟着使用TortoiseGit的一般步骤进行,是没有问题的。
- 贴TortoiseGit的操作图会让本文变得特别长,这也是我不想看到的。我认为不贴图能加深大家的理解,更容易锻炼各位的耐心。
- 本文最后列出了本文的参考链接,有兴趣的可以追溯下原文,加深理解。
Git的基本概念与及原理(可跳过,需要的的时候再了解)
- git是一个分布式版本控制系统,不同一般的是它是分布式的,不仅有一个中心的服务器控制最新版本代码 ,而且每个开发者自己还有个本地仓库。
- 在开发过程中都是先将代码提交到本地仓库再推送到中心服务器上,这样的好处就是每个人都依赖于中心服务器来实现交互,但又不会被中心服务器限制,就算中心服务器挂后,也能很容易的找到最新版本的代码。
-
自己的git仓库 拥有自己的git仓库的方式有两种:
- 在自己已有的目录里初始化自己的git仓库,然后和中心服务器建立连接,更新最新代码到自己的git仓库。
- 将一个已经存在的项目克隆岛自己的目录成为自己的git仓库。
- 在git仓库里有一个.git的隐藏文件夹,你的一切行为都是在这个目录里,这个.git文件夹就是你的本地仓库。
- config:项目的配置文件,里面有中心服务器的信息和分支信息。
- HEAD:文件指向当前的分支。
- index:文件是暂存区的相关信息。
- logs:目录中都是相关操作产生的日志,这个很重要,因为日后是我们操作的唯一证据,我们本地的版本控制也靠它。
- objects:目录里面存储的就是所有的数据,也就是快照。
- refs:目录里是存储指向数据提交对象的指针。
- git的分层结构:git工作层总共分四层,其中三层是在自己本地的git仓库,即.git目录里,包括了工作目录,暂存区和本地仓库。另外一个是远程仓库。
- 工作目录:很好理解,就是我们执行一切文件操作的地方。
- 暂存区和本地仓库都在.git目录,因为他们只是用来存数据的。
- 远程仓库在中心服务器,我们可以将本地仓库推送到远程仓库,或者从远程仓库拉取数据到本地仓库。
- 文件快照:git存储一系列的文件快照,git跟踪这些快照,发现哪个快照有变化就会提示你需要添加到暂存区还是提交到本地仓库来保证你的工作目录是干净的。
- git文件中有两种状态,一种是被跟踪的,一种是未被跟踪的。当我们添加新文件时,是不被跟踪的,但如果对仓库已经存在的文件进行修改,那这个文件就是被跟踪的文件。
- 当我们在工作目录中进行文件操作后,要先添加到暂存区,然后再将暂存区中刚添加的文件快照提交到本地仓库,然后再将本地仓库的最新版本文件快照推动到远程仓库。
- 每个步骤的设计都有其具体的意义,有兴趣的可以私下研究。
SVN与GIT简单对比
使用GIT开发的过程
使用git开发流程图
使用git开发一般步骤
- 从服务器上克隆完整的GIT仓库到
自己开发机
。 - 在
自己开发机
根据不同的开发目的,创建分支,修改代码。 - 在
自己开发机
自己创建的分支上提交代码。 - 在
自己开发机
上合并分支。 - 把服务器上最新版的代码fetch下来,然后跟
自己开发机
的主分支合并。 - 生成补丁(patch),把补丁发送给主开发者。
- 看主开发者的反馈,如果主开发者发现两个一般开发者之间有冲突(他们之间可以合作解决的冲突),就会要求他们先解决冲突,然后再由其中一人提交。如果主开发者可以自己解决,或者没有冲突,就通过。
- 一般开发者之间解决冲突的方法:开发者之间可以使用pull命令解决冲突,解决完冲突之后再向主开发者提交补丁。
- 从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
- 查看邮件或者通过其他方式查看一般开发者的提交状态。
- 打上补丁,解决冲突(可以自己解决,也可以要求开发者之间解决以后再重新提交,如果是开源项目,还要决定哪些补丁有用,哪些不用)。
- 向公共服务器提交结果,然后通知所有开发人员。
- 从主开发者的角度(假设主开发者不用开发代码)看,git有以下功能:
使用TortoiseGit的一般步骤
- TortoiseGit右键clone,填写URL,选择本地存放目录,如果其它的均不填写,则默认拉取远端master版本。这时能看到有一个本地master分支及远程的所有分支。
- 通过TortoiseGit–>Create Brance…创建自己的分支,建议用此种格式:gou.dan-devel,创建分支时,可以 选择基于哪个分支版本,即Base On(一般不建议选择其他分支,默认即可),然后点OK,这时候我们在本地得 到了一个新的分支,假设名为gou.dan-devel,可以通过TortoiseGit–>Switch/Checkout切换到gou.dan-devel分支上。
- 如果想在远端创建一个相对应gou.dan-devel的新分支:可以通过TortoiseGit–>push,将Local选择为gou.dan-devel,(Base On如果选择了其他分支时,需将Remote清空,否则Remote默认就是空的),点OK 即可;如果不想在远端创建新的分支,而是提交到别人的分支, 则Remote选择别人的分支,点OK即可。
- 在自己分支上开发,内部测试,在自己分支上提交。TortoiseGit–>Commint–>gou.dan-devel。
- 提交合并请求之前,先把合并请求分支的内容pull到自己的分支上,如果存在冲突,解决冲突,如果没问题, 直接TortoiseGit–>commit,push到自己的分支。然后再通知主分支人员请求合并(可通过gitlab网页通知或其他方式)。
- 内部开发容易。如果是外部开发,比如github等,则对开发者的能力要求较高,起码要求是可以解决冲突问题等。
- git的分支与主分支,只是名称上的区别,其他没区别,不管是主分支合并到分支,还是分支合并主分支都是一样的。
- 合并如果有冲突时:
- 处理方式一:
- 合并主分支到自己的分支失败后,可通过TortoiseGit–>Diff查看冲突文件,通过TortoiseGit提供的差别器解决冲突。
- 解决后TortoiseGit会有一些弹框确认提示等。
- 内部测试通过后,再TortoiseGit–>Commit,push到自己的分支上,然后向主分支人员发送合并请求。
- 处理方式二:
- 合并主分支到自己的分支失败后,可先通过TortoiseGit–>Abort Merge中止合并,还原内容。
- 通过TortoiseGit–>Show log,勾选All Branches可以看到所有分支的情况,在Log Messages中,绿色的是分支,红色的是当前工作分支。
- 通过按Shift和鼠标左键,可以选择两个版本,接着按鼠标右键,选中Compare revisions,比较版本差异。
- 解决冲突,内部测试通过后,再TortoiseGit–>Commit,push到自己的分支上,然后向主分支人员发送合并请求。
- 处理方式三:
- 合并主分支到自己的分支失败后,可先通过TortoiseGit–>Abort Merge中止合并,还原内容。
- 拷贝主分支内容到单独文件夹,通过自己熟悉的对比软件解决冲突。
- 解决冲突,内部测试通过后,再TortoiseGit–>Commit,push到自己的分支上,然后向主分支人员发送合并请求。
- 处理方式四:
- 有时候我们需要通过与主分支的开发人员沟通,双发协助解决问题。
- 有时候我们需要综合各种处理方式解决问题。
- 但最终的目的都是解决实际问题。
- 处理方式一:
- 一般情况下,主分支合并其它分支后,会删除掉其它分支,以保证统一,方便管理。
- 可以通过TortoiseGit删除本地及远端分支等。
小结
遇到问题,可以一起沟通,共同进步。
TortoiseGit 的安装与使用可参见
http://blog.****.net/renfufei/article/details/41647937
本文部分参考链接,借此感谢先行的前辈们
http://blog.51yip.com/server/1737.html
http://blog.****.net/xiaoputao0903/article/details/23912561
https://baike.baidu.com/item/GIT/12647237?fr=aladdin
如有不妥之处,欢迎批评指正,感谢平台的贡献,本人原文链接如下: