===
git分层结构
git的工作总共分四层,其中三层是在自己本地的git仓库,包括了工作目录,暂存区和本地仓库,工作目录就是我们执行命令git init时所在的地方,也是执行一切文件操作的地方,暂存区和本地仓库都是在.git目录,因为它们只是用来存数据的。远程仓库在中心服务器,也就是我们做好工作之后推送到远程仓库,或者从远程仓库更新下来最新代码到我们的git仓库。
git所存储的都是一系列的文件快照,然后git来跟踪这些文件快照,发现哪个文件快照有变化它就会提示你需要添加到暂存区或是提交到本地仓库来保证你的工作目录是干净的。
git中的文件有两种状态,一种是被跟踪的,也就是提交到本地仓库的文件,因为本地仓库要保管它们,所以得跟踪他们,第二种未被跟踪的。那么当我们添加新的文件时,它不是被跟踪的,因为本地仓库里面没有这个文件,它是外来的,在git commit之前本地仓库还不需要对他们负责。但是如果是对仓库已经存在的文件进行修改,那么这些文件就是被跟踪的文件,就可以通过git status查看他们的状态来进行相应的操作。未跟踪的文件可以用git add .提交到暂存区,然后可用git commit把暂存区文件提交到本地仓库。
git对象
从根本上讲,git是一套内容寻址的文件系统,它存储的也是key-value键值对,然后根据key值来查找value的,说到寻址就会想到指针,git也是根据指针来寻址的,这些指针就存储在git的对象中。
Git对象一共有四种,分别是数据对象、树对象、提交对象和标签对象。这些对象构成了Git的核心机制,使得Git能够高效地管理项目的版本历史。以下是对这四种Git对象的详细介绍:
1. 数据对象(blob)功能:主要用于存储文件的内容。
a. 特点:当文件被添加到暂存区时,Git会创建一个数据对象blob,其中包含文件内容和头部信息的SHA-1散列值。
b. 存储方式:数据对象会被保存在.git/objects目录下,文件路径由其散列值命名。
c. 优点:通过压缩文件内容并生成散列值,Git可以快速判断文件是否修改过,从而提升版本控制的效率。
2. 树对象(tree)功能:用于管理文件名和目录结构。
a. 特点:树对象包含了一些指向数据对象blob或其他树对象的指针,类似于UNIX文件系统中的目录项。
b. 存储方式:与数据对象一样,树对象也保存在.git/objects中,并通过散列值命名。
c. 应用场景:当一个目录被添加到暂存区时,Git会为该目录创建一个树对象,并在其中记录所有子文件和子目录的信息。
3. 提交对象(commit)功能:表示项目的某一个特定时间点的状态。
a. 特点:每个提交对象都包含一个树对象(通常是项目根目录的树对象)、作者信息、提交者信息以及提交注释。
b. 存储方式:提交对象同样保存在.git/objects目录中,并通过其内容的散列值命名。
c. 作用:通过指向树对象,提交对象能够记录所有文件和目录的状态,从而形成一个完整的项目快照。
4. 标签对象(tag)功能:用于标记特定的提交,通常用于版本发布。
a. 特点:标签对象包含一个对象名(即指向特定提交的指针)、标签名、标签创建人和一条可选的消息。
b. 应用场景:在软件开发中,每次发布新版本时通常会创建一个标签,以便将来能够轻松回到这个版本。
c. 优势:标签可以方便地进行增删改查,提供了一种高效的版本管理方法。
git init
git init用于创建一个新的Git仓库。
终端输入history
打印出近600条历史命令
向上键和向下键
切换历史命令
git status
git status 是一个用于查看Git仓库当前状态的命令。它可以显示当前分支、文件的修改状态(已修改、已暂存、未跟踪等)以及是否有需要提交或推送的变更。
可能的状态
以下是一些可能的状态:
1. 未修改:文件没有被修改,不需要执行任何操作。
2. 已修改:文件已被修改但尚未暂存。可以使用 git add 命令将文件添加到暂存区。
3. 已暂存:文件已被修改并暂存,等待提交。可以使用 git commit 命令将暂存的文件提交到本地仓库。
4. 未跟踪:文件不在Git版本控制之下,可以使用 git add 命令将文件添加到版本控制。
5. 有提交:本地仓库中有提交记录,可以使用 git push 命令将提交推送到远程仓库。
6. 有更新:远程仓库中有更新,可以使用 git pull 命令将更新合并到本地仓库。
运行 git status 命令后,会显示类似以下的输出:
On branch masterYour branch is up to date with 'origin/master'.Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: 新文件名Changes not staged for commit: (use "git add <file>..." to update what will be committed) (use "git checkout -- <file>..." to discard changes in working directory) 修改: modified-file.txtUntracked files: (use "git add <file>..." to include in what will be committed) 未跟踪文件.txt
这个输出表示:
● 当前在 master 分支上,与远程仓库 origin/master 同步。
● 有一个新文件 新文件名 已暂存,等待提交。
● 有一个文件 modified-file.txt 已被修改但尚未暂存。
● 有一个未跟踪的文件 未跟踪文件.txt。
git add
git add命令用于将文件的更改添加到暂存区,以便进行提交。可以使用以下命令将指定文件添加到暂存区:
git add <file>
如果要将所有修改过的文件添加到暂存区,可以使用以下命令:
git add .
git commit
git commit命令用于将暂存区中的更改提交到本地仓库。可以使用以下命令提交更改:
git commit -m "<message>"
其中是提交信息,用于描述本次提交的更改内容。例如:
git commit -m "修复了一个bug"
git commit -a 命令是一个方便的选项,它允许你跳过 git add 步骤,直接将所有已跟踪文件的更改提交到本地仓库。这个命令执行时,Git 会先自动将所有修改过且已被跟踪的文件添加到暂存区,然后提交这些暂存的更改。
使用 git commit -a 命令时,你不需要明确指定要添加哪些文件,Git 会自动处理所有已跟踪文件的更改。命令格式如下:
git commit -a -m "提交信息"
git checkout
git checkout 是一个用于切换分支或恢复工作树文件的命令。它可以用于以下几种情况:
1. 切换到已存在的分支:4ad25800-888d-4ce2-9023-45463c158e76)
git checkout 分支名
将 分支名 替换为您想要切换到的分支名称。
2. 创建新分支并切换到新分支:
git checkout -b 新分支名
将 新分支名 替换为您想要创建的新分支名称。
3. 恢复工作树文件:
git checkout 文件名
将 文件名 替换为您想要恢复的文件名称。
git log
git log:这个命令会显示从最新提交到最早提交的所有提交信息,包括提交的哈希值、作者、提交日期和提交消息等。按“q”键可以退出git log命令。
a. --oneline:以简洁的一行格式显示提交信息。
b. --graph:以图形化方式显示分支和合并历史。
c. --decorate:显示分支和标签指向的提交。
d. --author=<作者>:只显示特定作者的提交。
e. --since=<时间>:只显示指定时间之后的提交。
f. --until=<时间>:只显示指定时间之前的提交。
g. --grep=<模式>:只显示包含指定模式的提交消息。
h. --no-merges:不显示合并提交。
i. --stat:显示简略统计信息,包括修改的文件和行数。
j. --abbrev-commit:使用短提交哈希值。
k. --pretty=<格式>:使用自定义的提交信息显示格式。
如果你想查看历史中什么时候出现了分支、合并,可以添加--graph选项:
git log --graph