赞
踩
win环境下,安装vscode自动安装git。
linux环境下
sudo apt install git
我自己使用的是Ubuntu系统,有可视化界面毕竟方便一些。
在VS code中打开文件夹(Ctrl+O),实际上就是打开一个项目工作区,VS code的工作区概念与Git的工作区概念基本一致,都是指当前项目文件夹里的整套源代码。
如果项目文件夹里没有Git存储库,这时打开源代码管理(Ctrl+shift+G),可以直接单击“初始化存储库”按钮,初始化一个Git本地版本库
或者也可以在命令行中键入命令 git init来初始化Git本地版本库
上述两种初始化Git本地版本库,实际上都是在项目根目录下创建了一个.git文件夹
Git的三个区+一个远程仓库
在平时写完代码后执行git add 就是将变更的内容从工作空间提交到暂存区,git commit就是将暂存区的内容提交到本地代码库里,git push 就是将本地代码库的变更提交到远程仓库,这时其他人就能通过pull 将你的变更下载到工作空间。
git 分布式的一个重要体现是 git 在本地是有一个完整的 git 仓库也就是 .git 文件目录,通过这个仓库,git 就可以完全离线化操作。在这个本地化的仓库中存储了 git 所有的模型对象
.git文件夹下的Git版本库内部数据的存储结构
|
|
hooks:是存储git钩子的目录,钩子是在特定事件发生时触发的脚本。比如:提交之前,提交之后。
info:是存储git信息的目录,比如排除特定后缀的文件。
objects:是存储git各种对象及内容的对象库,包含正常的和压缩后的。
refs:是存储git各种引用的目录,包含分支、远程分支和标签。
config:是代码库级别的配置文件。HEAD:是代码库当前指向的分支,这里为master。
git 主要有四个对象,分别是 Blob,Tree, Commit, Tag 他们都用 SHA-1 (一种密码散列函数)进行命名。
在当前workspace里写一个README.txt文件,在文件中随便写一些东西保存,并进行git add命令
~/GitStudy$ vim README.txt
~/GitStudy$ git add README.txt
此时工作区的变更提交到暂存区,键入命令git ls-files --stage
,查看当前暂存区文件
可以看到README.txt文件已经被推送到暂存区。
用 git cat-file -t
查看每个 SHA-1 的类型,用 git cat-file -p
查看每个对象的内容和简单的数据结构。查看README.txt的文件类型和文件内容
然后,我们查看.git/objects,可以发现产生了新对象,在此文件夹下有新的文件产生
这个对象就是刚才add到暂存区的对象,在.git/objects目录下看到一个文件。这便是Git存储数据内容的方式–为每份内容生成一个文件,取该内容与头信息的SHA-1校验和,创建以该校验和前两个字符为名称得子目录,并以校验和剩下38个字符为文件命名。这里并没有显示真实的文件名。
为了区分文件夹和文件在git环境中的区别,我们再创建一个文件夹名为Demo,并在该文件夹下创建一个名为DEMO.txt的文件
执行git add Demo/
添加到暂存区。通过git status
查看暂存区内容,变成了2条记录,存储方式和上面文件一样。
其中,以绿色U标记的文件为没有添加到版本库进行跟踪的文件(untracked files)、以橙色M标记的文件为已修改(modified)未提交(changes not staged for commit)的文件
也可以在VS Code中,更加直观的看到当前状态。
查看暂存区内容,变成了2条记录,存储方式和上面文件一样。git ls-files --stage
或者git ls-files --cache
都可以。
可以看出,这里只有为文件内容生成的文件,并没有为目录生成文件。进入.git/objects,查看此时对象情况:
如果我们要将文件从暂存区中取消,则通过键入命令git reset xxx
实现,也可以通过VS Code进行更为方便的操作
到目前为止,暂存区的内容有只有Demo/DEMO.txt文件。下面通过git commit
将暂存区的内容提交到本地仓库。
此处我还未登录自己的git账户,根据提示登录自己的git账户
写入提交信息
使用git log 查看本次提交信息,使用git cat-file -p查看变更内容,当类型为tree时表示文件夹,会显示该文件夹下的文件或目录列表,当类型为blob时为文件,会显示该文件的内容。可以据此画出本次的存储模型:
此时再查看.git/objects目录下,有增加了几个目录。其中:
43:提交的commit对象.
40:提交的commit对应的tree对象。
可以看出,当我们执行git add 和git commit 命令时,Git做的工作是将被改写的文件保存为数据对象、更新暂存区,记录树对象,最后创建一个指明了顶层树对象和父提交的提交对象。这三种Git对象(数据对象-blob、树对象-tree、提交对象-commit)最后均以单独文件的形式保存在.git/objects目录下。
上面提到分支、远程分支和标签都会存储在.git/refs下。
heads包含分支,tags包含标签。每个引用文件里都会指向一个commit。
通过键入git branch test
新建一个分支test。
使用git checkout test
切换到test分支,此时HEAD文件的内容为refs/heads/test,表示当前分支为test.
在test分支下修改刚才两个文件Demo/Demo.txt和README.txt的内容:
git status查看工作空间状态,有两个修改过的文件。
git add .将变更的文件添加到暂存区,查看暂存区内容发现,二者的校验码字段较之前都发生了变化
.git/object中的内容也发生了变化,根据两个文件的校验码产生了新的对象。
git commit 将暂存区的内容提交到本地仓库。和上面一样,此时也会创建提交对象,树对象,通过查看不同的对象,最后都能查看到具体的数据对象的最新内容。
七、分支合并冲突
在master分支修改Demo/DEMO.txt,将内容随便修改一下,以便产生冲突。可以看到打开的时候DEMO.txt仍然还是master下的内容,我们加入新内容
git add 添加到暂存区,查看文件内为新修改的内容,然后git commit添加到本地仓库,同时生成提交对象,树对象。
执行git merge test进行分支合并,Demo/DEMO.txt出现冲突。
解决方式:将Demo/DEMO.txt在master分支下加入test分支里修改的内容(在实验中VIM重新打开该文件后已经把test的内容添加了进来),然后在重新add该文件,commit并进行master,分支冲突问题解决!
学习网址:
https://www.xiaohongshu.com/explore/638c62d6000000001f00a3f4
https://www.51cto.com/article/614442.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。