GIT王炸记录
经过连续两次王炸,决定好好学习一下git的使用说明。
一、分布式&集中式
GIT(Git)和 SVN(Subversion)是两种常见的版本控制系统,它们的主要区别在于分布式和集中式的架构。
GIT 的分布式特性:
本地仓库:每个开发者在自己的
本地环境中都有一个完整的代码仓库。他们可以在本地进行提交、修改和版本管理,而不需要依赖中央服务器。分支和合并:GIT 强大的
分支和合并功能使得多个开发者可以同时工作在不同的分支上,并轻松地合并他们的更改。离线工作:由于每个开发者都有自己的本地仓库,因此可以在没有网络连接的情况下进行工作,并在稍后与其他开发者的仓库进行同步。
分布式协作:GIT 鼓励分布式的协作模式,每个开发者的仓库都可以作为版本控制的中心,方便与其他开发者共享和交流代码。
SVN 的集中式特性:
中央服务器:
所有的代码和版本信息都存储在一个中央服务器上。开发者通过与中央服务器进行交互来提交、获取和更新代码。锁定和 addWrite:SVN 通常采用锁定-修改-解锁的模式,以确保在
同一时间只有一个开发者可以修改同一部分的代码。依赖中央服务器:开发者需要连接到中央服务器才能进行操作,因此在没有网络连接或中央服务器不可用时,工作会受到限制。
集中式管理:SVN 的权限和版本控制由中央服务器集中管理,通常有一个明确的管理员角色。
一句话总结:GIT中每个开发者都是爹,SVN只有一个爹。
二、安装配置
官方进行下载。
一般情况下,会有选项自动添加到系统环境,这个步骤省略。安装完毕后,可通过如下命令进行配置信息。
1 | |
这两句配置是为了标识自己的身份,让其他人知道是谁提交的代码,git规定用名字和邮箱来标识。提交时,信息显示如下:
其中设置的配置可通过如下命令查看。
1 | |
其中内容也可以通过本地文件查看,文件.gitconfig
三、仓库
仓库分有本地仓库和远程仓库,本地仓库就是通过git clone git_url下来的内容,远程仓库就是git_url;其中本地仓库可以有无数个,但远程仓库只能有一个(因为所有本地仓库后续的提交都是提交到远程仓库中)。
1、创建本地仓库
创建一个空文件夹,然后右键选择git bash,输入git init进行仓库初始化,此时就已经得到了一个创建好的本地仓库。
2、创建远程仓库
首先在github上新创建一个仓库。
随后出现提示依次操作即可。
git init:当前目录变成Git可以管理的仓库,这个在1中已经操作。
git add:把文件添加到暂存区。
git commit:把暂存区的内容提交到版本库。
git branch:创建分支,默认创建仓库是没有分支的。
git remote:将本地仓库关联(跟踪)到远程仓库,不然下一步push的时候不知道要给你push到哪;origin是远程仓库的名称,git的默认,可以理解为给远程仓库起了个别名。
git push:把版本库内容推送到远程仓库中。
git push -u origin main和git push区别是,首次提交使用前者后,git会默认保存凭证,后续直接git push即可。
四、工作区、暂存区、版本库
在 Git 版本控制系统中,工作区、暂存区和版本库是三个不同的概念,它们分别具有以下特点和区别:
工作区(Working Directory):这是你实际进行编辑和操作的文件夹。你在本地计算机上的文件系统中直接修改文件的地方。工作区中的文件可以是未跟踪的(即不在 Git 的版本控制下)或已跟踪的(已添加到 Git 仓库中)。
暂存区(Stage):也称为索引区,一般存放在 .git 目录下的 index 文件(
.git/index)中,所以我们把暂存区有时也叫作索引(index)。它是介于工作区和版本库之间的一个临时区域。当你在工作区中对文件进行修改后,使用git add命令将修改的文件添加到暂存区。暂存区中的文件表示你已经准备好要提交到版本库的更改。版本库(Repository):也就是
.git目录。版本库包含了所有提交的信息,包括文件的更改、提交消息等。通过使用git commit命令,将暂存区中的更改提交到版本库中,形成一个新的版本。
图中左侧为工作区,右侧为版本库。在版本库中标记为
index的区域是暂存区(stage/index),标记为master的是master分支所代表的目录树。图中我们可以看出此时
HEAD实际是指向master分支的一个游标。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。(打开HEAD文件,可以看到实际上指向的位置)图中的
objects标识的区域为Git的对象库,实际位于.git/objects目录下,里面包含了创建的各种对象及内容。当对工作区修改(或新增)的文件执行
git add命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
1、实验:工作区→暂存区→版本库流程
回到上边初始化的test_git本地仓库,手动创建一个ReadME.md文件,然后执行下列命令:
1 | |
然后进入.git/objects目录下发现多了一个文件夹e6。
因为ReadME.md通过add命令已经被添加到暂存区,进入该文件夹发现存在一个文件(对象被创建)。
通过上边的概念可知,暂存区实际上为.git/index文件,因此打开该文件,发现为乱码。
但实际发现有存在刚刚添加的文件名,因此以二进制形式打开,发现内容刚好对应上。
并且使用git status也能查看暂存区的内容。
接着使用如下命令进行将暂存区内容推送到版本库。
1 | |
提示已经提交成功,在使用git status查看,发现已经没有内容了。
使用git log查看推送日志,显示刚刚的commit,但此时还没将内容推送到远程仓库
五、HEAD
实际就是指向最新的提交。
HEAD:表示当前版本
HEAD^:上一个版本
HEAD^^:上上一个版本
HEAD^^^:上上上一个版本
以此类推 。
可以使用 ~数字表示
HEAD~0:表示当前版本
HEAD~1:上一个版本
HEAD^2:上上一个版本
HEAD^3:上上上一个版本
以此类推 。
六、reset重置
git reset:用于回退版本,可以指定退回某一次提交的版本。
假设当前状态:
1、mixed
默认,可以不用带该参数,用于重置暂存区的文件与指定的回退的版本的提交(commit)保持一致,工作区文件内容保持不变。
1 | |
2、soft
参数用于回退到某个版本,暂存区不会重置,工作区也不会改,版本回退(git log 版本截止到回退的版本)。
1 | |
3、hard
参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到指定的回退版本,并删除之前的所有信息提交。
1 | |
避雷
1、sync fork
这个玩意的意思是把你自己fork的项目与官方最新的提交合并,不要乱搞!!!!!
接着让你选discard changes这个的意思就是是否要丢弃你自己仓库的修改,别点!!!!。这玩意性质就是个删库跑路。。。。
参考
https://www.bilibili.com/video/BV13Y4y1v7LC/?spm_id_from=333.999.0.0