还不会用Git,快到碗里来

243 阅读10分钟

我见青山多妩媚,料青山,见我,应如是。程序员应如是

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了。

git安装

  • Windows

    去官网下载,选择安装路径,默认安装即可 Git官网下载

  • Lunix

    • 通常输入git可以查看如否安装,如果没有安装,会提示你安装的命令

    • 如果是Ubuntu或Debain可以通过sudo apt-get install git即可安装

    • 如果是其他版本的Linux,可以采用去官网下载源码,然后解压,依次输入:./configmakesudo make install这几个命令安装就好了

  • Mac

    在Appstore中下载Xcode这个IDE,这是苹果系统最好的IDE,开发人员一定会下载的那种,Xcode中集成了Git,不过没有默认安装,需要运行Xcode,在Preferences中找到Downloads,选择Command Line Tools,点击install即可

基本应用

创建版本库

什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以“还原”。

  • 选择一个合适的地方,创建一个空目录

     mkdir GitHubRepository cd GitHubRepository pwd  #显示当前目录
    

    image-20201104191830658

    注:为了避免莫名其妙的问题,建议目录(包括父目录)使用英文

  • 通过git init命令把此目录变成Git管理的仓库

     git init
    

    image-20201104191855689

    瞬间Git就把仓库建好了,而且告诉你是一个空的仓库(empty Git repository),细心的读者可以发现当前目录下多了一个.git的目录,这个目录是Git来跟踪管理版本库的,没事千万不要手动修改这个目录里面的文件,不然改乱了,就把Git仓库给破坏了。

  • 把文件添加到版本库

    首先这里再明确一下,所有的版本控制系统,其实只能跟踪文本文件的改动,比如TXT文件,网页,所有的程序代码等等,Git也不例外。版本控制系统可以告诉你每次的改动,比如在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但没法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改成了120KB,但到底改了啥,版本控制系统不知道,也没法知道。

    不幸的是,Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。

    因为文本是有编码的,比如中文有常用的GBK编码,日文有Shift_JIS编码,如果没有历史遗留问题,强烈建议使用标准的UTF-8编码,所有语言使用同一种编码,既没有冲突,又被所有平台所支持。

    • 编写一个about.txt文件,内容如下

      我是程序员应如是 Git is a version control system

    • 使用git add命令,把文件添加到仓库

      git add about.txt

    image-20201104191919909

    注:LF和CRLF是两种换行方式,对于这次学习Git没影响

    • 使用git commit命令,把文件提交到仓库

      git commit -m "This is a message about me" # -m 后面的是本次提交的说明信息,最好写的有意义,帮助别人了解此次改动的信息

    image-20201104191940296

    • 使用git status查看结果

      git status

    image-20201104191958853

    注:git add <file>可以添加多个文件,反复使用;git commit -m <message>可以一次提交多个文件

时光穿梭(版本)

  • 现在模仿日常工作,要对项目进行修改,我们修改about.txt文件,添加如下信息

     Git is a free software.
    

    再使用git status查看结果

    image-20201104192017163

    通过git status命令,我们可以时刻掌握仓库当前的状态,上面的命令输出告诉我们,文件被修改了,但是还没有提交修改

    • 使用git diff命令查看具体修改的内容

      git diff about.txt

    image-20201104192035542

    • 再分别使用git add;git commit;git status命令查看状态

      git add about.txt git status #查看此时的状态 git commit -m "Add a message" git status #再查看此时的状态

    image-20201104192057057

  • 版本回退

    • 使用git log命令查看文件的版本

      git log

    image-20201104192114962

    git log命令显示从最近到最远的提交日志

    如果嫌输出信息太多,可以加上--pretty=oneline参数

     git log --pretty=oneline
    

    image-20201104192132332

    需要友情提示的是,你看到的一大串类似4b4258ee...的是commit id(版本号),和SVN不一样,Git的commit id不是1,2,3……递增的数字,而是一个SHA1计算出来的一个非常大的数字,用十六进制表示,而且你看到的commit id和我的肯定不一样,以你自己的为准。为什么commit id需要用这么一大串数字表示呢?因为Git是分布式的版本控制系统,后面我们还要研究多人在同一个版本库里工作,如果大家都用1,2,3……作为版本号,那肯定就冲突了。

    • 版本回退

    在Git中,用HEAD表示当前版本,也就是最新的提交1094adb...(注意我的提交ID和你的肯定不一样),上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100

     #回到上一个版本 git reset --hard HEAD^
    

    image-20201104192151062

    我们已经乘坐时光机回去了

    • 想再回来

    如果想要再回来,就必须知道commit id,如果不记得了,git提供了后悔药

     git refolg # 记录你的每一次命令 git reset --hard 4b4258e cat about.txt
    

    image-20201104192206215

    诶嘿,我胡汉三又回来了

    注:版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。

  • 工作区和暂存区

    Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念。

    • 工作区(Working Directory)

    就是你在电脑里能看到的目录,比如我的LearnMysql文件夹就是一个工作区

    • 版本库(Repository)

    工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。

    Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD

    image-20201104192223012

    • 工作流程

    第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;

    第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。

  • 管理修改

    Git管理的是修改,当你用git add命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。

    • 可以用git diff HEAD命令查看工作区和版本库里面最新版本的区别

      git diff HEAD --about.txt

    image-20201104192239252

  • 撤销修改

    当你在深夜加班修改项目时,不小心在项目里添加了如下

     TMD,stupid boss
    

    嗯~,难受!这个月的奖金,嗯~~

    • 内容只在工作区,没有使用过git add

      git checkout -- about.txt

    git checkout -- file可以丢弃工作区的修改

    image-20201104192255744

    image-20201104192309329

    修改被删除了

    注:git checkout -- file命令中的--很重要,没有--,就变成了“切换到另一个分支”的命令,我们在后面的分支管理中会再次遇到git checkout命令。

    • 内容在暂存区,使用了git add命令,没使用git commit命令

      git reset HEAD about.txt #把文件从暂存区重新放回工作区

    现在修改在工作区,可以使用上面的命令将工作区的修改删除

    image-20201104192339336

    嗯,奖金总算保住了

    • 如果脑子一热,使用了git commit命令,可以通过版本回退,回到上一个版本

    image-20201104192358404

  • 删除文件

    现在我们有一个没用的文件test.txt,想要删除,文件已经在版本库中

    首先我们先删除工作区的文件,可以图形化删除也可以使用命令rm <file>

    image-20201104192415808

    现在我们有两个选择

    • 删除版本库中的文件

      git rm test.txt #从版本库中删除文件 git commit -m "remove test.txt" ​ #也可以使用git add test.txt 代替git rm test.txt 效果一样

    image-20201104192430077

    • 删除了,从版本库中恢复文件

      #git checkout 版本库里文件的版本替换工作区里文件的版本 git checkout -- test.txt

    image-20201104192448870

小提示:

  • git 提交信息

    查看其他人提交的修改内容或自己的历史记录的时候,提交信息是需要用到的重要资料。所以请用心填写修改内容的提交信息,以方便别人理解。 以下是Git的标准注解:

     第1行:提交修改内容的摘要 第2行:空行 第3行以后:修改的理由
    
  • git更新

     #查看版本 git --version #git版本是2.17.1之前 git update #git版本是2.17.1之后 git update-git-for-windows
    

欢迎大家关注公众号程序员应如是,获取精彩内容