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。