git与github——1,简介、安装及设置账号、创建版本库及提交文件、常用命令汇总、git的时光穿梭机

博主之前有些svn的学习笔记,与svn相对,git是一个更为流行的版本管理工具。

一、git是什么?

1,git与github

Git是目前世界上最先进的分布式版本控制系统(没有之一)。

Linus在1991年创建了开源的Linux,然后全世界有n多人提交代码给Linus,Linus是如何管理这些代码?事实是,在2002年以前,世界各地的志愿者把源代码文件通过diff的方式发给Linus,然后由Linus本人通过手工方式合并代码!那么他为什么不用cvs、svn之类的版本管理工具?因为速度慢,而且要联网才能使用!

之后Linus采用了一段时间商业的版本控制系统BitKeeper,但是搞Linux的毕竟牛人众多,有许多黑客尝试破解这个版本管理工具,BitMover知道后,怒了!然后收回了Linux免费使用BitKeeper的权利。

但是黑客怎么会受制于人!Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!一个月之内,Linux系统的源码已经由Git管理了!所以,对于黑客(想成为高级工程师的人)不是自己去适应机器,而是让机器适应你!没有软件,自己弄一个。

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

2,分布式与集中式

分布式与集中式的区别在于其管理方式,集中式:

分布式:

看出了区别吗,分布式每一个节点都可以做仓库,而集中式则只有服务器可以做仓库!确定和优点是不是显而易见?

包括微软、IBM他们也有开发版本管理工具,但是呢,效率低而且不好用!所以开源软件真是又好用又不用花费,开源才是提升技术的最好途径!

二、安装、设置账号

windows安装git,从官网下载git程序,安装好之后就有git bash

进入git bash后修改用户及email:

$ git config --global user.name "Your Name"
$ git config --global user.email [email protected]

因为git是分布式版本控制系统,所以每台机器需要自保家门。注意git config命令的--global参数,用了这个参数,表示你这台机器上所有的Git仓库都会使用这个配置,当然也可以针对某个仓库设置username和email。

三、创建版本库及提交文件

1,创建版本库

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

创建一个test1仓库:

显示创建一个test1的目录,然后init成一个仓库。在这个目录下有一个.git目录:

这个.git目录是用来跟踪版本的,没事别动它。

2,添加文件到版本库

当把文件添加到版本库时,有几个注意事项:

(1)Microsoft的Word格式是二进制格式,因此,版本控制系统是没法跟踪Word文件的改动的,前面我们举的例子只是为了演示,如果要真正使用版本控制系统,就要以纯文本方式编写文件。另外纯文本建议采用utf-8,既没有冲突,又被所有平台所支持。(嘿嘿,博主有篇博客也记了下各种编码格式间的区别,可以看看什么utf-8、utf-16之类的区别,最好用的就是utf-8咯);

(2)Windows下编辑文本特别注意一点:千万不要使用Windows自带的记事本编辑任何文本文件!原因是Microsoft开发记事本的团队使用了一个非常弱智的行为来保存UTF-8编码的文件,他们自作聪明地在每个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到很多不可思议的问题。所以嘛,可以用notepad、ue、sublime之类的编辑器。

我们编写一个readme.txt文件:

在sublime中打开并输入:

Git is a version control system.
Git is free software.

设置以utf-8方式打开。

把一个文件放入git仓库分两步:

(1)git add read

$ git add readme.txt

没有任何显示!这就是添加成功的意思

(2)git commit

git commit -m "a readme file"

-m 后面跟的就是提交说明的咯。

四,常用命令汇总

会添加文件了之后,我们先来大概看一下可以使用的命令如下,有个概念即可:

五、git的时光穿梭机

修改readme文件:

Git is a distributed version control system.
Git is free software.

输入:git status

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

想看一下具体修改了哪些地方:

git diff readme.txt

按照学习linux的方式,博主还是很喜欢一行一行的看

diff --git a/readme.txt b/readme.txt
第一部分表示使用的git格式的diff

index d8036c1..013b5bc 100644

第二部分表示两个版本的git哈希值(index区域的d8036c1对象,与工作目录区域的013b5bc对象进行比较),最后的六位数字是对象的模式(普通文件,644权限)。

--- a/readme.txt
+++ b/readme.txt

第三部分表示进行比较的两个文件,"---"表示变动前的版本,"+++"表示变动后的版本。

@@ -1,2 +1,2 @@

前面的"-1,2"分成三个部分:减号表示第一个文件(即index区域的d29ab50对象),"1"表示第1行,"2"表示连续2行。合在一起,就表示下面是第一个文件从第1行开始的连续3行。同样的,"1,2"表示变动后,成为第二个文件从第1行开始的连续2行。(我理解的-指变动前,+指变动后)

-Git is a version control system.
+Git is a distributed version control system.
 Git is free software.
\ No newline at end of file

最后一部分是具体的差异部分

知道做出了什么修改之后,就可以放心地git add了。

执行完git add之后再执行git status:

git status告诉我们,将要被提交的修改包括readme.txt

然后提交:

git commit -m 'my test'

再调用git status:

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

1,版本回退

再来修改一次readme:

Git is a distributed version control system.
Git is free software distributed under the GPL.

add、commit。

至此为止我们修改了两次,有三个版本的readme。我们要如何查看这些记录呢?

git log 查看git历史记录:

git log命令显示从最近到最远的提交日志,我们可以看到3次提交,最近的一次是append GPL,上一次是add distributed,最早的一次是wrote a readme file。但是这些信息是不是太多了,才一个文件的修改就这么多记录。

我们可以采用--pretty=oneline参数来减少输出信息

信息就简介了很多,但是也能看到各个历史操作。也可以改成:git log --pretty=oneline readme.txt查看单个文件。

注意一下这一串东西:be459e9f3da1583d15c2c0f85effa8fa768114c1和svn提交不太一样,svn的commit id是1、2、3之类的,git的commit id 是一个SHA1计算出来的一个非常大的数字,用十六进制表示。为啥git的commit id如此复杂?因为git是一个分布式版本管理工具,如果采用1、2、3作为commit id,那肯定很容易发生冲突。

好了,现在我想把版本回退到 my test,要怎么做?使用git reset 命令!

git reset --hard HEAD^

这样就会退了一个版本:

这下麻烦了,要怎么回到 append GL?

$ git reset --hard be459
HEAD is now at be459e9 append GL

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

git的版本回退速度非常快,因为Git在内部有个指向当前版本的HEAD指针,当你回退版本的时候,Git仅仅是把HEAD从指向append GPL

回到刚刚回退到GL的代码,如果我不知道commit id,肿么办!我要怎么回到最初:

Git提供了一个命令git reflog用来记录你的每一次命令:

be459e9 (HEAD -> master) HEAD@{2}: commit: append GL
所以找到了append GL的commit id为:be459e9

2,工作区和暂存区

工作区就是你在电脑里能看到的目录;工作区里有一个.git,这个不算工作区,而是git的版本库。

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

前面把文件加入到git仓库的两步,第一步是用git add把文件添加进去,实际上就是把文件修改添加到暂存区;第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支。可以理解成,先把需要提交的内容放在暂存区,然后通过commit提交所有内容。Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。

再来加深一下对缓存区的认识。

修改readme:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.

新建一个文件LICENSE

调用git status :

Git非常清楚地告诉我们,readme.txt被修改了,而LICENSE还从来没有被添加过,所以它的状态是Untracked

使用两次命令git add,把readme.txtLICENSE都添加后,用git status再查看一下:

3,管理修改

为什么git比其他版本管理工具更优秀?

因为Git跟踪并管理的是修改,而非文件。为什么说git跟踪的事修改?接下来我们来做个试验证明。首先将三行的readme增加一行:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

然后添加:

然后,再修改readme

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git has a mutable index called stage.
Git tracks changes of files.

此时先提交再git status查看git 状态:

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

提交之后,我们用git diff HEAD -- readme.txt 查看工作区和版本库里面最新版本

可见,第二次修改是没有提交的,还是4行!

4,撤销修改

承上例,git checkout -- file可以丢弃工作区的修改

5 line的修改是没有上传到缓存区此时我使用$ git checkout -- readme.txt

则有如下效果:

它回到了4行!它回到的是暂存区的状态还是提交到版本库的状态?

命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:

一种是readme.txt自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;

一种是readme.txt已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。

在这个示例中,它是回到了暂存区的状态。

实际上这个checkout回到的是最近的add或commit状态。

如果我add了之后,想回到没有add之前呢?目前readme有四行数据:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git tracks changes of files.

加一行,然后add:

Git is a distributed version control system.
Git is free software distributed under the GPL.
Git has a mutable index called stage.
Git has a mutable index called stage.
Git tracks changes of files.

此时要采用git reset HEAD <file> 命令,可以把暂存区的修改撤销掉(unstage),重新放回工作区:

git reset HEAD readme.txt

为什么文件里还是由5行?!

因为这一步是清理了缓存区,接下来,还是要通过checkout修改

先git status看下状态

如果是add的话,这里是绿色的,说明取消了add。

$ git checkout -- readme.txt

这样就可以了!

5,删除文件

首先添加一个 test.txt:

之后我们删除掉这个文件:

rm test.txt

工作区确实没有了

查看git 状态:

缓存区没有相应修改,因此需要用命令git rm删掉,并且git commit

查看一下git 状态:

标绿说明,缓存区已进行了修改。

如果是误删,但是缓存区里还有,可以通过git --checkout test.txt 进行恢复。

参考:廖雪峰的博客https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000/0013745374151782eb658c5a5ca454eaa451661275886c6000

猜你喜欢

转载自blog.csdn.net/qq_22059611/article/details/83210702