美文网首页
Git 入门使用

Git 入门使用

作者: 山间草夫 | 来源:发表于2020-08-30 21:47 被阅读0次

    Git 是目前世界上最先进的分布式版本控制系统

    很多人都知道,Linus (利纳斯)在1991年创建了开源的 Linux(利纳克斯),从此,Linux 系统不断发展,已经成为最大的服务器系统软件了。

    Linus 虽然创建了Linux,但 Linux 的壮大是靠全世界热心的志愿者参与的,这么多人在世界各地为 Linux 编写代码,那 Linux 的代码是如何管理的呢?

    事实是,在 2002 年以前,世界各地的志愿者把源代码文件通过 diff 的方式发给 Linus,然后由 Linus 本人通过手工方式合并代码!

    你也许会想,为什么 Linus 不把 Linux 代码放到版本控制系统里呢?不是有 CVS、SVN 这些免费的版本控制系统吗?因为 Linus 坚定地反对 CVS 和 SVN,这些集中式的版本控制系统不但速度慢,而且必须联网才能使用。有一些商用的版本控制系统,虽然比 CVS、SVN 好用,但那是付费的,和 Linux 的开源精神不符。

    不过,到了2002年,Linux 系统已经发展了十年了,代码库之大让 Linus 很难继续通过手工方式管理了,社区的弟兄们也对这种方式表达了强烈不满,于是 Linus 选择了一个商业的版本控制系统 BitKeeper,BitKeeper 的东家 BitMover 公司出于人道主义精神,授权 Linux 社区免费使用这个版本控制系统。

    安定团结的大好局面在2005年就被打破了,原因是 Linux 社区牛人聚集,不免沾染了一些梁山好汉的江湖习气。开发 Samba 的 Andrew 试图破解 BitKeeper 的协议(这么干的其实也不只他一个),被 BitMover 公司发现了(监控工作做得不错!),于是 BitMover 公司怒了,要收回 Linux 社区的免费使用权。

    Linus 可以向 BitMover 公司道个歉,保证以后严格管教弟兄们,嗯,这是不可能的。实际情况是这样的:

    Linus 花了两周时间自己用 C 写了一个分布式版本控制系统,这就是 Git!一个月之内,Linux 系统的源码已经由 Git 管理了!牛是怎么定义的呢?大家可以体会一下。

    Git 迅速成为最流行的分布式版本控制系统,尤其是 2008 年,GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub,包括 jQuery,PHP,Ruby 等等。

    历史就是这么偶然,如果不是当年 BitMover 公司威胁 Linux 社区,可能现在我们就没有免费而超级好用的 Git 了。

    抢票浏览器插件,GitHub 屏蔽中国IP:有人写了一个购票插件,这个插件的其中一个 .js 文件托管于 GitHub 上,因为插件使用量太大,这个 .js 文件访问量太大,给 GitHub 造成了巨大的压力。

    集中式和分布式

    1. 先说集中式版本控制系统,版本库是集中存放在中央服务器的,而干活的时候,用的都是自己的电脑,所以要先从中央服务器取得最新的版本,然后开始干活,干完活了,再把自己的活推送给中央服务器。中央服务器就好比是一个图书馆,你要改一本书,必须先从图书馆借出来,然后回到家自己改,改完了,再放回图书馆。

      缺点: 集中式版本控制系统最大的毛病就是必须联网才能工作,如果在局域网内还好,带宽够大,速度够快,可如果在互联网上,遇到网速慢的话,可能提交一个 10M 的文件就需要 5 分钟,这还不得把人给憋死啊。

    2. 那分布式版本控制系统与集中式版本控制系统有何不同呢?首先,分布式版本控制系统根本没有“中央服务器”,每个人的电脑上都是一个完整的版本库,这样,你工作的时候,就不需要联网了,因为版本库就在你自己的电脑上。既然每个人电脑上都有一个完整的版本库,那多个人如何协作呢?比方说你在自己电脑上改了文件 A,你的同事也在他的电脑上改了文件 A,这时,你们俩之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。

      和集中式版本控制系统相比,分布式版本控制系统的安全性要高很多,因为每个人电脑里都有完整的版本库,某一个人的电脑坏掉了不要紧,随便从其他人那里复制一个就可以了。而集中式版本控制系统的中央服务器要是出了问题,所有人都没法干活了。

      在实际使用分布式版本控制系统的时候,其实很少在两人之间的电脑上推送版本库的修改,因为可能你们俩不在一个局域网内,两台电脑互相访问不了,也可能今天你的同事病了,他的电脑压根没有开机。因此,分布式版本控制系统通常也有一台充当“中央服务器”的电脑,但这个服务器的作用仅仅是用来方便“交换”大家的修改,没有它大家也一样干活,只是交换修改不方便而已。

      当然,Git 的优势不单是不必联网这么简单,后面我们还会看到 Git 极其强大的分支管理,把 SVN 等远远抛在了后面。

    3. CVS 作为最早的开源而且免费的集中式版本控制系统,直到现在还有不少人在用。由于 CVS 自身设计的问题,会造成提交文件不完整,版本库莫名其妙损坏的情况。同样是开源而且免费的 SVN 修正了 CVS 的一些稳定性问题,是目前用得最多的集中式版本库控制系统。

      除了免费的外,还有收费的集中式版本控制系统,比如 IBM 的 ClearCase(以前是 Rational 公司的,被 IBM 收购了),特点是安装比 Windows 还大,运行比蜗牛还慢,能用 ClearCase 的一般是世界 500 强,他们有个共同的特点是财大气粗,或者人傻钱多。

      微软自己也有一个集中式版本控制系统叫 VSS,集成在 Visual Studio 中。由于其反人类的设计,连微软自己都不好意思用了。

      分布式版本控制系统除了Git 以及促使 Git 诞生的 BitKeeper 外,还有类似 Git 的 Mercurial 和 Bazaar 等。这些分布式版本控制系统各有特点,但最快、最简单也最流行的依然是 Git! 总结:集中式选用 SVN,分布式使用 Git。

      总结一下, SVN是单个仓库集中式. 而git是分布式仓库, 每个人的git的工作空间是一个本地仓库, 而git的远程仓库则是自己(或者是团队)的公用仓库. 上面也说了Git 不需要远程仓库,也能干活, 远程仓库只是用来交换修改的空间.

    Git 的安装

    这里只讲Window的安装(我相信如果是LInux或者是mac的用户安装,git更是一件简单的事儿.);

    1. 打开: https://git-scm.com/download/win
    2. 根据电脑的版本下载对应的git 客户端即可
    3. 下载完成直接点击下一步,默认安装即可

    Git 一些简单的概念

    每个项目都有一个 git 目录,它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。

    • 从项目中取出某个版本的所有文件和目录,用以开始后续工作的叫做工作区。这些文件实际上都是从 git 目录中的压缩对象数据库中提取出来的,接下来就可以在工作目录中对这些文件进行编辑。

    • 所谓的暂存区只不过是个简单的文件,一般都放在 git 目录中。有时候人们会把这个文件叫做索引文件,不过标准说法还是叫暂存区。

    • 远程仓库, 就是你的远程git仓库,用于个人或者是团队保存工作的仓库., 每个人的工作内容都可以推送到远程仓库

    • Push push 的意思就是, 我们把本地仓库的内容推到远程仓库.

    • Pull 顾名思义, 我们把远程仓库的内容拉取到本地仓库的动作

    • 文件跟踪 指的是在工作空间创建一个文件, 但是工作空间没有和文件或者是文件夹发生关联管理的一种关系.

    • 工作空间状态(前提是你已经在电脑上面安装好了git)

    • 创建一个git空间,随便找一个空的文件夹: 鼠标右键 : 点击 GIt Bash Here, 就会出现Git 命令行. 然后在命令行中输入.

      git init            我们的第一个git命令,叫做初始化工作空间
      
    • 在文件夹下面创建一个文本文件, 假如创建的文本文件叫做hello.txt

      这个时候在你的命令行中输入

      git status          这个命令是用来查看工作空间状态的
      
      $ git status
      On branch master
      
      No commits yet
      
      Untracked files:
       (use "git add <file>..." to include in what will be committed)
      
             hello.txt
      
      nothing added to commit but untracked files present (use "git add" to track)
      
      这个时候的状态是红色,有一个 hello.txt 文件没有git跟踪.
      
    • 在命令行中 执行 git add hello.txt , 然后再执行git status

      jeesk@JeeskPc MINGW64 /f/BaiduNetdiskDownload/hello (master)
      $ git add hello.txt
      warning: LF will be replaced by CRLF in hello.txt.
      The file will have its original line endings in your working directory
      $ git status
      On branch master
      
      No commits yet
      
      Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
      
            new file:   hello.txt
             上面的工作空间是绿色: 表示hello.txt 文件没有被提交到本地仓库
       ```
      
    1. ​ 执行 git commit -m '这儿要写你提交的注释', 然后查看状态

      jeesk@JeeskPc MINGW64 /f/BaiduNetdiskDownload/hello (master)
      $ git commit -m '这儿是写的你的提交的注释'
      [master (root-commit) ba4c11a] 这儿是写的你的提交的注释
       1 file changed, 1 insertion(+)
       create mode 100644 hello.txt
      
      jeesk@JeeskPc MINGW64 /f/BaiduNetdiskDownload/hello (master)
      $ git status
      On branch master
      nothing to commit, working tree clean
      
      jeesk@JeeskPc MINGW64 /f/BaiduNetdiskDownload/hello (master)
      $
      

    这个时候你的工作空间就干净了.

    这个时候有人要问: 这个工作状态有什么用呢? 那么接下来说说分支

    分支

    分支在实际中有什么用呢?假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了 50% 的代码,如果立刻提交,由于代码还没写完,不完整的代码库会导致别人不能干活了。如果等代码全部写完再一次提交,又存在丢失每天进度的巨大风险。 现在有了分支,就不用怕了。你创建了一个属于你自己的分支,别人看不到,还继续在原来的分支上正常工作,而你在自己的分支上干活,想提交就提交,直到开发完毕后,再一次性合并到原来的分支上,这样,既安全,又不影响别人工作。 分支可以看做你开发的不同的版本.

    你的每个分支都是一个独立的工作空间, 但是如果你在切换分支的时候, 工作空间是不干净的, 那么将会污染其他的分支(会将1个分支的文件改动,带到另外一个分支). 这种情况, 明显是我们不愿意看见的.

    总结

    • git 分布式的版本管理, 自己的本地仓库和远程仓库可以互补, 远程仓库用来交换大家的修改.
    • git 的工作空间的文件改动, 会导致空间状态的. 记住, 在切换分支的开发的时候, 工作空间必须保持clean. 否则会污染其他的分支
    • git 的一些概念必须理解, 否则使用git 很容易出错

    相关文章

      网友评论

          本文标题:Git 入门使用

          本文链接:https://www.haomeiwen.com/subject/loxhsftx.html