Git学习总结一

一、在Windows上安装Git

在Windows上使用Git,可以从Git官网直接下载安装程序,(网速慢的同学请移步国内镜像),然后按默认选项安装即可。

安装完成后,在开始菜单里找到“Git”->“Git Bash”,蹦出一个类似命令行窗口的东西,就说明Git安装成功!

安装完成后,还需要最后一步设置,在命令行输入:

$ git config --global user.name "Your Name"     //我们可以自定义用户名
$ git config --global user.email "email@example.com"  //我们也可以自定义邮箱

在这里我举例说明

$ git config --global user.name "JavaAllianceNotes"
$ git config --global user.email "1964327886@qq.com"

因为Git是分布式版本控制系统,所以,每个机器都必须自报家门:你的名字和Email地址。你也许会担心,如果有人故意冒充别人怎么办?这个不必担心,首先我们相信大家都是善良无知的群众,其次,真的有冒充的也是有办法可查的。

注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以对某个仓库指定不同的用户名和Email地址。

二、创建版本库

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

所以,创建一个版本库非常简单,首先,选择一个合适的地方,创建一个空目录:

$ mkdir JavaAlliance
$ cd JavaAlliance
$ pwd
/d/JavaAlliance     //我们是在D盘下创建的目录JavaAlliance

pwd命令用于显示当前目录

如果你使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。

第二步,通过git init命令把这个目录变成Git可以管理的仓库:

$ git init
Initialized empty Git repository in /d/JavaAlliance/.git/

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

如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。

**注意:**也不一定必须在空目录下创建Git仓库,选择一个已经有东西的目录也是可以的。不过,不建议你使用自己正在开发的公司项目来学习Git,否则造成的一切后果概不负责。

使用Windows的童鞋要特别注意:

千万不要使用Windows自带的记事本编辑任何文本文件。原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题,比如,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误,等等,都是由记事本的弱智行为带来的。建议你下载Notepad++代替记事本,不但功能强大,而且免费!记得把Notepad++的默认编码设置为UTF-8 without BOM即可:

言归正传,现在我们用Notepad++编写一个readme.txt文件,内容如下:

I am JavaAllianceNotes
Welcome your coming!!!

然后把该文件放到我们刚才创建的版本库目录下,D:\JavaAlliance\目录或者其子目录下即可

因为这是一个Git仓库,放到其他地方,就算Git再厉害也找不到这个文件。

第一步,用命令git add告诉Git,把文件添加到仓库:

$ git add readme.txt

执行上面的命令,没有任何显示,这就对了,Unix的哲学是“没有消息就是好消息”,说明添加成功。

第二步,用命令git commit告诉Git,把文件提交到仓库:

(小疑问:第一步已经添加到仓库了,为什么还要提交到仓库 ?

解答:git commit命令,-m后面输入的是本次提交的说明,如果仅靠git add操作只能说是把文件放入了仓库,但是还是不能正式使用,还需要“提交”才行,而git commit 操作相当于“提交”操作,并在提交文件之后要给该添加行为做一个说明,所以文件执行git add之后一定要git commit才生效)

git commit命令执行成功后会告诉你,1 file changed:1个文件被改动(我们新添加的readme.txt文件);2 insertions:插入了两行内容(readme.txt有两行内容)。

总结:为什么Git添加文件需要addcommit一共两步呢?因为commit可以一次提交很多文件,所以你可以多次add不同的文件,比如:

$ git add file1.txt
$ git add file2.txt
$ git add file3.txt
$ git commit -m "add  files" //可以看到上面两行都是执行的git add操作,而这一行代码git commit就把上面的add的3个文件一起提交了

三、git status和git diff命令

按前面的操作之后,我们已经成功地添加并提交了一个readme.txt文件,现在,是时候继续工作了,于是,我们继续修改readme.txt文件,改成如下内容:

I am JavaAllianceNotes
Welcome your coming!!!
Thank you<A3><A1>

现在,运行git status命令看看结果:

git status命令可以让我们时刻掌握仓库当前的状态,上面的命令输出告诉我们,readme.txt被修改过了,但还没有提交该修改结果。

虽然Git告诉我们readme.txt被修改了,但如果能看看具体修改了什么内容,自然是很好的。比如你休假两周从国外回来,第一天上班时,已经记不清上次怎么修改的readme.txt,所以,需要用git diff这个命令看看:

git diff顾名思义就是查看difference,显示的格式正是Unix通用的diff格式,可以从上面的命令输出看到我们在原readme.txt文件的末尾又添加了一行”Thank you “

知道了对readme.txt作了什么修改后,再把它提交到仓库就放心多了,提交修改和提交新文件是一样的两步,第一步是git add

$ git add readme.txt

同样没有任何输出。在执行第二步git commit之前,我们再运行git status看看当前仓库的状态:

git status告诉我们,将要被提交的修改包括readme.txt,下一步,就可以放心地提交了:

$ git commit -m "add thank you<A3><A1>"

提交后,我们再用git status命令看看仓库的当前状态:

Git告诉我们当前没有需要提交的修改,而且,工作目录是干净(working tree clean)的。

总结:就是每次修改了文件之后,都要重新git add ,然后git commit一下才能将修改之后的结果提交到版本库中去

四、版本回退

像这样,你不断对文件进行修改,然后不断提交修改到版本库里,就好比玩RPG游戏时,每通过一关就会自动把游戏状态存盘,如果某一关没过去,你还可以选择读取前一关的状态。有些时候,在打Boss之前,你会手动存盘,以便万一打Boss失败了,可以从最近的地方重新开始。Git也是一样,每当你觉得文件修改到一定程度的时候,就可以“保存一个快照”,这个快照在Git中被称为commit。一旦你把文件改乱了,或者误删了文件,还可以从最近的一个commit恢复,然后继续工作,而不是把几个月的工作成果全部丢失。

当然了,在实际工作中,我们脑子里怎么可能记得一个几千行的文件每次都改了什么内容,不然要版本控制系统干什么。版本控制系统肯定有某个命令可以告诉我们历史记录,在Git中,我们用git log命令查看:

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

如果嫌输出信息太多,看得眼花缭乱的,可以试试加上--pretty=oneline参数: oneline就是”一行“的意思

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

每提交一个新版本,实际上Git就会把它们自动串成一条时间线。如果使用可视化工具查看Git历史,就可以更清楚地看到提交历史的时间线:

好了,现在我们启动时光穿梭机,准备把readme.txt回退到上一个版本,怎么做呢?

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

现在,我们要把当前版本回退到上一个版本,就可以使用git reset命令:

--hard参数有啥意义?这个后面再讲,现在你先放心使用。

看看readme.txt的内容是不是之间的版本,发现果然被还原了


我们用git log再看看现在版本库的状态:

最新的那个版本Thank you<A3><A1>已经看不到了!好比你从21世纪坐时光穿梭机来到了19世纪,想再回去已经回不去了,肿么办?

办法其实还是有的,只要上面的命令行窗口还没有被关掉,你就可以顺着往上找啊找啊,找到那个Thank you<A3><A1>commit ida58ef0825b...,于是就可以指定回到未来的某个版本:

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

再小心翼翼地看看readme.txt的内容:

果然,我胡汉三又回来了。

Git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向Thank you<A3><A1>

然后顺便把工作区的文件更新了。所以你让HEAD指向哪个版本号,你就把当前版本定位在哪。

现在,你回退到了某个版本,关掉了电脑,第二天早上就后悔了,想恢复到新版本怎么办?找不到新版本的commit id怎么办?

在Git中,总是有后悔药可以吃的,Git提供了一个命令git reflog用来记录你的每一次命令:

终于舒了口气,从输出可知,你每次修改操作的版本号id都展示出来了,现在,你又可以乘坐时光机回到未来了。

小结

现在总结一下:

  • HEAD指向的版本就是当前版本,因此,Git允许我们在版本的历史之间穿梭,使用命令git reset --hard commit_id
  • 穿梭前,用git log可以查看提交历史,以便确定要回退到哪个版本。
  • 要重返未来,用git reflog查看命令历史,以便确定要回到未来的哪个版本。

Git学习总结(1)相关推荐

  1. Git学习系列之Git基本操作提交项目(图文详解)

    前面博客 Git学习系列之Git基本操作克隆项目(图文详解) 然后可以 cd 切换到 LispGentleIntro 目录, 新增或者修改某些文件.这里只是模拟一下操作, 实际情况可能是 使用 Ecl ...

  2. Git学习系列之Windows上安装Git之后的一些配置(图文详解)

    不多说,直接上干货! 前面博客 Git学习系列之Windows上安装Git详细步骤(图文详解) 第一次使用Git时,需要对Git进行一些配置,以方便使用Git. 不过,这种配置工作只需要进行一次便可, ...

  3. Mac~git学习和应用需要注意的几个点

    Git学习推荐网站:廖雪峰-Git教程 - 廖雪峰的官方网站,通俗易懂,简单粗暴,就是平俗的语言,好懂.粗暴的那种 git学习进阶-国外经典git学习网站:Git - Book 目录 1. 全局配置和 ...

  4. Git学习(一)git服务器的简易搭建

    Git学习(一)git服务器的简易搭建 使用环境:docker容器模拟的3个ubuntu14.04的系统 分别模拟了3个系统: Ubuntu_gitserver:14.04  用于git服务器的安装 ...

  5. 面向任务的 Git 学习法

    前言 对于 Git 学习而言,通常枯燥的理论学习并不能帮助我们快速掌握它的使用,需要我们结合实践,才能更好地学会利用 Git 进行多人协作开发.本文就以任务的形式,来介绍 Git 命令的使用,希望在进 ...

  6. Git学习记录 力做全网最强入门教程

    目录 Git学习记录 力做全网最强入门教程 什么是GitHub? 什么是Git? Git的配置 Git的安装(只介绍windos操作系统下) Git的配置 至此我们的入门教程到此结束,更新中级教程要等 ...

  7. ​​​​​​​Git学习笔记与IntelliJ IDEA整合

    2019独角兽企业重金招聘Python工程师标准>>> Git学习笔记与IntelliJ IDEA整合 一.Git学习笔记(基于Github) 1.安装和配置Git 下载地址:htt ...

  8. 分布式版本控制系统Git学习资源收集汇总

    伴随着知乎上一个问题:GitHub 是怎么火起来的?被顶起200+的回答说到:Github不是突然火起来的,在Ruby社区Github其实从一开始就很流行,我们2009年搞Ruby大会就邀请了Gith ...

  9. git学习------gt;写给 Git 初学者的7个建议

    PS:本文转载于(http://blog.jobbole.com/50603/),本文由 伯乐在线 - 吴鹏煜 翻译. 英文出处:(http://sixrevisions.com/web-develo ...

  10. Git 学习笔记:自定义Git(完)

    前言 在补习python的时候主要参考的是廖雪峰的教程Python教程,在学习完后准备完成期末作业时,遇到了一个技术难题,需要初步掌握git,因此开始了git的学习. 本教程参考廖雪峰的Git教程 G ...

最新文章

  1. GitHub万星的中文机器学习资源:路线图、视频、电子书、学习建议全在这
  2. 景观设计主题命名_好听的景观名字
  3. British Journal of Management
  4. Window下yolov3的配置教程
  5. .NET Core 2.0 开源Office组件 NPOI
  6. LeetCode题集大全
  7. Spring中父子容器的实现实例
  8. PHP递归删除目录及目录下的文件
  9. 深入理解JavaScript定时器
  10. QT_继承ApplicationWindow控件的C++与QML交互
  11. Tomcat启动页面中文乱码解决方法
  12. [POI2008]枪战Maf
  13. 编辑距离算法原理及其实现
  14. 光纤收发器怎么连?光纤收发器连接图解!
  15. 算法学习笔记17:堆、堆排序
  16. MT7688详细芯片资料下载  MT7688规格说明简介
  17. 同济大学王昊奋:知识图谱在多模态大数据时代的创新和实践 | 世界人工智能大会达观数据论坛
  18. 使用vite创建vue3项目
  19. 【訾博的日记本(2021版)】1月17日 周日 晴 开始写日记的原因 如何获得幸福
  20. 纪念华君 (转载)

热门文章

  1. env.development 和 .env.production环境文件 process.env属性
  2. maya2022个人indie正版购买测试
  3. 2020年杭州区块链产业白皮书-20210224.pdf.
  4. mysqldump导出insert语句
  5. 华为设备的交换机接口类型介绍及配置
  6. python中逗号的作用_Python中逗号作用的实例分析
  7. web项目031-----保存实名认证信息获取实名信息
  8. Python免费教育工具 Online Python Tutor
  9. Swagger常见注解@API、@ApiOperation、@ApiParam等
  10. 如何在eclipse中导入java工程文件和java源代码文件