首先是学习导航,采用了良心up主 鱼皮 的视频团队开发神器 Git/GitHub 自学指南,几分钟掌握学习重点_哔哩哔哩_bilibili)
同时,推荐鱼皮的编程星球:学习路线 | 编程导航知识星球 (yupi.icu)
按照推荐,我们从工作树和索引【Git的基础】| 猴子都能懂的GIT入门 | 贝格乐(Backlog) 中按照基础部分学习。
如果只是按照"猴子"学习明显能发现对于每一个命令的解释不够清晰,有些甚至不做任何解释,这里推荐菜鸟教程。Git 基本操作 | 菜鸟教程 (runoob.com)
本篇博客,记录自己在基础篇学习过程中提炼的核心思想和扩展过的内容。
Git是什么
是为了配合多人开发同一项目的并发版本控制系统,这里的版本指的不是git的版本,而是描述“你所在的团队开发的某个程序的版本” , 能够提供开发过程中所有的版本记录,便于版本回溯和分析。
Git的原型
按照“猴子git”中的描述,可以将git通俗的理解为一个基于数据库的工具,本地数据库是我们自己的工作台,远程数据库则是交最终成果的地方。
能够做到区分本地数据库和远程数据库还不足够,还需要掌握从本地数据库上传内容到远程数据库的过程。
本地数据库创建
分为自己新建和复制远程数据库两种 ,下文会介绍如何自己新建数据库 。 创建数据库的过程也可以理解为将该项目交给git进行版本管理
修改记录的提交
若要把文件或目录的添加和变更保存到数据库,就需要进行提交。
执行提交后,数据库中会生成上次提交的状态与当前状态的差异记录(也被称为revision)。
注意提交信息的书写(便于他人的理解)
工作区(树)和暂存区(索引),版本库
工作树相当于是我们正在修改的地方,想要提交到数据库还需要经过一块中间区域--索引,“索引可以避免工作树中不必要的文件提交,还可以将文件修改内容的一部分加入索引区域并提交。”
但是我对于这样简单的解读不理解,于是从网上的这篇博客中补充了知识 : git--一文弄懂git的工作区、索引区、本地仓库、远程仓库以及add、commit、push三个操作 - at_today - 博客园 (cnblogs.com)
Git实操基础(git 和 gitbash)
我下载的git位置
运行gitbash , 发现我的版本号是 2.37.0 windows版本
初期设定
用户名与电子邮件会作为我们的提交信息,显示在更新历史中。 git config是一个工具,用于配置或读取工作环境变量,环境变量存放的位置分为系统所有用户和当前用户(指你电脑中的用户),/etc/gitconfig文件存放对所有用户适用的配置, /.gitconfig文件存放了当前用户的配置,他们分别在c:windowsc/System32/drivers中
和 c:/users/用户名下
问:访问这两个文件夹中的同名文件gitconfig文件对我们使用git的作用是什么? 对于系统的/当前用户的/当前项目的,这三个配置文件的加载顺序是怎样?
在查看答案之前先思考一番
Git配置文件与git config命令 - 渴望飞翔的xian鱼 - 博客园 (cnblogs.com)
该博客会介绍常见命令和配置文件中各部分含义。
能够通过菜鸟教程和上篇博客学会配置命令config、查看已配置部分的命令、获取指令帮助和理解配置文件含义,知道uer.name是作为提交信息的一部分即可。
查看+编辑,可以用vim编辑器,这是默认的用于编辑提交消息的编辑器
中文乱码问题
gitbash中只能输入Ascii码字符,中文不属于Ascii字符 我输入用户名时采用中文,在vscode中展示的 .gitconfig文件显示正常
但是“猴子”中提到了对中文文件名与中文字符作为提交信息时会出现的解决方案。(留心)
对于提交信息用中文写,可能会在未来产生的问题,解决方案如下: Git Bash 无法输入中文 - taadis - 博客园 (cnblogs.com)
提前进行设置:
git管理下的文件生命周期
在前文中我们已经知道了三个工作区域,现在要弄清楚他们之间存在着一个文件生命周期的循环
(66条消息) Git的3个工作目录和4种状态_JaneQinJ的博客-CSDN博客_git 工作目录
2.Git基础-仓库的获取方式与Git文件的状态变化周期(生命周期) - sandy.simple - 博客园 (cnblogs.com)
- Committed means that the data is safely stored in your local database.committed意味着数据被安全的存储在你的本地数据库中
- Modified means that you have changed the file but have not committed it to your database yet.modified意味着你已经改变了你的文件但是还没有把改变提交到你的数据库中
- Staged means that you have marked a modified file in its current version to go into your next commit snapshot.staged意味着对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。(个人理解, 就是修改的文件准备好要被提交(commit)了)
所有的文件都分为tracked 和 untracked 状态,例如,你从github上clone了一个项目,该项目中的原本所有文件都是tracked并且unmodified状态,现在你新建了一个,那么此时,这个新建文件就处于untracked状态,修改过后下一步是git add,此时该文件会被放入stage区,也就自然处于暂存状态了,再下一步commit状态,则是处于unmodified状态。
git工作流程
- 克隆git作为工作目录
- 在克隆的资源上添加或修改文件
- 如果别人修改了,你可以更新资源
- 在提交前查看修改
- 提交修改
- 修改完成后,如果发现错误,可以撤回提交并再次修改并提交
以上内容是学习目标,每一条都必须能够实操加理解。
下文git各工作区之间的操作将介绍上述相应命令
各工作区之间的操作
工作区建立区域
在项目文件夹中使用git init命令,隐藏文件夹中会看到.git文件夹,该文件夹中就是暂存区和版本库(存储各种版本的库)了
除去初始化设置外的git第一个命令: git init。后面不带参数时, .git目录是我们的的Git仓库,如果我们想要将git目录存放在当前文件夹中的某个特定目录中,则需要在当前目录下
git init <当前目录某个文件夹(不需要路径,文件名即可,因为你执行命令是在项目文件夹中)>
创建数据库采用的是 git init命令,选择一个我们的项目目录,在文件夹中选择 git bash,就能在当前目录下创建数据库(将该项目交给GIT管理),注意此时因为没有add 或 commmit,项目还未被跟踪。
工作区克隆项目
git clone操作:
git clone : 生成repo同名的默认仓库
git clone 克隆到指定目录
工作区提交到暂存区
1、git add命令 将指定文件提交到暂存区,意味着告诉git跟踪这几个文件的版本 ,提交时会遇到warning : CLF LF的换行问题,采用以下命令对用户gitconfig文件进行配置
如果使用git add命令报错:“does not have a commit checked out”说明是该文件夹下有隐藏文件,需要删掉,重交即可
git add 命令的作用是将文件交给git管理,在工作区中,git add搭配不同的命令,可以选择提交被跟踪的文件,也可以选择提交新添加的文件,也能自动判断哪些文件受到了修改和删除,哪些文件是新增的
2、撤销对工作区的修改 git checkout命令 : 会以最新的add 和 commit为快照,覆盖工作区对应文件,未commit时会以add为快照
查看仓库当前状态,显示变更
git status 命令
git status -s命令则会简化输出信息,更加易读
比较各区域间文件的差异
牢记Git的工作就是创建和保存项目的快照以及与之后的快照进行对比。
git diff 命令可以对比文件的不同,对比暂存区与工作区某文件的不同 注意与 git status区分, git diff能够具体看到改变了什么, git status只是对状态的描述
菜鸟教程中描述的不是很清晰,推荐看这个教程的git diff :git diff命令 - Git教程 (yiibai.com)
git diff <file> # 比较当前文件和暂存区文件差异
git diff git diff <id1><id1><id2> # 比较两次提交之间的差异
git diff <branch1> <branch2># 在两个分支之间比较
git diff --staged # 比较暂存区和版本库差异
git diff --cached # 比较暂存区和版本库差异
git diff --stat # 仅仅比较统计信息
暂存区提交到版本库
git commit命令 ,在commit命令之前必须先 add ,即让GIT知道这个文件
可选参数:
- -m 添加提交信息
- -a 所有tracked ,有改变的文件
工作区版本回退
问题:
- 回退采用的是暂存区的还是版本库的还是最新的
- 可以指定分支进行回退吗?因为不同分支代表不同的版本路线
- 怎么找到下一个节点,因为HEAD^ 和HEAD~1是指的上一个节点?依靠哈希值?哈希值又如何找
分支管理
分支指的是暂存区还是版本库区?
查看历史
git log 和git status的区别?