type
status
date
slug
summary
tags
category
icon
password
实用操作
分支查看
根据 commit 创建新分支
git switch -c <new_branch_name> <commit_id>
git stash 相关
git stash
用于临时存储当前的工作区修改,让你可以切换分支或执行其他操作,而不必提交这些修改。git show 相关
git show
主要用于查看 Git 对象的详细信息,比如提交记录、分支、标签、文件修改内容等。比 git log
更详细,比 git diff
更综合。git show
默认显示:- 提交哈希(commit ID)
- 作者信息
- 提交日期
- 提交信息(commit message)
- 修改的文件及其具体内容
示例:
忽略对某些文件的更改(不使用.gitignore)
git update-index --assume-unchanged
用于告诉 Git 忽略本地对某个文件的修改,但不会真正修改 .gitignore
或 Git 的跟踪状态。使用场景
- 本地配置文件(如
config.json
),你修改了但不想提交
- 性能优化(减少 Git 检测变更的开销,提高大项目速度)
- 临时忽略文件修改,但仍然保持 Git 版本库的干净状态
用法
assume-unchanged
vs .gitignore
方法 | 作用 | 适用场景 |
.gitignore | 永久忽略文件,不会被 Git 追踪 | 不想让 Git 追踪文件,如日志、编译产物 |
assume-unchanged | 只忽略本地修改,但文件仍在 Git 版本库 | 配置文件、临时修改、优化性能 |
区别:
.gitignore
适用于文件从未被 Git 追踪
assume-unchanged
适用于文件已在 Git 版本库中,但你想暂时忽略修改
git checkout 与 switch 和 restore
Git 2.23 之后,
git checkout
被拆分为:操作 | 推荐命令 | 旧 git checkout 命令 |
切换分支 | git switch <分支> | git checkout <分支> |
创建并切换新分支 | git switch -c <分支> | git checkout -b <分支> |
恢复文件 | git restore <文件> | git checkout -- <文件> |
检出旧版本 | git checkout <commit> | git checkout <commit> |
git restore
Git 2.23
引入了 git restore
命令,它主要用于恢复文件状态,是 git checkout -- <file>
的替代方案,语法更加清晰。git restore
主要用于:- 丢弃未提交的本地修改
- 从暂存区恢复文件
- 从某个提交恢复文件
git switch
git switch
主要用于切换和创建分支,比 checkout
语义更清晰、操作更安全。
Git 原理
git add 底层实现
git add
之后,.git/object
中会产生新的文件,可以通过git cat-file
指令查看其中的文件,这里文件是根据add
的文件的内容(-p)
和类型(-t)
和大小(-s)
产生的,并且不考虑add
的文件的文件名。例如,如果有两个txt文件,其文件名不一样,而内容一样,将它们都add
之后,只会多出一个object
文件。具体的产生方法为,文件类型+文件内容长度+\+文件内容
进行哈希(如,类似于echo "blob 10\0 hello git" | shasu
m),得到object
文件名,object
文件内容则是原文件文件类型+文件内容长度+\+文件内容
。tree
在
Git
中,tree
(树)是文件夹的表示方式,它存储的是文件及子目录的引用,而不是文件的内容。Git 使用 tree
来组织 blob
(文件对象),从而构建整个代码仓库的目录结构。Git
中,文件夹不会有对应的对象,而新增空文件夹也不会改变git status
。但是tree
是按照文件夹结构,以树状形式产生的。分支
分支(
branch
)是指向commit
的有名字的指针。HEAD
是一个特殊的指针,它和当前活跃的branch
关联,总是指向最新的commit
。 也可以将
HEAD
指向某个之前的commit
。