软件开发过程中一个重要的产出就是代码,软件的编码过程一般是由一个团队共同完成,它是一个并行活动,为了保证代码在多人开发中能够顺利完成,我们需要使用代码版本控制工具来对代码进行统一存储,并追踪每一份代码的历史以便于对代码的更改进行追溯,另外一些版本控制工具还提供了冲突合并等高级功能来协调多人对同一代码文件修改。所以版本控制工具可以看做整个编码工作的基础,如果没有版本控制来统一代码库,那么对于复杂且参与人数较多的项目是难以完成的,同时如果没有统一的代码库基础,那么如持续集成、发布等工作将无法开展。

  本文将从以下几个方面介绍版本控制工具及Git的使用方法:

常用的版本控制工具简介

  CVS:

    CVS(Concurrent Versions System)是一个开源的版本控制系统,基于C/S模式,CVS将代码存储在服务器上,通过客户端来获取、提交代码及其它操作。
  SVN:
    SVN(Subversion)和CVS一样是一个C/S模式的开源版本控制系统。
  TFS/VSTS:
    TFS(Team Foundation Server)/VSTS(Visual Studio Team Services)是微软推出的针对团队协作的软件开发工具,版本控制只是其中一个功能,除此之外还提供敏捷开发支持、持续集成等高级功能,TFS和VSTS功能相同,VSTS可以看作是云版本的TFS。TFS按照服务器来授权,VSTS安装账户来授权,另外VSTS提供了免费试用版本(注:VSTS支持Git作为版本控制工具)。
  Git:
    Git是一个分布式的版本控制工具,相对于其它版本控制工具来说,它有一些特有的性质如:分布式/去中心化(每个客户端保存了完整的代码仓库),强大的分支能力,速度非常快(因为代码库在本地基本是本地操作)。因为本身的特性所以Git非常适合开源项目的代码管理,所以使用非常广泛。

使用Git来管理源代码

Git简介

  Git是一个基于文件快照的分布式版本控制工具,对于文件快照来说它体现在当提交更新时,它会对所有文件制作一个快照,在快照中对于没变的文件以链接的方式指向之前存储的文件:

  

  图中每一个Version都是一个包含所有文件的快照,其中虚线框代表的是未改变的文件,通过链接指向前面的文件。
  而分布式可以理解为去中心化,没有特定服务器,每一个节点都拥有所有的内容,而每一台安装了Git的计算机就可以看作一个节点,所以Git几乎所有的操作都是在本地执行的(可以在本地创建仓库、添加/修改/提交文件等等)。
Git中对于文件有三个重要的工作区:

  • 数据仓库:保存了所有Git提交的状态为Commited的文件,相当于集中式版本管理工具中服务器管理的文件数据库,数据仓库文件位于.git目录下
  • 工作目录:工作目录就是用于开发的区域,工作目录的内容从数据仓库中检出指定版本进行修改,修改完成后可将修改内容提交到暂存区域。
  • 暂存区域:暂存区域保存了工作区域提交的文件,“暂存”的意思就是只是对用户修改后需要提交到数据仓库的文件进行暂存,最后可一次性将暂存的内容提交到数据仓库。

  它们的工作流程如下(将它们看作普通的文件目录,它们的操作看成目录间文件的复制操作更容易理解Git的工作原理,其中git仓库比较特殊会保存每一次复制(提交)的内容,而其它两个目录相同内容会被覆盖):

    

安装Git

  说到Git有人可能会有疑惑,为什么Git可以在Visual Studio中使用,而GitHub也提供了自己的客户端,但是像国内也有码云(gitee)这样的托管平台,那么Git这个工具到底是怎样的?要如何使用?
  Git它有多种表现形式,其一是原生的命令行工具,另外其它工具如VS中的、GitHub的客户端实际上都是对命令的封装以简化用户操作的GUI工具,换句话说Git的工具无论怎么变,它的核心都是原生的命令行工具,同时也说明了只要有命令行工具那么就可以使用如GitHub、gitee等不同的基于Git的代码托管平台。
  在Windows下安装git命令行工具(注:Windows下的Git项目是一个独立于Git的项目,好像由微软维护):
  下载地址:https://git-scm.com/download/win
  安装Git:
  选择组件:

  

  注:如果勾选了GitBash Here及Git GUI Here,那么在window的资源管理器中可以通过右键在当前目录打开GitBash(Git专用的命令执行工具,类似cmd/powershell,同时也可以将git的cmd目录配置到环境变量中用Windows的命令行工具执行git命令)或新版本中内置的简单GUI程序:

  

  安装运行结果:

  

  左为Git Bash右为Windows cmd工具。
  注:由于新版本VS会安装内置的Git工具,如果出现一下信息,可检查是否存在路径如“Microsoft Visual Studio 14.0\Web\External\git”的环境变量,删除即可:

  

创建一个本地仓库

  本文使用基于.Net Core的My Blog应用程序代码为例进行演示,My Blog的目录结构如下:

  

  src目录中包含所有代码:

  

  1. 在My Blog的根目录下打开Git Bash,使用git init创建一个本地仓库:

  

  同时该目录下将生成一个.git隐藏目录。
  2. 为该仓库配置用户信息,在提交代码时将使用该用户信息进行提交:
  git config user.name "Selim"
  git config user.email "yqszt@qq.com"

  

  注:此处用户信息仅对当前仓库有效,如果要配置全局用户信息需添加--global选项:
  git config --global user.name "Selim"
  git config --global user.email "yqszt@qq.com"

  3. 最后为该仓库添加忽略文件配置(仅管理代码,如编译结果等文件应该进行过滤):

  

  文件内容来源:https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
  注:windows无法直接创建.gitignore文件,可以用编辑器另存为改变文件名,另外gitignore文件的格式可参考文档:https://git-scm.com/docs/gitignore
  

  4. 将所有文件添加到暂存区:(git add --a)

  

  注:LF是Unix下的换行符CRLF是Windows下的换行符,默认git中使用Unix换行符,可以通过git config –global core.autocrlf false 禁用自动转换 。
  5. 查看状态:(git status)

  

  可以看到所有必须的文件都已经被添加到了暂存区。
  6. 将暂存区代码提交到仓库:(git commit -m "create a repository")

  

  7. 查看日志:(git log)

  

  8. 使用VS2017打开该解决方案后,团队资源管理器中将会自动识别这个本地的git仓库:

  

Git对仓库的常用操作

  前面已经完成了代码仓库的创建,那么Git有哪些常用操作呢?

文件的跟踪、修改、提交

  将新的文件添加到git中管理涉及到的相关操作:

  • 跟踪新文件:(git add 文件名 或 git add -a 后者添加除被忽略以外的所有文件)

  

  • 提交文件:(git commit -m "提交信息")

  

  • 文件修改:(当已经提交的文件再次被修改时,如果要再次提交该文件仍然需要使用git add命令,或者使用git commit -a来跳过暂存区进行提交。注:git commit -a只能提交已经被git管理的修改文件)

  

  跳过暂存区提交:

  

  • 手动删除工作区文件(即直接删除目录下文件):

  

  • 从git中删除文件:(git rm 1.md 或 git rm 1.md -force强制删除)

  

文件的比较

  • 比较修改内容:(git diff)

  

  • 比较暂存区的修改内容:(git diff --cached 或 git diff --staged)

  

  注:需要保证暂存区有内容才会有结果。

  • 使用内置vimdiff比较器查看修改内容:(git difftool)

  

  windows上可以使用winmerge来替换默认的比较/合并工具:
  winmerge下载地址:http://winmerge.org/
  配置方法参考:https://blog.csdn.net/guoxinian/article/details/52297804
         https://stackoverflow.com/questions/1881594/use-winmerge-inside-of-git-to-file-diff

文件状态及历史查看

  • 查看状态:(git status)

  

  • 查看提交历史:(git log)

  

  • 查看状态概要:(git status -s)

  

  状态由2位字符构成,第一位代表暂存区状态有(添加A、修改M)第二位代表工作区状态(修改M),另外??代表git未跟踪的文件。

操作的撤销

  • 撤销工作区的修改:(git checkout -- README.md)

  

  • 撤销暂存区的文件:( git reset HEAD README.md)

  

  • 提交补充(多次提交合并为一个后续提交信息会覆盖之前的):(git commit --amend)

  

  上图对文件READ.md进行了2次修改和提交,但是日志中只会看到最后一次提交的信息:

  

标签

  • 打标签:(git tag -a v0.1 -m "version 0.1")

  

  • 对提交历史打标签:(git tag -a v0.01 -m "created repository")

  

  • 推送标签到远程服务器:(git push origin v0.1 注:需要有远程仓库)

  

  GitHub上的标签:

  

  • 检出标签代码:(git checkout -b version0 v0.01 注:需要有远程仓库)

  

  注:该命令创建了一个新的分支version0,并获取了v0.01tag的代码,改代码是版本库最初的版本。

别名

  git中可以设置命令别名,以简化命令:

  

  上图的别名设置是将checkout等命令简化为co、br、ci、st。

  更多命令和使用方法请参考:
  https://git-scm.com/docs
  https://git-scm.com/book/en/v2

将本地仓库提交到远程

  本地的git仓库已经实现了代码版本控制功能,但是本地的仓库无法实现团队的合作,而且代码库都在本地无法发挥分布式的特性。所以可以将本地的代码仓库提交到远程托管平台如GitHub、Gitee等等。
  在GitHub上创建一个新的仓库(注:需要先注册一个GitHub账户):

  

  创建成功后GitHub会给出提示如何使用这个库,比如创建新库的流程、导入已有库的流程以及导入代码的流程:

  

  这里我们需要第二种方法:

  

  注:如果第一次通过git将代码push到github,那么会出现以下登陆提示:

  

  

  在Windows下仅需要登陆一次,git就会记住登陆信息,避免后续的重复登陆,记录登陆信息的功能由git credential manager提供,详见: https://github.com/Microsoft/Git-Credential-Manager-for-Windows
  这样就能够成功将代码提交到GitHub上:

  

  更多使用GitHub托管代码的内容后续介绍。

小结

  本文主要介绍了常用的代码版本控制工具,版本控制工具可分为集中式的和分布式的,其中集中式的常用的有SVN而分布式的有Git,随着软件开发方式的发展Git更加的符合现代的敏捷、远程协作等概念,所以本系列文章选择了Git作为代码版本控制工具。
  另外本文主要是介绍了Git命令行工具的使用方法并使用了GitHub作为远程代码托管平台对代码进行了托管,Git的GUI工具非常多,但所有的GUI工具的原理都是对Git命令封装,然后提供一些便捷的功能,所以理解Git命令是非常必要的,理解了Git的基础命令再去使用GUI工具会更加得心应手。但要注意的是本文介绍的命令并不全面,因为一个命令还有很多参数选项,所以更多内容可参考Git的官方文档或书籍:https://git-scm.com/docs  https://git-scm.com/book/en/v2
  下一篇文章将对Git的核心特性分支以及pull request进行介绍,敬请期待。

参考:
  https://git-scm.com/docs
  https://git-scm.com/book/en/v2
  https://github.com/Microsoft/Git-Credential-Manager-for-Windows
  https://blog.csdn.net/guoxinian/article/details/52297804
  https://stackoverflow.com/questions/1881594/use-winmerge-inside-of-git-to-file-diff
  https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

本文链接:http://www.cnblogs.com/selimsong/p/9051137.html

好代码是管出来的——使用Git来管理源代码的更多相关文章

  1. VS Code使用Git可视化管理源代码详细教程

    前言: 随着VS Code的功能和插件的不断强大和完善,它已经成为了我们日常开发中一个必不可缺的伙伴了.在之前我曾经写过一篇SourceTree使用教程详解(一个git可视化管理神器,想要了解的话可以 ...

  2. git-svn:通过git来管理svn代码

    简介 svn和git都是常用的版本管理软件,但是git无论在理念或是功能上都比svn更为先进.但是有的公司是以svn作为中央仓库,这时git与svn代码的同步就可以通过 git-svn这个软件进行,从 ...

  3. 使用GIT来管理代码的心得

    使用GIT来管理代码,第一步当然就是下载一个GIT客户端(不知道是不是这么叫,但是觉得和客户端的功能差不多).电脑的操作系统是windows7的,所以下的是对应的GIT. 就是这玩意,安装的时候不停的 ...

  4. 使用 Git 来管理 Xcode 中的代码片段

    使用 Git 来管理 Xcode 中的代码片段 代码片段介绍 xcode4 引入了一个新 feature: code snippets,在整个界面的右下角,可以通过快捷键:cmd + ctrl + o ...

  5. JAE京东云引擎Git上传管理代码教程和京东云数据库导入导出管理

    文章目录 Git管理准备工作 Git工具上传代码 发布代码装程序 mywebsql管理 京东云引擎小结   JAE京东云引擎是京东推出的支持Java.Ruby.Python.PHP.Node.js多语 ...

  6. 代码管理工具:使用github和git工具管理自己的代码

    一.git工具和账户创建 1.1 安装 Git 是 Linus Torvalds 最近实现的源代码管理软件."Git 是一个快速.可扩展的分布式版本控制系统,它具有极为丰富的命令集,对内部系 ...

  7. Azure DevOps Server (TFS)中代码文件换行问题解决方案(Git)

    之前写过一篇博客"探索TFS Git 库文件换行(CRLF)的处理方式",主要是针对TFVC代码库的. 下面这篇文章说明如何在TFS的Git库中处理代码换行的问题. 概述 在Azu ...

  8. 将代码库从 SVN 迁移至 Git 并保留所有 commit 记录

    公司内部原本使用 SVN 进行版本控制,但随着 Github 的流行我个人的代码管理习惯逐渐转变.虽然公司项目并非开源,SVN 所具有的标准 trunk / branches / tags 结构完全够 ...

  9. PHP 代码规范、流程规范、git规范

    1. 命名规范 (1).变量命名规范 1.变量使用驼峰命名法 禁止使用拼音或者拼音加数字 2.变量也应具有描述性,杜绝一切拼音.或拼音英文混杂的命名方式 3.变量包数字.字母和下划线字符,不允许使用其 ...

随机推荐

  1. 配置安装nginx

    1.解决依赖关系和优化所需的组件 编译安装nginx需要事先需要安装开发包组"Development Tools" .同时,安装pcre-devel包,用yum安装即可 安装TCM ...

  2. -lt -gt -ge -le -eq的意义

    脚本如下:#!/bin/bashx=0while [ $x -lt 10 ]doecho $xx=`echo "$x+1" | bc`done 请问这里的-lt是什么意思,请大家指 ...

  3. Gradle 1.12用户指南翻译——第四十章. ANTLR 插件

    本文由CSDN博客万一博主翻译,其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Githu ...

  4. OpenCV——RGB三通道分离

    opencv 和 matlab 在处理彩色图像的时候,通道的存储顺序是不同的. matlab 的排列顺序是R,G,B: 而在opencv中,排列顺序是B,G,R. 下面通过一个小程序看看opencv中 ...

  5. PS 色调——老照片效果

    这就是通过调色使照片显得发黄. R_new=0.393*R+0.769*G+0.189*B; G_new=0.349*R+0.686*G+0.168*B; B_new=0.272*R+0.534*G+ ...

  6. Libevent库学习笔记

    Libevent是一个事件触发的网络库,适用于windows.linux.bsd等多种平台,Libevent在底层select.pool.kqueue和epoll等机制基础上,封装出一致的事件接口.可 ...

  7. ubuntu12.04:Mysql数据库:自动安装

    打开终端,输入下面命令: 1 sudo apt-get install mysql-server 2 sudo apt-get install mysql-client 一旦安装完成,MySQL 服务 ...

  8. <h1>02_Linux学习_命令</h1>

    帮助命令:        xxx --help        man xxx 列出当前目录下的目录和文件:        ls        ls -l        ls --help        ...

  9. Java学习不走弯路教程(7.Eclipse环境搭建)

    7.Eclipse环境搭建 在前几章,我们熟悉了DOS环境下编译和运行Java程序,对于大规模的程序编写,开发工具是必不可少的.Java的开发工具比较常用的是Eclipse.在接下来的教程中,我们将基 ...

  10. windows环境下zookeeper安装和使用

    一.简介        zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一 ...