廖雪峰的GIT教程的笔记

学习目标:

新公司需要Git进行版本管理学习加记录;首先要安装Git这个百度这里就不讲;


学习内容:

一、建立仓库

仓库就是保存你上传文件的地方,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻可以"还原";要存的东西就得放到仓库里;

本地版:

1.新建一个文件夹

先在本地电脑建一个文件夹作为仓库;打开Git Base软件;但是可以看到 Git Base一开始的操作地址是默认的,但是接下来的操作都需要在这个文件夹的地址里操作;这时候就有两种方法把Git Base的操作地址改成新建的仓库文件夹;

1.因为Git最开始是为了Linux的所以可以直接使用Linux的cd命名去到指定文件夹

可以看到就到了新建的文件夹了;

2.直接在新建文件夹鼠标右键,有一个 open Git Base Here,点击这个就会在当前文件夹打开Git Base

2. Git init

这个语句就是设置当前文件夹为仓库;Git init回车之后会自动出现Initialized empty Git repository in D:/GitTest1/.git/提示ok了

二、 添加到库

1.git add

在文件夹里随便创建两个文件

因为add这个指令可以添加多个文件,回车之后没有回应;

2.git commit -m"xxx"

上面的add还只是上传到暂存区,这个就是把暂存区里的都上传到库里;xxx就是本次上传写的注释最好写清楚这次上传的文件都更新了什么;回车之后会返回

master (root-commit) e2d4fa2 第一次添加了两个文件

2 files changed, 2 insertions(+)

create mode 100644 test.txt

create mode 100644 test1.txt

返回内容解析:2 file changed:2个文件被改动(我们新添加的2个文件);2 insertions:插入了两行内容(两个文件各一行总共两行)。

3. git status

可以获取当前仓库的状态,比如这时候我们修改了文件但是没有提交add;就可以看到提醒有一个文件改了但是没有上传,文件名字就是红色;

如果仓库里干干净净

如果刚把文件ADD到暂存区,暂存区里有东西,文件名字就是绿色;

4. git diff

使用git status 可以知道改了没有上传但是不能知道详细的改了什么,这时候就需要diff(difference的缩写)指令;

可以看到加了两个two;如果是删除的话会是-开头;

单diff对比的是工作区和暂存区的版本;如果要看刚改的工作区文件或者是暂存区的文件和本地仓库的做对比呢;在Git中使用大写的HEAD来表示当前本地仓库的版本;使用可以使用git diff HEAD来对比;

还有一个比较使用的就是比较两个提交过的版本的区别:git diff 版本号1 版本号2

对比:两个历史提交版本之间的差异

复制代码
# 比较两次提交之间所有改动
git diff 68c6698 3ad4539

三、版本回退

1、工作区、暂存区、本地仓库

在回退之前要明白三个使用到的区域;

1.工作区

工作区是你写代码的地方,在这个地方写完之后Git只知道你改了东西但是不会帮你记录,这个代码只保存在你本地;

2.暂存区

这个是Add之后就会先存在暂存区;

3.本地仓库

在你使用Commit把暂存区的文件提交之后就是提交到这里

2.git log

获取提交的所有记录

这样太长了可以使用 Git log --oneline来获取短的日志信息;这些log日志每次提交记录的这一大串比如e2d4fa260b2d6ce6a541e1aabad0ad0ad77a77c8;这就是版本号,后面要想回退到某个版本就需要这个版本号;

3.git show

这个就是展示当前仓库的文件,可以使用HEAD查看当前版本还有注释信息文件内容++就是这一次新加了什么内容,HEAD^查看上一个版本以此类推

4.git reset

首先要知道在git中用大写的HEAD来表示仓库当前的版本,要是是一个版本就是HEAD^,再上一个就是HEAD^^,再往前比如说往前100个,要是角标就太多了所以是HEAD~100;

回退有三种方式:

1.--soft

这种回退是把当前仓库里的版本回退;工作区和暂存区的不变;而且会把回退的版本重新返回到暂存区里;就是如果你是commit的备注没写对的话就可以使用这个重新把文件回退到暂存区再使用commit重新写备注

可以看到使用之后再去查看状态就发现文件回到暂存区里了;

2.--mixed

这个回退是除了工作区其他的都回退

可以看到会之后再查看状态就是只改了本地文件没有Add有没有commit的状态;这个有简写状态也就是这个是系统默认的

git reset --mixed HEAD = git reset HEAD;

还可以指定文件回退git reset HEAD test.txt

这个适合就是写错了某个文件并且上传到了暂存区或者上传到了仓库就可以指定文件回退到工作区

3.--hard

这个回退就是彻底回退了包括本地文件都会一起回退


5 git reflog

回退使用HEAD来回退的时候要知道具体的第几次的版本,有的时候不太记得了这时候就可以直接使用要回退的版本号来回退;但是你也不知道之前回退了的版本号了啊;这时候你可能想用log来查看log日志,但是回退之后的log也会一起删除;就只剩下最开始的两次提交了

这时候就要使用reflog,reflog可以查到本地电脑上90天的操作

这时候就可以配合reset回退删掉的版本

log由于删除前看看要回退到哪个版本,reflog适合回退错了要回退这个回退;

6.git restore 撤销 / 恢复文件专用命令

这个是专门用来操作 暂存区和本地文件的;

1.git restore 文件名

用于回退没有上传到暂存区的本地文件;

使用回退工作区之后

2.git restore --staged 文件

这个是把文件从暂存区退回工作区(取消暂存),可以用于rm删除之后恢复

3.git restore --source=版本号 文件

从历史提交恢复文件尤其是恢复具体一个文件的时候就用这个

四 删除

1 git rm

这个就是删除本地文件,而且会把删除这个文件删除到暂存区

这时候还可以通过 restore恢复,但是恢复的是之前add或者commit了的版本;

要先$ git restore --staged test.txt来把删除之后上传到暂存区取消,之后再restore来回退本地操作;

如果rm删除之后还commit了这时候就只能从历史版本里恢复就要先reflog知道版本号再用restore;


五、远程仓库

远程仓库可以是公司的,还可以是自己在github上创建自己来测试学习,下面的就全是在github上测试的

5.1 git push

这是把本地仓库的推送到远程仓库上,origin的话是默认代表远程仓库的代号这个是可以自己再去重新设置的;

复制代码
把本地仓库里所有的东西都推送上去
git push -u origin master

使用上面这个指令不只是会全部推送还会把本地的master和远程仓库里的master联系起来,如果不联系起来的话push会报错,要重新联系

复制代码
之后再改了推送具体的分支
$ git push origin master
git push origin dev

5.2 git clone 【地址】

这个是从远程仓库克隆到本地

复制代码
$ git clone git@github.com:michaelliao/gitskills.git

5.3 分支

分支就相当于从某一个时间节点分裂出一个平行宇宙,两个平行宇宙拥有一模一样的历史、一模一样的代码;在公司就是有一个主的master分支,里面负责放已经稳定的版本,其他人要改或者添加新东西就先clone主的master分支,再在自己电脑上创建一个自己的工作dev分支,这样改东西哪怕是改错了或者该丢了都不影响主的master分支,自己测试完了觉得ok了再把dev分支合并到主分支上这样dev改的内容就到主分支上了;

5.3.1 分支图像化

在前面可以知道commit之后就是添加了一个时间节点,HEAD就是最新版本,其实HEAD指向的不是当前分支的最新版本,而是指向当前分支,由分支指针来指向最新版本;

再创建一个分支dev,HEAD就是指向最新这个分支dev指针

这时候在当前分支comiit一个新版本;就是dev指针往前

这时候要合并了,在git里就是把master指针指向当前最新的操作,HEAD也指向master指针就好了,这就是为什么在合并指针之后如果不删除的话dev分支会一直保持当前状态;

删掉的话就是删掉dev指针

5.3.2 git switch -c

创建分支的话旧版本是git checkout;最新的是git switch -c name;可以看到创建分支之后()里面就是当前分支名字;注意基于一个分支创造另外一个分支的话,要在第一个分支下创造

5.3.3 git switch name

切换分支,要去哪个分支就填哪个分支的名字;

5.3.4 git branch

这个是查看当前有哪些分支,*name就是代表当前是哪个分支

5.3. 5分支注意的问题

可以看到在dev分支下改了文件,注意要是分支上改了文件但是没有commit再切换到主分支,也会一起带过去,现在就是在dev上改的;可以看到切换到master后一起带过去了文件改了没commit;


5.3.6 git merge

在dev分支修改了文件可以看到在master分支上并没有还是在修改前的版本;这时候就需要合并

注意要把a分支合并到b分支上就得先切换到b分支,

注意上面的合并是快速合并;

5.3.7 git restore -d name

不需要的分支可以通过这个删除

5.3.8 合并冲突

如果在两个分支对同一个文件都有修改提交这时候再合并就会报错了;

这时候在报错的文件里会自动把不一样的地方画出来;<<<<<HEAD的部分就是当前分支的,======就是分界线,>>>>>dev就是另外一个分支的;可以看出两个对比前三行都一样是第四行开始不一样了master分支的是three,working,change;dev的change,working;这时候就看你要哪个版本的了保留需要的版本,把标志和不需要的都删掉

比如要master的就

改完之后就按照流程add再commit

六、git stash

临时去别的分枝干活,现在手头这个分支的活又没干完,没办法提交;

比如working到一半要临时去主分支帮忙改bug;

可以看到当前分支的还没干完所以没有提交;

  1. git stash save "xxx"

可以添加一些注释方便等一下回来知道现在改到哪里了;这时候再看工作区就是干净的了可以切换到别的分支干活了

之后就可以回到主分支再开个新分支去修改bug了,还可以使用ls来看看分支有哪些文件

修改提交好了就回到主分支把修改bug分支上改好的合并;

  1. git stash pop

之后再回到之前工作的分支;但是之前的工作区已经被储存起来了,这时候就需要pop来把之前存的拿出来;

可以看到还是之前工作的内容

3.git stash apply

恢复储存出来pop还可以使用apply;pop是恢复之后会把储存记录删掉;apply不会;

apply和pop都可以恢复指定的储存记录;这个需要git stash list来看有多少储存记录

git stash apply stash@{1}

git stash pop stash@{1}

一些疑问

1.指令为什么有些是-有些是--?

-的后面跟着的是一个字母一些简写,--后面跟着的完整的单词

git commit -m"";

git reset --hard ;


学习时间:

提示:这里可以添加计划学习的时间

例如:

  • 周一至周五晚上 7 点---晚上9点
  • 周六上午 9 点-上午 11 点
  • 周日下午 3 点-下午 6 点

学习产出:

提示:这里统计学习计划的总量

例如:

  • 技术笔记 2 遍
  • CSDN 技术博客 3 篇
  • 习的 vlog 视频 1 个