Git学习
零、起步
关于版本控制
版本控制是一种记录一个或若干文件内容变化,以便将来查询特定版本修订情况的系统。
分布式版本控制系统
客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来,包括完整的历史记录。
任何一处协同工作的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。
每一次的克隆操作,实际上都是对代码仓库的完整备份。
一、自定义Git
配置Git
# 设置姓名和邮件地址
$ git config --global user.name "Yzm"
$ git config --global user.email a13684703281@163.com
GIt使用一系列配置文件来保护自定义的行为。
- 首先会查找系统级的
/etc/gitconfig
文件,文件含有系统里每位用户及他们所拥有的仓库的配置值。如果传递--system
选项给git config
,则能够读写文件。 - 接着查找每个用户的
~/.gitconfig
文件(或者~/.config/git/config
文件),传递--global
让Git读写该文件。 - 最后Git会查找用户正在操作的仓库所对应的Git目录下的配置文件(
.git/config
)这个文件中的值只对该仓库有效,对应想git config传递--local
- 优先级:系统 < 全局 < 本地
客户端基本配置
# 得到当前版本Git支持的选项列表
$ man git-config
# core.editor修改默认的编辑器,下面的emacs是文本编辑器的名字
$ git config --global core.editor emacs
# commit.template将自定义模板文件设置为编辑器中的默认信息
$ git config --global commit.temlpate ~/.gitmessage.txt
$ git commit
# 自定义模板文件就是~/.gitmessage.txt
# core.pager 指定分页器
$ git config --global core.pager ''
# 空字符串对应的关闭该选项,默认使用的是less
# user.signingkey 如果要创建签署的含附注的标签,那么GPG签署密钥设置为配置项会更好,下面的指令用来设置密钥ID
$ git config --global user.signingkey <gpg-key-id>
# 每次运行git tag命令时可直接签署标签,无需定义密钥
# 关于签署工作的补充在附录A中
# core.excludesfile .gitignore文件配置
$ git config --global core.excludesfile ~/.gitignore_global
# 关于忽略文件补充在附录B中
# help.autocorrect
如果置为1,则如果有命令模糊匹配到了就会0.1秒后自动执行该命令
Git中的着色
外部的合并与比较工具
P4Merge图形化合并工具
macOS Linux中路径为/usr/local/bin
,Windows改为可执行文件所在的目录路径。
服务器端配置
# 如果想在每次推送时要求Git检查一致性,设置receive.fsckObjects=true来实现
$ git config --system receive.fsckObjects true
# receive.denyNonFastForwards 禁用强制更新推送
$ git config --system receive.denyNonFastForwards true
- 变基(Rebasing):在Git中,变基是指讲一个分支上的提交移动到另一个分支上。通常是通过将一个分支的基准重新设置为另一个分支的最新提交来实现,这样可以使提交历史更加整洁,避免出现过多的合并提交
- 推送(Pushing):将本地Git仓库的提交推送到远程仓库,从而在远程仓库中更新对应的分支。
- 推送被拒绝:当我们尝试推送提交到远程分支时,可能会遇到推送被拒绝的情况。
- 情况一:已经变基了,却对原分支修改后仍旧提交
- 情况二:指向的提交不在该提交的历史中
参考资料
附录
A.签署工作
意义:确保Git的安全性,主要提供了几种通过GPG签署和验证的方式
GPG
开始签名前需要先配置GPG并安装个人密钥
签署标签
#若没有安装密钥,使用指令生成
$ gpg --gen-key
#查看配置
$ gpg --list-keys
#签署标签:如果已经设置好了GPG私钥,可以使用它来签署新的标签,
$ git tag -s <tag_name> -m '标签的附注信息'
# 若将-s 换为-a 这说明不附带GPG的数字签名
# 查看GPG签名附属
$ git show <tag_name>
验证标签
$ git tag -v <tag_name>
签署提交
$ git commit -a -S -m 'signed commit'
# 单引号的内容是对本次提交的简要描述
$ git log --show-signature -1 # 查看及验证签名
$ git log --pretty="format:%h %G? %aN %s"
# %h 提交的短哈希值;%G?一个占位符,如果有签名则输出G,else ?
# %aN 提交者的名字(Author Name) %s 提交信息(Subject)或提交的简短描述
# git 1.8.3及以后版本
$ git merge --verify-signatures non-verify
$ git merge --verify-signatures signed-branch
B.忽略文件
有些文件无需纳入Git的管理,也不希望他们总出现在为跟踪文件列表,可以创建一个.gitignore
文件
# 文件内容
*.[oa] # 以.o或.a为后缀的文件会被忽略 .oa同样也会被忽略
*~ #湖绿以波浪符结尾的文件
格式规范:
- 所有空行或者以
#
开头的行都会被 Git 忽略。 - 可以使用标准的 glob 模式匹配,它会递归地应用在整个工作区中。
- 匹配模式可以以(
/
)开头防止递归。 - 匹配模式可以以(
/
)结尾指定目录。 - 要忽略指定模式以外的文件或目录,可以在模式前加上叹号(
!
)取反。
glob模式是指Shell所使用的简化了的正则表达式。星号(*
)匹配零个或多个任意字符;[abc]
匹配任何一个列在方括号中的字符 (这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c); 问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9]
表示匹配所有 0 到 9 的数字)。 使用两个星号(`**`)表示匹配任意中间目录,比如 a/**/z
可以匹配 a/z
、 a/b/z
或 a/b/c/z
等。
,要么匹配一个 b,要么匹配一个 c); 问号(?
)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符, 表示所有在这两个字符范围内的都可以匹配(比如 [0-9]
表示匹配所有 0 到 9 的数字)。 使用两个星号(`**`)表示匹配任意中间目录,比如 a/**/z
可以匹配 a/z
、 a/b/z
或 a/b/c/z
等。