好代码是管出来的——使用Git来管理源代码

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

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

  • 常用的版本控制工具简介

  • 使用Git来管理源代码

    • Git简介

    • 安装Git

    • 创建一个本地仓库

  • 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, GitHub, Git Server的24堂课

作者:孙宏明

当当 广告
购买

Git团队协作

作者:[加] 艾玛?简?霍格宾?韦斯特比(Emma Jane Hogbin Westb

当当 广告
购买

Git软件开发实战

作者:[美]Brent Laster 著 蒲成 译

当当 广告
购买

使用Git来管理源代码

Git简介

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

  640?wx_fmt=jpeg

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

  • 数据仓库:保存了所有Git提交的状态为Commited的文件,相当于集中式版本管理工具中服务器管理的文件数据库,数据仓库文件位于.git目录下

  • 工作目录:工作目录就是用于开发的区域,工作目录的内容从数据仓库中检出指定版本进行修改,修改完成后可将修改内容提交到暂存区域。

  • 暂存区域:暂存区域保存了工作区域提交的文件,“暂存”的意思就是只是对用户修改后需要提交到数据仓库的文件进行暂存,最后可一次性将暂存的内容提交到数据仓库。

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

  640?wx_fmt=png  

安装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:
  选择组件:

  640?wx_fmt=png

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

  640?wx_fmt=png

  安装运行结果:

  640?wx_fmt=png

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

   640?wx_fmt=png

创建一个本地仓库

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

  640?wx_fmt=png

  src目录中包含所有代码:

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

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

  640?wx_fmt=png

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

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

  7. 查看日志:(git log)

  640?wx_fmt=png

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

  640?wx_fmt=png

Git对仓库的常用操作

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

文件的跟踪、修改、提交

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

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

  跳过暂存区提交:

  640?wx_fmt=png

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

   640?wx_fmt=png

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

  640?wx_fmt=png

文件的比较

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

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

  640?wx_fmt=png

  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)

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

操作的撤销

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

标签

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

   640?wx_fmt=png

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

  640?wx_fmt=png

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

  640?wx_fmt=png

  GitHub上的标签:

  640?wx_fmt=png

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

  640?wx_fmt=png

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

别名

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

  640?wx_fmt=png

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

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

将本地仓库提交到远程

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

   640?wx_fmt=png

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

   640?wx_fmt=png

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

  640?wx_fmt=jpeg

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

  640?wx_fmt=png

 

   

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

  640?wx_fmt=png

  更多使用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

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【DP】序列

序列 题目大意: 定义“好序列”为满足每一个数是上一个数的倍数的序列,求一个长度为K的“好序列” 原题: 题目描述 一个长度为k的整数序列b1,b2,…,bk(1≤b1≤b2≤…≤bk≤N)称…

线段树-楼房重建-洛谷-P4198

楼房重建 题目大意 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房。每天,这片工地上的房子拆了又建、建了又拆。他经常无聊地看着窗外发呆,数自己能够看到多少栋房子。 为了简化问题,我们考虑这些事件发生在一个二维平面…

P6835-[Cnoi2020]线形生物【期望dp】

正题 题目链接:https://www.luogu.com.cn/problem/P6835?contestId34123 题目大意 n1n1n1个点,其中每个iii向i1i1i1连边(i≤n)(i\leq n)(i≤n),然后有mmm对(u,v)(u,v)(u,v)表示uuu向vvv连边u≥vu\geq vu≥v。开始在点111,每次随机走一个相连…

【DP】游戏

游戏 题目大意: 有一个图,第s秒在点p会出现c个怪物(过了这一秒就会消失),小明可以从任意一个点出发(从第一秒开始),有m条路径(无向),链接着两个…

定时调度系列之Quartz.Net详解

一. 背景我们在日常开发中,可能你会遇到这样的需求:"每个月的3号给用户发信息,提醒用户XXX "、"每天的0点需要统计前一天的考勤记录"、"每个月的1号计算上个月的库存情况"、"定时初始化数据供其它业务使用…

CF1419E-Decryption【数论,dfs】

正题 题目链接:https://www.luogu.com.cn/problem/CF1419E 题目大意 nnn的所有约数排成一个圈,求一个顺序使得相邻的互质的数最少。 解题思路 质因数分解后,我们考虑每个质因数之间填什么。对于两个质因数a,ba,ba,b。显然a∗ba*ba∗b也是nnn的约数&…

P4445 最长回文串

P4445 最长回文串 题目描述 顺序和逆序读起来完全一样的串叫做回文串。比如acbcaacbcaacbca是回文串,而abcabcabc不是(abc的顺序为abcabcabc,逆序为cbacbacba,不相同)。 输入长度为nnn的串SSS,求SSS的最…

RyuJIT的华丽转身

RyuJIT是作为.NET即时编译器的代号称谓,它是.NET运行时的基本组件之一。与此相反的是,Roslyn作为C#编译器,其编译C#代码成为IL字节码。然后,其再将IL字节码编译成相对于多种处理器的机器码。随着最近对dotnet/coreclr #18064的合并…

【树状数组】【dfs】树

树 题目大意: 有一棵树,当给一个点加上一个val时,他的儿子会减val,而他儿子的儿子会加上val(-(-val)val),有m条指令,要不输出某个点的值,要不给…

SP1811-Longest Common Substring【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/SP1811 题目大意 求两个串的最长公共子串。 解题思路 对与第一个串首先构建一个SAMSAMSAM,然后考虑让第二个串在上面匹配。 对于枚举的每个位置要在SAMSAMSAM上找一个节点使得它的后缀是枚举到的位置的后缀。所…

使用Nexus搭建私有Nuget仓库

前言Nuget是ASP .NET Gallery的一员,是免费、开源的包管理工具,专注于在.Net / .Net Core应用开发过程中第三方组件库的管理,相对于传统单纯的dll引用要方便、科学得多。其中nuget.org是最著名的Nuget公开库,但是企业内部开发的&a…

Wannafly挑战赛26 题解

Wannafly挑战赛26 题目连接 https://www.nowcoder.com/acm/contest/212#question A. 御坂网络 枚举圆心所在的位置,O(n)O(n)O(n) 检查即可,总时间复杂度为O(n2)O(n^2)O(n2) B. 冥土追魂 这题比较坑,我感觉题意叙述有问题,总之也是一道水题,题解略去. C. 七彩线段 题解 …

初一模拟赛总结(3.16)

成绩: rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf210210210303030100100100000808080222hkyhkyhky190190190100100100000101010808080333fyfyfy120120120100100100000202020000444tjhtjhtjh100100100100100100000000000555wjjwj…

牛客挑战赛43C-最优公式【二分】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7413/C 题目大意 给一个序列AAA,求两个a,ba,ba,b使得∑i1n∑j1nmax{∣Ai−a∣,∣Aj−b∣}\sum_{i1}^n\sum_{j1}^nmax\{|A_i-a|,|A_j-b|\}i1∑n​j1∑n​max{∣Ai​−a∣,∣Aj​−b∣}最小。 解题思路 因为是取…

好代码是管出来的——Git的分支工作流与Pull Request

上一篇文章好代码是管出来的——使用Git来管理源代码 介绍了常用的版本控制工具以及git的基本用法,从基本用法来看git与其它的版本控制工具好像区别不大,都是对代码新增、提交进行管理,可以查看提交历史、代码差异等功能。但实际上git有一个重…

牛客练习赛29 题解

牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系… 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下标,下标的最小值是1. 然后贪心一下就好了. 代码 #include <iost…

【Floyed】小萨的烦恼(ssl 1624)

小萨的烦恼 ssl 1624 题目大意&#xff1a; 一个无向图&#xff0c;可以使其中一条道路的值除以2&#xff0c;求两个点之间的最短路 原题&#xff1a; Description 圣诞节又要到了&#xff01;小萨希望和自己心仪的MM一起出去度过一个浪漫的的圣诞节。他进行了详尽的准备…

好代码是管出来的——使用GitHub

前面的文章介绍了Git的基本概念和用法&#xff0c;本文则是基于GitHub的一个实践介绍&#xff0c;主要内容有&#xff1a;GitHub简介个人与组织仓库的创建与维护Fork与pull request小结GitHub简介GitHub是一个Git的远程代码托管平台&#xff0c;它除了提供代码托管外&#xff0…

Wannafly挑战赛24

Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减少一堆偶数石子,因此,先手必胜. 我们可以不考虑奇数堆石子,因为必胜方始终可以动偶数堆. 当必败方将奇数堆分成一堆偶数和一堆…

【模拟】正方形

正方形 题目大意&#xff1a; 有三个人&#xff0c;一人一笔的画正方形&#xff0c;每个正方形是上一个正方形每条边上的中点连接而成的&#xff0c;求每个人画了多长 原题&#xff1a; 题目描述 又到暑假啦&#xff0c;Conan, Ayumi, Mitsuhiko, Genta一起到Hakase家愉快…