Git使用基础-1

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

image

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
    

                                                 END
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260