git学习

前言

之前我一直没有使用版本控制工具的经历, 虽然自己有知道这个软件怎么用,用来干嘛,但是现在要在工作中使用,我的环境是公司使用gitlab, 我自己的私人的帐号是github,前面一篇讲到window中同时使用gitlab和github,接下来的环境就是我的windows电脑了

安装和配置

这里省略
(接下来都使用gitbash执行命令)
开始之前,设置一下shell运行环境的颜色配置,git会适当的显示不同的颜色:

1
git config --global color.ui true

然后还有一个图形化的界面给我们查看, 在gitbash中输入gitk会弹出一个界面

1
gitk

自己可以研究一下

1.第一部分:本机

这一部分全部是在本机上操作,先不涉及到远程仓库

创建本机仓库

1
2
3
mkdir webapp #创建文件夹webapp
cd webapp #进入webapp文件夹
git init #在当前目录创建一个仓库


这样之后我们就建立了一个版本库, 所有的关于这个仓库的信息都存储在.git文件夹里面,请不要手动修改这个文件夹,否则后果会很严重

理解仓库的结构(简单理解)


我们简单理解仓库的原理

1.工作区:

working dir, 也就是我们webapp目录(除去.git文件夹)我们能直接看到的文件夹

2.缓存区:(暂存区)

index,可以理解为一个缓存区域, 临时保存你的更改, 如果没有这个区域,那我们用起来是不是会很谨慎, 所以有了这个区域,我们可以大胆操作

3.HEAD

指向你最近一次的提交(), 记住是指向一个提交的节点(理解为一个链表, 指针可以快速移动指向某个节点)

添加文件到仓库

1
2
3
vim first.txt #编写一个文件
git add first.txt #将文件提交到缓存区
git commit -m "this is my first file" #将文件从缓存区提交到HEAD, 也就是当前的分支(分支的概念后面讲), -m后面的表示给提交的操作添加一个日志(一定要写)

查看状态

如果想知道当前的git操作的状态, 可以使用git status查看

1
2
3
vim second.txt
git add second.txt
git status


这里告诉我们有一个文件second.txt还没有被提交
接下来我们提交second.txt,再查看状态

OK, 现在没有需要提交的东西了

如果还要定位到某一个文件的具体状态,可以使用git diff命令

这里我修改了second.txt文件,然后git可以清楚的定位到我添加了哪一行数据

接下来我提交我的更改, 发下了吗, 没有add之前不能直接commit

回退

log

在操作之前我们先来学习一个查看提交日志的指令, 比如我前面提交了三次, 更改了一次

1
git log


从上到下是按照时间由近到远暂时给我们看, 介绍的很清楚我的三次提交
如果觉得太多了, 我们加一个参数

1
git log --pretty=oneline


这样我们每次的操作就是一行显示,前面的一串是我们的commit id, 每次commit都是唯一的,为啥要这么干了, 就是为了让我们回退的

回退到提交点

我们提交了second.txt, 然后发现我改错了,想把之前的更改会退掉,怎么办
前面介绍了commit id, 我们就用这个回退(就是在HEAD区把指针移动一下)

1
git reset --hard (commit id的前面几位就好了)


我们发现我的second.txt已经变回来了

回退到某一个操作

上面是回退到某一个提交点, 而有时候我想回退到某一个操作点
原理是一样的, 有一个操作的id, 这个id怎么查看,下面的命令,之后怎么做应该很清楚了

1
git reflog

管理修改

我们理解了仓库的结构之后, 就知道git是管理的我们的每一次操作,我现在修改second.txt, 然后git add,之后再修改second.txt, 最后git commit,结果会怎么样:

很显然我们第二次修改没有被提交, 为什么?因为我们的第二次修改并没有add到暂存区, 所以并没有提交第二次的更改
要提交,的话,再add一次commit就好了

撤销修改

有一天我在first.txt文件下加了一行 fuck fuck.但是觉得很爽,之后就后悔了, 趁着没有add到暂存区, 我使用下面的命令删除我添加的那一行

1
git checkout -- first.txt


那如果我已经add到暂存区, 然后再修改的了,怎么操作:
还是一样使用这个指令, 只不过是回到了add到暂存区后的状态

那如果我连暂存区的状态也不要了, 想回到最后一次commit的状态呢?

1
git reset HEAD readme.txt

git reset既可以回退版本,也可以把暂存区的修改回退到工作区,当我们用HEAD时, 表示最新的版本

场景演示

场景1:当你改乱了工作区某个文件的内容,想直接丢弃工作区的修改时,用命令git checkout -- file

场景2:当你不但改乱了工作区某个文件的内容,还添加到了暂存区时,想丢弃修改,分两步,第一步用命令git reset HEAD file,就回到了场景1,第二步按场景1操作。

场景3:已经提交了不合适的修改到版本库时,想要撤销本次提交,参考前面的[回退]一节,不过前提是没有推送到远程库

删除文件

我们删除一个文件, 直接rm或者右键删除了, 但是git还有记录

  1. 你就是想删除这个文件
    1
    2
    git rm third.txt
    git commit -m "remove third.txt"

现在文件已经从版本库中删除了

  1. 你删错了, 想恢复
    1
    git checkout -- third.txt

又用到checkout, 前面我们使用这个指令恢复了工作区的修改,这里也是一样.所以我们就知道了这个指令就是用HEAD中的版本来替换工作区的版本,无论工作区是删除还是修改,都是一键还原

后续

后面的远程操作我放到下一篇来说, 今天就到此为止了

参考

http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
http://www.bootcss.com/p/git-guide/