Use git
约 881 个字 2 张图片 预计阅读时间 3 分钟
Git 保存的是快照而非版本之间的差别。ref
配置在哪¶
git 有一堆配置。它主要分为 3 级:
- 系统级别的配置,保存在
/etc/gitconfig文件中,这个文件对系统上的所有用户都有效。 - 用户级别的配置,保存在
~/.gitconfig文件中,这个文件只对当前用户有效。 - 项目级别的配置,保存在项目的
.git/config文件中,这个文件只对当前项目有效。
/etc 目录
/etc 目录是干什么的呢?这里 有一个完整的故事。简单来说,/etc 是 et cetera 的缩写,本身用来放那些没地方放的东西。随着时间的推移,/etc 目录变成了存放配置文件的地方。
Filesystem Hierarchy Standard 是一个定义了什么目录是放什么的标准。
如何操作¶
如果要修改配置,可以直接修改上述文件,也可以通过 git config 命令来修改。git config 命令可以查询、设置、更改、删除配置。
git config 可以通过选项配置要操作的是哪个级别的配置。--system 选项表示系统级别,--global 选项表示用户级别,--local 选项表示项目级别。如果不指定选项,默认是项目级别。
另外,git -c NAME=VALUE 可以设置配置只对当前命令有效的配置。
git config 提供一系列选项读取或者展示配置的全部键值或部分键值,并提供编程友好的选项。
例如,通过 git config --list --show-origin
通过 git var -l 可以查看所有的 logical variables,这包含了所有的配置。
有什么配置¶
配置是分节的;例如 push 一节有 autoSetupRemote 选项,这描述了执行 git push 时的行为方式(即当没有指定远程分支时,是否自动 --set-upstream)。节有可能是 git 命令,也有可能是其他内容。
- 设置别名:
alias,比如git config --global alias.co checkout,这样就可以用git co代替git checkout。- 也可以带参数,比如我设置了
alias.catn = commit --amend --date=now --no-edit,即我使用git catn来将当前修改 amend 到上一个 commit 中,将其时间改为现在,但不修改 commit message。
- 也可以带参数,比如我设置了
help.autoCorrect,默认情况下如果给 git 了一个它不认识的命令,它会报错然后建议正确的命令;这个配置可以使得它立即执行建议、在一段时间后自动执行建议,或者提供 prompt 让用户选择。pull.ff=only,这个配置相当于每次git pull都加上--ff-only选项。我在用这个。push.autoSetupMerge,如本节开头所述。init.defaultBranch=main,git init时创建名为main的分支rerere.enabled=true,rerere(reuse recorded resolution) 会记住解决冲突的方法,下次遇到相同的冲突时会自动解决;在 rebase 一个巨大分支时很有用。merge.conflictstyle=zdiff3,我先用用看,参见 https://www.ductile.systems/zdiff3/core.excludesFile,指定一个全局的 gitignorebranch.sort=-committerdate,设置git branch按最近提交时间排序而非字典序
TODO¶
- delta
- credentials
- sparse-checkout
merge.conflictStyle配置指定了冲突时的展示风格。- rerere
- git diff algorithms
- worktree: ref1, ref2, doc
简单看了一眼的东西¶
git notes能够在不更改 commit 的情况下为 commit 添加注释。它的使用不太广泛,GitHub 和 GitLab 也不支持显示 notes。- 相关讨论 指出,notes 可以用来让一些信息离线记录在 git 中,例如 code review 的信息。
- 自 2014 年起,GitHub 不再显示 notes 了。
- GitLab 支持 notes 仍然是一个 open issue。

