Git基础
2024/8/8大约 3 分钟
Git基本概念
区别Git、Gitlib、Github、Gitlab、Gitee
- git 是一种版本控制系统,是一个命令,是一种工具。
- gitlib 是用于实现Git功能的开发库。
- github 是一个基于git实现在线代码托管的仓库,向互联网开放,企业版要收钱。
- gitlab 类似 github,一般用于在企业内搭建git私服,要自己搭环境。gitlab-ce 是社区版,gitlab-ee是企业版,收费版。
- gitee 即码云,是 oschina 免费给企业用的,不用自己搭建环境。
Git常用命令
命令:重写提交人信息
如下命令逻辑是:遍历本地仓库所有分支 / 标签的所有提交,将「作者 / 提交者邮箱为 abc@email.com」的提交,批量改写为姓名 efg、邮箱 efg@email.com,并同步更新所有标签的指向。
git filter-branch -f \
--env-filter '
# 配置需要替换的旧信息和新信息
OLD_EMAIL="abc@email.com"
CORRECT_NAME="efg"
CORRECT_EMAIL="efg@email.com"
# 替换提交者(Committer)信息:匹配旧邮箱则更新
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]; then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
# 替换作者(Author)信息:匹配旧邮箱则更新
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]; then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' \
--tag-name-filter cat \
-- \
--branches \
--tags命令解释:
git filter-branch -f \
核心命令行起始:git filter-branch:Git 内置的「提交历史重写工具」,用于批量修改提交的元数据(作者、提交者)、文件内容等;-f(全称--force):强制执行,覆盖之前filter-branch操作残留的临时文件(避免因残留文件导致命令报错);- 末尾
\:Shell 换行转义符,表明命令未结束,下一行是续行(仅为格式美观,不影响功能)。
--env-filter '
过滤器参数定义:--env-filter:指定「环境过滤器」,是本次操作的核心——通过修改 Git 执行时的环境变量,来改写提交记录的「作者/提交者信息」;- 单引号
':开启 Shell 脚本块(后续直到闭合的'都是过滤器的执行逻辑); - 前置空格:仅为缩进(提升可读性,Shell 忽略无意义空格)。
--tag-name-filter cat \
标签处理参数:--tag-name-filter:指定「标签过滤器」,用于处理仓库中的标签;cat:表示「保留原标签名」(Git 会让标签指向重写后的新提交,而非旧提交);- 末尾
\:续行符。
-- \
分隔符:--是 Git 标准分隔符,用于区分「filter-branch 的参数」和「要处理的引用范围」;- 作用:告诉 Git 后面的参数(--branches/--tags)是「要重写历史的范围」,而非 filter-branch 的选项,避免参数混淆。
--branches \
重写范围:--branches:指定「重写所有本地分支」(包括 master/main、feature、bugfix 等所有分支);- 末尾
\:续行符。
--tags
重写范围:--tags:指定「重写所有标签」(确保标签也指向重写后的新提交,而非旧历史);- 无续行符:标志整个
git filter-branch命令结束。