Git知识大全
2025-02-10 15:34:22 0 举报
AI智能生成
Git知识大全是一个全面的资源库,它涵盖了版本控制系统Git的核心概念、高级技巧和日常工作流实践。这本书不仅适合初学者构建坚实的基础,也同样适合高级用户进一步加深理解。它从Git的安装开始,详细讲解了诸如分支、合并、冲突解决等重要操作。此外,它还包括了如何使用Git进行有效团队协作的技巧,比如Git Flow工作流、分支模型以及远程仓库管理。全书穿插有丰富的示例代码和实用的修饰语,使得理论知识更加容易理解和应用。对于希望精通Git以提高生产力的开发者来说,Git知识大全是一份宝贵的资料。
作者其他创作
大纲/内容
GitOps - Operations by Pull Request
gitignore
joe cli
Gitignore Online Generator
Writing a commit message
netty
git-draw
作者和提交者区别
作者是最初编写代码或进行更改的人,
而提交者是将更改添加到存储库的人
而提交者是将更改添加到存储库的人
在大多数情况下,
作者和提交者是同一个人——执行 git commit 命令的人
作者和提交者是同一个人——执行 git commit 命令的人
作者和提交者不同的场景
Rebase (including git pull --rebase)
Amend (modifying commit messages)
Cherry-Picking
Applying patches
查看作者和提交者信息
git show --pretty=fuller <commit-hash>
更改作者和提交者信息
export GIT_COMMITTER_NAME="New Committer Name"
export GIT_COMMITTER_EMAIL="new.committer@example.com"
git commit --amend
export GIT_COMMITTER_EMAIL="new.committer@example.com"
git commit --amend
按作者或提交者过滤提交历史记录
git log --author="Author Name"
git log --committer="Committer Name"
git log --committer="Committer Name"
忽略作者和提交者日期
git cherry-pick --ignore-date <commit-hash>
git rebase --ignore-date <upstream-branch>
git rebase --ignore-date <upstream-branch>
atlassian Git Tutorials
三种状态
已提交
已修改
已暂存
配置
系统级
/etc/gitconfig
git config --system
git config --system
用户级
~/.gitconfig
~/.config/git/config
git config --global
~/.config/git/config
git config --global
仓库级
.git/config
git config --local
git config --local
每一级会覆盖上一级别
git config --list --show-origin 显示配置的来源
git config --show-origin key 显示key配置来自哪个配置文件
文件状态变化周期
git add 精确地将内容添加到下一次提交中
三棵树
HEAD上一次提交的快照,下一次提交的父结点
git cat-file -p HEAD
git ls-tree -r HEAD
Index 预期的下一次提交的快照
git ls-files -s
Working Directory 沙盒
.gitignore
规范
所有空行或者以 # 开头的行都会被 Git 忽略
可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中
匹配模式可以以(/)开头防止递归
匹配模式可以以(/)结尾指定目录
要忽略指定模式以外的文件或目录,可以在模式前加上叹号(!)取反
示例
# 忽略所有的 .a 文件
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
*.a
# 但跟踪所有的 lib.a,即便你在前面忽略了 .a 文件
!lib.a
# 只忽略当前目录下的 TODO 文件,而不忽略 subdir/TODO
/TODO
# 忽略任何目录下名为 build 的文件夹
build/
# 忽略 doc/notes.txt,但不忽略 doc/server/arch.txt
doc/*.txt
# 忽略 doc/ 目录及其所有子目录下的 .pdf 文件
doc/**/*.pdf
GitHub gitignore
git commit -a 自动暂存已跟踪的文件然后提交(新加的为跟踪的不会提交)
git rm 移除文件
--cached 从暂存区域移除
以列出文件或者目录的名字,也可以使用 glob 模式
git log
--pretty=format
--since
远程仓库
git remote add
git fetch <remote>
git remote show <remote>
git remote show
git remote remove
git别名
git config --global alias.co checkout
服务器上的git
协议
本地协议
HTTP 协议
SSH(Secure Shell)协议
Git
协议
协议
GitHosting
git 修订版
单个修订版本
简短的 SHA-1
git log --abbrev-commit --pretty=oneline
分支引用
祖先引用
^num
~num
提交区间
双点
A..B 在分支A不在分支B的提交
多点
三点
被两个引用 之一 包含但又不被两者同时包含的提
交
交
--left-right
git-rev-parse
贮藏与清理
Git Grep
git reset
移动 HEAD 分支的指向 (若指定了 --soft,则到此停止)
使索引看起来像 HEAD (若未指定 --hard,则到此停止)
使工作目录看起来像索引
子模块
Git 内部原理
内容寻址文件系统
gitrepository-layout
config
description
HEAD
hooks/
info/
objects/
info/
pack/
objectId前2位生成的目录
refs/
heads/
tags/
remotes/
{remotename}/
pack/
*.idx
*.pack
*.rev
packed-refs
打包的引用
logs/
使用底层命令操作对象
创建对象,写入git数据库
echo 'test content' | git hash-object -w --stdin
查看对象内容
git cat-file -p d670460b4b4aece5915caf5c68d12f560a9fe3e4
查看对象类型
git cat-file -t 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a
对象类型
commit
git commit-tree
tree
解决文件名保存的问题
将多个文件组织到一起
blob
数据对象
对象存储
zlib压缩
数据编码
头部信息+原始数据
头部信息=对象类型 + 空格 + 数据内容字节数 + 空字节
tag
标签对象通常指向一个提交对象,而不是一个树对象
标签对象并非必须指向某个提交对象;你可以对任意类型的 Git 对象打标签
工作实质
将被改写的文件保存为数据对象,
更新暂存区,记录树对象,
最后创建一个指明了顶层树对象和父提交的提交对象
更新暂存区,记录树对象,
最后创建一个指明了顶层树对象和父提交的提交对象
Git引用
.git/refs目录
git update-ref
git branch <branch> ,Git 实际上会运行 update-ref 命令
HEAD 引用
一个符号引用(symbolic reference),指向目前所在的分支
git symbolic-ref
HEAD 文件可能会包含一个 git 对象的 SHA-1 值
当你在检出一个标签、提交或远程
分支,让你的仓库变成 “分离 HEAD”状态时
分支,让你的仓库变成 “分离 HEAD”状态时
标签引用
轻量标签
git update-ref refs/tags/v1.0 cac0cab538b970a37ea1e769cbbde608743bc96d
一个固定的引用
附注标签
git tag -a
远程引用
远程引用是只读的
Git 并不会将 HEAD 引用指向远程引用
引用规范
引用规范的格式由一个可选的 + 号和紧随其后的 <src>:<dst> 组成, 其中 <src> 是一个模式(pattern),
代表远程版本库中的引用; <dst> 是本地跟踪的远程引用的位置。
+ 号告诉 Git 即使在不能快进的情况下也要
(强制)更新引用
代表远程版本库中的引用; <dst> 是本地跟踪的远程引用的位置。
+ 号告诉 Git 即使在不能快进的情况下也要
(强制)更新引用
包文件
Git 最初向磁盘中存储对象时所使用的格式被称为“松散(loose)”对象格式
当版本库中有太多的松散对象,或者你手动执行 git gc 命令,或者你向远程服务器执行推送时,Git 都
会打包文件
会打包文件
git verify-pack
git gc手动打包
移除对象
找到大对象
git verify-pack -v .git/objects/pack/pack-29…69.idx \
| sort -k 3 -n \
| tail -3
| sort -k 3 -n \
| tail -3
git rev-list --objects --all | grep 82c99a3
git log --oneline --branches -- git.tgz
从历史中完全移除这个文件
git filter-branch --index-filter \
'git rm --ignore-unmatch --cached git.tgz' -- 7b30847^..
'git rm --ignore-unmatch --cached git.tgz' -- 7b30847^..
删除对象
git prune --expire now
bash自动完成配置
从 Git 源代码中获得一份 contrib/completion/git-completion.bash 文件的拷贝
并且将它的路径添加到 .bashrc 中
在你的应用中嵌入 Git
命令行 Git 方式
Libgit2
自定义后端指定配置、引用的存储以及对
象数据库
象数据库
JGit
允许其它的存储模型
jgit-cookbook
go-git
Git飞行规则
The GitOps Pipeline
gits-database-internals
packed-object-store
commit-history-queries
file-history-queries
distributed-synchronization
scalability
Workflow
geoserver
netty
akka
GitHub Workflow
K8S 工作流程
三角工作流程
Git WorkFlow
gitlab Workflow
git-from-the-bottom-up
日常 Git 大约有 20 个命令
GitHub 上的 PR 全过程
Git最佳实践,这样用就对了
帮助文档
git help <verb>
git <verb> --help
git <verb> -h
JGit Core
git status -s
git diff 工作目录中当前文件和暂存区域快照之间的差异
git diff --staged 已暂存
文件与最后一次提交的文件差异
文件与最后一次提交的文件差异
移动文件 git mv
等价于
$ mv README.md README
$ git rm README.md
$ git add README
$ mv README.md README
$ git rm README.md
$ git add README
git commit --amend 擦除上次提交
标签
轻量标签
git tag <tag>
附注标签
git tag -a <tag> -m "msg"
共享标签
git push origin <tagname> 显式的推送标签到服务器
git push origin --tags
删除远程标签 git push origin --delete <tagname>
git分支
查看各个分支当前所指的对象 git log --oneline --decorate
git branch <name>
HEAD指向当前所在的分支
git log --oneline --decorate --graph
--all 显式所有分支历史
--all 显式所有分支历史
对象结构
git checkout -b
<newbranchname> 创建新分支的同时切换过去
<newbranchname> 创建新分支的同时切换过去
git branch -v
git branch --merged
git branch --no-merged
跟踪分支
git fetch --all; git branch -vv
删除远程分支 git push origin --delete
变基
变基的风险
如果提交存在于你的仓库之外,而别人可能基于这些提交进行开发,那么不要执行变基
git pull --rebase
git config
--global pull.rebase true
--global pull.rebase true
原则
只对尚未推送或分享给别人的本地修改执行变基操作清理历史, 从不对已推送至别处的提交执行
变基操作
变基操作
分布式 Git
分布式工作流程
集中式工作流
集成管理者工作流
主管与副主管工作流
提交准则
提交不应该包含任何空白错误 git
diff --check
diff --check
尝试让每一个提交成为一个逻辑上的独立变更集
提交信息
交互式暂存
git add -i
签署工作
GPG
gpg --list-keys
gpg --gen-key
git config --global user.signingkey 0A46826A
重写历史
修改最后一次提交 git commit --amend
修改多个提交信息 git rebase -i HEAD~3
重新排序提交
压缩提交
拆分提交
filter-branch
使用gitfilter-repo替代
使用 Git 调试
文件标注
git blame
二分查找
配置 Git
commit.template
数据恢复
git reflog
git fsck --full
dangling commit
环境变量
Zsh git配置
.zshrc 中执行 autoload -Uz compinit
&& compinit
&& compinit
oh-my-zsh 扩展
ui工具
lazygit
gitui
tig
0 条评论
下一页