版本管理工具
版本控制软件提供完备的版本管理功能,用于存储、追踪目录(文件夹)和文件的修改历史,是软件开发者的必备工具,是软件公司的基础设施。版本控制软件的最高目标,是支持软件公司的配置管理活动,追踪多个版本的开发和维护活动,及时发布软件。
常用版本管理工具
一、VSS
VSS 的全称为 Visual Source Safe 。作为 Microsoft Visual Studio 的一名成员,它主要任务就是负责项目文件的管理,几乎可以适用任何软件项目。
Windows平台下使用VSS开发的典型环境是基于C/S架构的,即开发小组的每个开发者在各自的Windows平台下利用开发工具(比如VC)开发项目中的各个模块,而配有专门的服务器集中控制开发过程中的文档和代码。服务器和开发人员的客户机分别装有VSS的服务器和客户端程序。
VSS是微软的产品,是配置管理的一种很好的入门级的工具。VSS最初的名字叫Source Safe,是一家小公司的产品,92年曾经获了最佳小型管理工具奖,然后立即被微软收购。但是微软收购的只是source safe的Windows版本,在美国还有另外两家公司分别获得了继续开发和销售source safe的Mac版本和Unix版本的许可,在MS买进vss之后,基本上没有对vss进行任何的研发,MS内部自身也不用vss。
VSS 没有采用对许可证进行收费的方式,只要安装了 VSS ,对用户的数目是没有限制的。因此使用 VSS 的费用是较低的。它属于“买大件送小件”的角色。如果你合法地得到Visual Studio,你就得到了免费的SourceSafe。
注:VSS只有Windows环境。
二、CVS
CVS是一个C/S系统,多个开发人员通过一个中心版本控制系统来记录文件版本,从而达到保证文件同步的目的。CVS版本控制系统是一种GNU软件包,主要用于在多人开发环境下的源码的维护。
2009年,绝大多数CVS服务已经改用SVN。CVS已经停止维护。
三、SVN
SVN是一个安全虚拟网络系统,它将系统整体的信息安全功能均衡合理地分布在不同的子系统中,使各子系统的功能得到最大限度的发挥,子系统之间互相补充,系统整体性能大于各子系统功能之和,用均衡互补的原则解决了"木桶原理"的问题。
SVN能在跨接Internet, Intranet, Extranet间的网络所有端点实现全面的安全,而且还能提供基于企业策略的信息管理机制以充分有效地利用有限的带宽。SVN可以满足各种企业VPN的要求,通过为公司内部网络、远程和移动用户、分支机构和合作伙伴提供基于Internet的安全连接。所以,我们可以将SVN看成是VPN、防火墙、基于企业策略的信息管理软件集成在一起的Internet安全的综合解决方案。在这样一个网络系统中,所有互联网服务器端和客户端都是安全的,并有一个信息管理机制以不断地通过这个外部网络环境动态地分析及满足客户的特定带宽需求。
注:SVN客户端有Windows环境和linux环境。
四、GIT
Git --- The stupid content tracker, 傻瓜内容跟踪器。Linux 是这样给我们介绍 Git 的。
Git 是用于 Linux 内核开发的版本控制工具。与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持(wingeddevil注:这得分是用什么样的服务端,使用http协议或者git协议等不太一样。并且在push和pull的时候和服务器端还是有交互的。),使源代码的发布和交流极其方便。 Git 的速度很快,这对于诸如 Linux kernel 这样的大项目来说自然很重要。 Git 最为出色的是它的合并跟踪(merge tracing)能力。
Git 与 SVN
GIT不仅仅是个版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。如果你是一个具有使用SVN背景的人,你需要做一定的思想转换,来适应GIT提供的一些概念和特征。所以,这篇文章的主要目的就是通过介绍GIT能做什么、它和SVN在深层次上究竟有什么不同来帮助你认识它。
1.GIT是分布式的,SVN不是:
这是GIT和其它非分布式的版本控制系统,例如SVN,CVS等,最核心的区别。如果你能理解这个概念,那么你就已经上手一半了。需要做一点声明,GIT并不是目前第一个或唯一的分布式版本控制系统。还有一些系统,例如Bitkeeper, Mercurial等,也是运行在分布式模式上的。但GIT在这方面做的更好,而且有更多强大的功能特征。
GIT跟SVN一样有自己的集中式版本库或服务器。但,GIT更倾向于被使用于分布式模式,也就是每个开发人员从中心版本库/服务器上chect out代码后会在自己的机器上克隆一个自己的版本库。可以这样说,如果你被困在一个不能连接网络的地方时,就像在飞机上,地下室,电梯里等,你仍然能够提 交文件,查看历史版本记录,创建项目分支,等。对一些人来说,这好像没多大用处,但当你突然遇到没有网络的环境时,这个将解决你的大麻烦。
同样,这种分布式的操作模式对于开源软件社区的开发来说也是个巨大的恩赐,你不必再像以前那样做出补丁包,通过email方式发送出去,你只需要创建一个分支,向项目团队发送一个推请求。这能让你的代码保持最新,而且不会在传输过程中丢失。GitHub.com就是一个这样的优秀案例。
有些谣言传出来说subversion将来的版本也会基于分布式模式。但至少目前还看不出来。
2.GIT把内容按元数据方式存储,而SVN是按文件:
所有的资源控制系统都是把文件的元信息隐藏在一个类似.svn,.cvs等的文件夹里。如果你把.git目录的 体积大小跟.svn比较,你会发现它们差距很大。因为,.git目录是处于你的机器上的一个克隆版的版本库,它拥有中心版本库上所有的东西,例如标签,分 支,版本记录等。
3.GIT分支和SVN的分支不同:
分支在SVN中一点不特别,就是版本库中的另外的一个目录。如果你想知道是否合并了一个分支,你需要手工运行像这样的命令svn propget svn:mergeinfo,来确认代码是否被合并。感谢Ben同学指出这个特征。所以,经常会发生有些分支被遗漏的情况。
然而,处理GIT的分支却是相当的简单和有趣。你可以从同一个工作目录下快速的在几个分支间切换。你很容易发现未被合并的分支,你能简单而快捷的合并这些文件。
4.GIT没有一个全局的版本号,而SVN有:
目前为止这是跟SVN相比GIT缺少的最大的一个特征。你也知道,SVN的版本号实际是任何一个相应时间的源代 码快照。我认为它是从CVS进化到SVN的最大的一个突破。因为GIT和SVN从概念上就不同,我不知道GIT里是什么特征与之对应。如果你有任何的线 索,请在评论里奉献出来与大家共享。
5.GIT的内容完整性要优于SVN:
GIT的内容存储使用的是SHA-1哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。这里有一个很好的关于GIT内容完整性的讨论 –http://stackoverflow.com/questions/964331/git-file-integrity
SVN和Git对比梳理 - 散尽浮华 - 博客园 https://www.cnblogs.com/kevingrace/p/5904595.html
git图形化工具
独立客户端工具
- GitHub for Desktop
- Source Tree
- TortoiseGit
IDE集成的Git客户端
- Xcode
- Eclipse – Egit
- Visual Studio – Git Integration & GitHub Extension
- Visual Studio Code
独立客户端工具
GitHub for Desktop
Source Tree
SourceTree是老牌的Git GUI管理工具了,也号称是最好用的Git GUI工具。我的体验是确实强大,功能丰富,基本操作和高级操作都设计得非常流畅,适合初学者上手。
这个工具很有特色的一个功能就是支持Git Flow,你可以一键创建Git Flow的工作流。Git Flow是非常高效的团队协作模型和流程,Git的一大特色就是灵活轻量的分支,但如何在自己的团队中用好这个功能来匹配自己的研发流程是个问题。内置Git Flow让那些不太熟悉的开发人员也可以很快上手,并且将研发的业务流程固化在工具中,可以说是非常贴心的设计。
在 Windows 环境下,SourceTree是多语言的,但是不知道为什么我的Mac版总是显示英文。
– 免费
– 功能强大:无论你是新手还是重度用户,SourceTree 都会让你觉得很顺手。对于非常重度用户,Source Tree还支持自定义脚本的执行。
– 同时支持 Windows 和 Mac 操作系统
– 同时支持 Git 和 Mercurial 两种 VCS
– 内置GitHub, BitBucket 和 Stash 的支持:直接绑定帐号即可操作远程repo
TortoiseGit
对这只小乌龟估计没有开发人员会不认识,SVN的超广泛使用也使得这个超好用的Svn客户端成了几乎每个开发人员的桌面必备软件。小乌龟只提供Windows版本,提供中文版支持的,对于中国的开发者来说者绝对是福音。
小乌龟的文件管理器右键菜单的操作方式对于新手来说非常的容易上手,而且容易理解。
– 免费
– 只支持Windows操作系统:与文件管理器的良好集成
– 中文界面
– 与TortoiseSVN一脉相承的操作体验
IDE集成的Git客户端
对于使用IDE进行开发的程序员来说,可以不离开常用的IDE就直接操作源代码管理系统是最好的选择,以下是我对几个常见的IDE集成的git客户端的一点体验。
Xcode
苹果的移动端应用体验没得说,但是桌面软件的体验就只能呵呵了。对于XCode里面的Git客户端来说,我只能说:够用!
这个history的列表也是够简单的了。
Eclipse – Egit
作为Java集成开发环境的代表,Eclipse内置了egit这个插件来提供git的集成支持。实话实说,这个插件的功能非常丰富,无论是普通的clone, commit, pull/push操作;还是复杂一些的git flow都有支持。除了颜值差点,其它都还好。
Visual Studio – Git Integration & GitHub Extension
Visual Studio 作为全宇宙最强IDE的名声已经在外,自从2013版本以来一直在针对Git的支持进行改进。如果配合社区版使用的话,也是完全免费的。对于使用Windows作为开发环境的程序员来说,VS里面的Git支持已经相当的完善。
直接克隆github上的repo
分支和历史记录视图
CodeLens 集成,可以直接在方法级别上查看git历史
Visual Studio Code
严格来说,Vscode不能算是IDE,只能算上代码编辑器而已,但是随着vscode上面插件的增加以及对于debugging的良好支持,vscode已经狠接近IDE的使用体验了。另外,vscode可以支持Windows, Mac和Linux操作系统,所以对于不同环境的开发人员来说都非常实用。
总的来说,我最喜欢的是Source Tree 和 VS里面的Git支持,主要原因还是用的多,顺手。其实工具的选择更多的是个人喜好,再难用的工具,只要基本功能满足,天天用,用惯了也不会愿意更换其他的工具。以上的只是一点个人体验,希望对于刚入行的新程序员或者开始接触git的朋友们能够有些帮助。
Git命令
一、 Git 命令初识
在正式介绍Git命令之前,先介绍一下Git 的基本命令和操作,对Git命令有一个总体的认识
示例:从Git 版本库的初始化,通常有两种方式:
1)git clone:这是一种较为简单的初始化方式,当你已经有一个远程的Git版本库,只需要在本地克隆一份
例如:git clone git://github.com/someone/some_project.git some_project
上面的命令就是将'git://github.com/someone/some_project.git'这个URL地址的远程版本库,完全克隆到本地some_project目录下
2)git init 和 git remote:这种方式稍微复杂一些,当你本地创建了一个工作目录,你可以进入这个目录,使用'git init'命令进行初始化;Git以后就会对该目录下的文件进行版本控制,这时候如果你需要将它放到远程服务器上,可以在远程服务器上创建一个目录,并把可访问的URL记录下来,此时你就可以利用'git remote add'命令来增加一个远程服务器端,
例如:git remote add origin git://github.com/someone/another_project.git
上面的命令就会增加URL地址为'git: //github.com/someone/another_project.git',名称为origin的远程服务器,以后提交代码的时候只需要使用 origin别名即可
二、 Git 常用命令
- 远程仓库相关命令
检出仓库: git remote -v
添加远程仓库: git remote rm [name]
修改远程仓库: git pull [remoteName] [localBranchName]
推送远程仓库:git push origin test:master // 提交本地test分支作为远程的master分支
$git push origin test:test // 提交本地test分支作为远程的test分支
2)分支(branch)操作相关命令
查看本地分支: git branch -r
创建本地分支: git checkout [name]
创建新分支并立即切换到新分支: git branch -d [name] ---- -d选项只能删除已经参与了合并的分支,对于未有合并的分支是无法删除的。如果想强制删除一个分支,可以使用-D选项
合并分支: git push origin [name]
删除远程分支: gitpush origin :[name]
*创建空的分支:(执行命令之前记得先提交你当前分支的修改,否则会被强制删干净没得后悔)
rm .git/index
$git clean -fdx
3)版本(tag)操作相关命令
查看版本: git tag [name]
删除版本: git tag -r
创建远程版本(本地版本push到远程): git push origin :refs/tags/[name]
合并远程仓库的tag到本地: git push origin --tags
创建带注释的tag:$ git tag -a [name] -m 'yourMessage'
- 子模块(submodule)相关操作命令
添加子模块:git submodule add git://github.com/soberh/ui-libs.git src/main/webapp/ui-libs
初始化子模块: git submodule update ----每次更新或切换分支后都需要运行一下
删除子模块:(分4步走哦) - $ git rm --cached [path]
- 编辑“.gitmodules”文件,将子模块的相关配置节点删除掉
- 编辑“ .git/config”文件,将子模块的相关配置节点删除掉
- 手动删除子模块残留的目录
5)忽略一些文件、文件夹不提交
在仓库根目录下创建名称为“.gitignore”的文件,写入不需要的文件夹名或文件,每个元素占一行即可,如
target
bin
*.db
Git详解
Trunk、Branches、Tags 区别:
Trunk:软件开发过程中的主线,开发时版本存放的目录,即在开发阶段的代码都提交到该目录上,保存了从版本库建立到当前的信息。
Branches:软件开发过程中的分支,发布版本存放的目录,即项目上线时发布的稳定版本存放在该目录中,保存了从版本库的某一特定点(不一定是版本库建立时)到当前的信息。
tags:表示标签存放的目录,tags只可读,不可写
分支主要用于在不影响Trunk其它用户情况下进行一些关于新功能的探索性或实验性的开发,待新功能完善后它也可以合并到Trunk中。
Git 命令
本地仓库相关命令
添加文件
git status
git add
git commit
修改文件
查看修改差异
删除文件
删除本地文件
删除仓库文件
还原文件
git远程仓库命令
git clone
git push github master #指定远程仓库别名、要同步的本地分支,会将指定的本地分支同步到远程仓库
git push master #如果当前仓库只与一个远程仓库关联,则可缺省远程仓库
git push -u github master #如果当前仓库与多个远程仓库关联,可以用-u指定一个默认的远程仓库,后续push未指定远程仓库时,默认push至默认的远程仓库
git remote add github git@github.com:chenhongyong/HIS.git #给远程仓库起一个别名,常用的别名比如origin、github
git remote #只列出远程仓库别名
git remote -v #列出远程仓库的详细信息,包括远程仓库地址
git remote set-url origin
git remote github #只是移除与本地仓库、远程仓库的关联关系,不再关联该远程仓库,并不是说物理删除远程仓库
Git——向GitHub提交代码 - 简书 https://www.jianshu.com/p/ad59186b6381
有时候我们明明在github上添加了ssh key,但是在push代码的时候还会要求我们输入用户名密码,这是为什么了?
其中一种可能的原因是,你在克隆代码的时候,使用了https协议,而不是git协议。https协议要求你每次都需要输入用户名以及密码,自由git协议才可以使用ssh-key文件。
查看自己使用的源地址是https还是git
使用git remote -v命令
看到https开头的就是使用的https协议,找到项目对于的git源,
使用git remote set-url命令来修改源
在使用git remote -vj就可以查看源是否更改过来了,让后你就可以愉快的git push 而不需要输入用户名密码了。当然,这一切的前提都是你已经添加了ssh-ky