Git的学习
首先我特别不满意b站视频内的弹幕所谓自律,你学习了一点git也算自律?这些git基础指令说实话都太简单了,好像还以为自己学了很多什么很难的东西一样。有些人问题提的也没标准,遇到一点问题就开始不耐烦了。
我的整个过程
先到b站一些很基础保姆的教程学习了一点东西(比如狂神的git简单教程,不过前面六节课感觉都可以摸鱼了)这些简单的教程会强调让你别太砸破砂锅问到底暂存区,本地仓库和远程仓库的区别,着重强调git add commit push clone pull 这几条在这三个仓库之间的这六条命令。
然后试着自己git上传了一次文件到github(期间有百度帮助)自己实验有助于自己的理解和学习,比只看不动手强多了。
再回来找一些详细的教程细细的看,把知识框架搭起来,我主要是两条路
1.看b站的其他详细教程,或者廖雪峰老师的git全集
2.去菜鸟教程查看完整的git已经分类好的命令合集,归纳好大部分命令的主要作用和出处。
git的难点在于理解暂存区本地仓库,命令add commit等概念之间的关系和分支的各种情况,以及在IEDA之中的实战
1.理解一些git基本
首先要知道git init和git的config,并提前设置好config,方便之后的github上传远程仓库。以及学习自定义一些简便的命令方便自己工作
2.了解一些基本的linux命令
在git bash窗口,有些命令是不需要git开头的,直接使用。这些大部分为linux的基本命令,需要知道了解。
1.rm -rf xxx
rm代表删除文件,-r :递归的删除该目录下的文件夹和文件,及子目录下的文件夹和文件。-f : 忽略不存在的文件,xxx代表文件名
我们经常使用这一条命令来删除初始化(git init)之后所创建的仓库,即:
1 | rm -rf .git |
它会默认把.git文件夹本身和,git文件夹以下的全部文件都一起删除,达到一个取消git init初始化的效果
.git文件夹内是git的版本库,包括了暂存区和本地仓库。.git文件夹以外的这个目录下都是工作区
2.ls(ll)和ls -a
ls是显示该目录下的文件,ll同理。ls -a代表显示全部文件
3.touch
在当前路径下创建一个新的文件。
4.如何复制粘贴
在git bash中我们可以发现我们经常使用的ctrl+c/ctrl+v不好用了,我们直接选中一段文字就是复制了,当按下鼠标滚轮的时候就可以直接粘贴
4.理解git暂存区,本地仓库,远程仓库和add/commit/push
这是菜鸟教程内的介绍
Head指向的分支是现在工作的分支。而在解释里把这个分支名字称之为master,实际上分支名可以自己修改,只是默认把master这个名字作为所有head指向的分支的代指。
.git整一个作为git的版本库,所有的git数据都在这里面,不会在外面对工作区干扰。
在index也就是暂存区内存在一个目录树,当使用 git add命令的时候会对指定(或者使用add .命令全部文件)进行一个追踪,查看工作区的这些文件对于暂存区的目录树里面有什么样的变化 (不只是修改,而是也包括新增和删除文件,这些都算是文件的变化,下文同),同时把暂存区的目录树更新,这时候面对的就是新的目录树了。
例如:假设是一个刚初始化init的文件夹,内部有一些文件。这时候使用
1 | git add . |
因为暂存区内部的目录树是空的,对比目录树来看全部文件都是新增的,就会追踪文件夹内所有的文件。同时把这些变化的文件记录到暂存区的目录树里面。那么当下一次文件有变化时,只会记录和新的暂存区目录树变化不同的文件,因为此时目录树已经更新。
当执行git commit后,head所指向分支的目录树会对比和暂存区目录树的区别,上传对于master目录有变化的文件到对象库object,文件不变化的不上传。
同时暂存区的目录树写到对象库(object),此时head指向分支的目录树就是提交时暂存区的目录树。两者变为一样***(但不是任何时候都一样!!!)***。同时暂存区的目录树不变化,add之后是啥样就还是什么样。
简单理解:git add是把指定文件变化的记录(自上次提交或者上次add到现在的变化)到暂存区。commit是把暂存区所记录的所有变化文件提交到仓库(平时理解用简单理解即可)
个人思考:暂存区也许是作为一个保险而存在,比直接提交安全。
记得不要用git commit直接提交,提交是一定需要写信息的,这些信息可以随便写但程序要求一定有(应该是为了区分个个版本之间)直接提交会用via编辑器编辑,我可以说巨难用。提交信息应该
1 | git commit -m "信息" |
push是推送到例如github这些远程仓库,但注意,本地仓库不会消失,它只是把本地仓库的内容相当于复制到了远程仓库上。
5.git命令主要作用的分类
git命令基本上是各司其职,专业对口。知道这个命令的主要作用是什么就可以了,后缀都是锦上添花,这样可以让你很快掌握命令。一些需要详细讲解的命令我会下文继续补充。这里是git一些命令的主要作用
提交和修改
命令 | 说明 |
---|---|
git add | 添加文件到暂存区 |
git status | 查看仓库当前的状态,显示有变更的文件。 |
git diff | 比较文件的不同,即暂存区和工作区的差异。 |
git commit | 提交暂存区到本地仓库。 |
git reset | 回退版本。 |
git rm | 将文件从暂存区和工作区中删除。 |
git mv | 移动或重命名工作区文件。 |
提交日志
命令 | 说明 |
---|---|
git log | 查看历史提交记录 |
git blame <file> | 以列表形式查看指定文件的历史修改记录 |
远程操作
命令 | 说明 |
---|---|
git remote | 远程仓库操作 |
git fetch | 从远程获取代码库 |
git pull | 下载远程代码并合并 |
git push | 上传远程代码并合并 |
分支
命令 | 说明 |
---|---|
git branch | 查看和管理分支 |
git cheakout | 切换分支或者恢复工作树文件以及其他操作 |
git switch | 新版的切换分支和创建分支工具,比cheakout职能明确 |
6.git status
git status实际上是比对工作区和暂存区目录树之间的文件变化。
git status内分析信息会把文件变化(文件内容修改,添加文件和删除文件)三者分开,而我在总结的时候会习惯把三者合并起来讲。我个人觉得三者都可以归结为文件的变化。
Untracked files:未跟踪文件,说明这个工作区的文件对于暂存区目录树来说是新的,是之前没有的,也就是未跟踪的文件,换句话说就是新增的文件。
modified:修改过的文件。即暂存区内目录树有这个文件,但文件内的内容对于目录树来说有变化。
deleted:即之前暂存区目录树有这个文件,但status检查时工作区已删除这个文件。
下面详细举一个使用git status的例子
on branch master说明现在head指向的是分支master
no commits yet 是说直到目前位置都没有提交一次,当有提交记录后此信息不会出现。
changes to be committed是说即将被提交,实际上就是已经被加入暂存区内。括号内是说使用这条命令可以把文件移出暂存区
changes not staged for commit是说以下操作还没有被加入暂存区。括号内是第一个是教你如何把这些修改加入暂存区,第二个是放弃对于暂存区目录树的变化,也就是让文件回到和暂存区同状态***(慎用)***
实际上,git status给的信息很简单易懂,只要会英语就能够明白。括号内的内容可以不用理会,它只作为一个附赠的PS提示。但给的内容实在是太多,我只想要最关键的一部分。那就:
1 | git status -s |
-s代表short
前面的U、M、D、A等字母即前面的未跟踪,修改,删除,加入暂存区(add)英文单词的首字母。红色代表这些文件变化未加入暂存区,绿色代表已经记录进暂存区。
7.git diff命令
git diff 命令比较文件的不同,即比较文件在暂存区和工作区的差异。显示已写入暂存区和已经被修改但尚未写入暂存区文件的区别。
- 查看尚未缓存的改动:git diff(在diff后可加上文件名已查看指定文件改动,否则查看默认工作区全部,下同)
- 查看已缓存的改动: **git diff --cached /git diff --stage **
- 查看已缓存的与未缓存的所有改动:git diff HEAD
- 显示摘要而非整个 diff:git diff --stat