git
快照
git init 初始化仓库, 建立.git
【原理解析】让你完全搞明白Git是如何管理你的代码的】
git:快照,相同的留链接 :分布式版本管理<->集中:增量式
工作区$\xrightarrow{add}$暂存区$\xrightarrow{commit}$代码仓库
.git一种扁平结构:内容与结构分开储存, 思路与我的obsidian类似
- blob,标题:哈希值,内容:代码内容, 避免内容重复的文件占用空间
- tree,类似目录记录文件结构, 包含标题哈希值对应的文件标题
- commit, 记录版本提交信息, 包含tree、作者、前一次提交
git add生成blob,更新暂存区tree
git commit生成快照(commit文件) -a先add,相当于先执行git add -u(-u=–update更新已跟踪文件)
untracked$\xrightarrow{add.}$tracked(已跟踪)$\xrightarrow{修改}$unstaged$\xrightarrow{add-u}$staged(已暂存) to be committed
git status检查当前状态
git log 历史提交
分支
git branch列出所有本地分支(当前分支前带 *
)-r远程 -a所有git branch <new-branch>
创建本地分支git branch -d <branch>
删除本地分支git branch -m <old branch默认当前> <new branch>
更改分支名称
git switch/checkout <branch>
切换分支 , 推荐用switchgit checkout <commit-hash/branch>
切换到指定提交/分支 .
上次提交, 切换到提交进入分离头指针(Detached HEAD)-
回到之前状态git switch -c
(-c=–create) 或 git checkout -b <new-branch> <commit-hash,默认当前>
创建并切换到新分支
哈希值至少前4位
git merge <branch>
将指定分支合并到当前分支
fast-forward(无冲突)直接用原来的commit object
no-fast-forward: use “git merge –abort” to abort the merge;再commit后生成新的commit object
Rebase
commit 规范
1 |
|
type(必须)
用于说明git commit的类别,只允许使用下面的标识。
feat:新功能(feature)。
fix/to:修复bug,可以是QA发现的BUG,也可以是研发自己发现的BUG。
- fix:产生diff并自动修复此问题。适合于一次提交直接修复问题
- to:只产生diff不自动修复此问题。适合于多次提交。最终修复问题提交时使用fix
docs:文档(documentation)。
style:格式(不影响代码运行的变动)。
refactor:重构(即不是新增功能,也不是修改bug的代码变动)
perf:优化相关,比如提升性能、体验。
test:增加测试。
chore:构建过程或辅助工具的变动。
revert:回滚到上一个版本。
merge:代码合并。
sync:同步主线或分支的Bug。
scope(可选)
scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
subject(必须)
subject是commit目的的简短描述,不超过50个字符。
远程
git remote add [remote] [url]
git pull/fetch/push [remote] [branch]
git pull=git fetch + git merge
git fetch:将远程仓库拉取到本地仓库, 在.git/refs/remotes/<remote-name>/
git diff main origin/main比较区别
git push -u origin main( -u = –set-upstream设置上游分支)
pull request
- Fork(派生):个人先把主仓库 fork(一份拷贝)到自己账户。
- Clone 到本地新建分支进行开发(做功能、修 bug 等)。
- Commit 和 Push 代码到自己 fork 的仓库的新分支上。
- 在 GitHub 上发起 Pull Request,请求将自己提交的更改合并到主仓库(Upstream)的某个分支。
- 维护者审核、讨论,无误后合并。
.gitignore
# 注释
以 /
结尾表示忽略目录(而非同名文件),不以 /
结尾会同时匹配文件和目录, Git 忽略目录时,其下的所有内容(文件和子目录)都将被忽略。
默认表示匹配所有位置的文件, 以 /
开头表示从项目根目录开始匹配,默认从 .gitignore
所在目录的相对路径开始匹配。
使用 !
前缀强制包含某个文件或目录,从根目录开始匹配,和顺序有关!dir/
只允许该目录本身(作为目录结构)被追踪,不自动解封该目录下的文件
1 |
|
.gitignore
仅对未跟踪的文件生效。若文件已被 Git 跟踪,需先删除其缓存
LFS(Large File Storage)
将大文件外部储存, 仓库内仅留链接
需要额外下载:git install git-lfs
初始化仓库时:
1 |
|
lfs track 会修改.gitattributes
隐私
git push会提交所有历史
确保commit时不要包含密码
LF&CRLF
git 的 Windows 客户端基本都会默认设置 core.autocrlf=true,设置core.autocrlf=true, 只要保持工作区都是纯 CRLF 文件,编辑器用 CRLF 换行,就不会出现警告了;
Linux 最好不要设置 core.autocrlf,因为这个配置算是为 Windows 平台定制;
Windows 上设置 core.autocrlf=false,仓库里也没有配置 .gitattributes,很容易引入 CRLF 或者混合换行符(Mixed Line Endings,一个文件里既有 LF 又有CRLF)到版本库,这样就可能产生各种奇怪的问题。
1 |
|
云储存
[[Obsidian]]库的git仓库在用户文件夹中, 避免与[[iCloud]]冲突