教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载导读在团队协作与开源贡献中我们常遇到以他人身份提交或修正已提交内容的作者信息的需求。本文以 30-seconds-of-code 仓库中 set-or-amend-commit-author.md 这一 Git 技巧文档为核心骨架结合仓库内关联的提交管理技巧与配置源码系统讲解git commit --author、git commit --amend --author的完整用法、底层原理SHA-1 校验和重写、推送风险与安全替代方案。读完本文你将能够熟练地为单个提交指定任意作者、修正最近一次提交的作者信息并安全地把改动同步到远程仓库。1. 为什么需要以他人身份提交在 Git 中每一次提交都会记录两个身份字段author作者与committer提交者。前者表示这段代码是谁写的后者表示这个提交是谁记录的。绝大多数情况下两者相同其值来源于本机的 Git 全局配置。也就是说提交身份默认来自全局配置但这并不代表它是写死的。在 30-seconds-of-code 的 config-user.md 中明确给出用户信息可以按全局所有仓库或局部当前仓库配置# 语法 # git config [--global] user.email email # git config [--global] user.name name # 仅配置当前仓库 git config user.email cool.duckqua.ck git config user.name Duck Quackers # 配置全局 Git 用户 git config --global user.email cool.duckqua.ck git config --global user.name Duck Quackers掌握这个背景后下面三类典型场景就顺理成章为单个提交临时指定作者例如团队内代提交、替离线的同事落库或贡献者提供了 name/email 但没有本地配置修正错误配置提交后发现user.name或user.email配错了作者信息不正确修正历史提交已经提交但尚未推送的内容作者信息需要更正。本文核心文档正是围绕这三类场景给出解法--author负责新建提交时指定作者--amend --author负责修正最近一次提交的作者。2. 创建提交时指定作者git commit --author只要拿到作者的名字与邮箱你就可以直接创建一条由该作者署名的提交。核心在于git commit的--author选项# 语法git commit --authorname email # 对文件做一些修改 git add . git commit -m Fix the network bug --authorDuck Quackers cool.duckqua.ck # 创建了一条作者为 Duck Quackers 的提交2.1 参数细节与取值范围--author的值必须是name email的完整形式name与email之间用一个空格分隔email 用尖括号包裹。例如Duck Quackers cool.duckqua.ck该选项只影响本次提交的 author 字段不会改写你的全局或仓库级user.name/user.email配置也不会影响 committer 字段——committer 仍为执行命令的当前用户若你只传入名字或邮箱不完整Git 会尝试从仓库中匹配已存在的作者信息最稳妥的做法始终是同时提供 name 与 email。2.2 一个易混淆点author 与 committer从 30-seconds-of-code 的 view-commits-by-author-or-committer.md 可以看到Git 将作者与提交者分开存储并可用不同参数检索历史# 语法git log --authorauthor git log --authorDuck Quacking # commit c191f90c7766ee6d5f24e90b552a6d446f0d02e4 # Author: 30 seconds of code # Date: Tue Apr 6 11:11:08 2021 0300 # [...] # 语法git log --committercommitter git log --committerDuck Quacking这意味着--author指定的是作者署名而提交记录本身时间戳、committer仍由你生成。如果连提交日期也想一并穿越可以像 commit-different-date.md 那样用环境变量GIT_AUTHOR_DATE与GIT_COMMITTER_DATE配合指定GIT_AUTHOR_DATEMon May 18 19:32:10 2020 -0400 \ GIT_COMMITTER_DATEMon May 18 19:32:10 2020 -0400\ git commit -m Commit from the past日期值既可以使用date %s %z的内部原始格式也支持 RFC 2822Mon, 18 May 2020 19:32:10 -0400、ISO 86012020-05-18 19:32:10 -0400、本地格式Mon May 18 19:32:10 2020、短格式2020-05-18以及相对时间5.seconds.ago、2.years.3.months.ago、6am yesterday等写法。3. 修改最近一次提交的作者git commit --amend --author如果提交已经生成你希望改写最近一次提交HEAD的作者信息只需在上一节命令的基础上加上--amend标志# 语法git commit --amend --authorname email # 对文件做一些修改 git add . git commit -m Fix the network bug --authorDuck Quackers cool.duckqua.ck # 创建了一条作者为 Duck Quackers 的提交 # 编辑或新增文件 git add . git commit --amend --authorQuack Duckers ducky-oqua.ck # 最近一次提交被更新作者变为 Quack Duckers3.1--amend的完整能力--amend并非只能改作者它本质上是用一个新的提交对象替换 HEAD。30-seconds-of-code 在 update-commit-message-or-contents.md 中给出了它的另外两种典型用法仅修改最近一次提交的 message# 语法git commit --amend -m message git add . git commit -m Fix the network bug # 创建了提交3050fc0 Fix network bug git commit --amend -m Fix the network bug # 最近一次提交的 message 变为 Fix the network bug # 同时其 SHA-1 校验和也随之改变仅将暂存区的新改动并入最近一次提交不改 message# 语法git commit --amend --no-edit git add . git commit -m Fix the network bug # 创建了提交3050fc0 Fix network bug # 编辑或新增文件 git add . git commit --amend --no-edit # 最近一次提交包含编辑/新增的文件 # 其 SHA-1 校验和同样改变把两者与--author组合就能在改内容、改 message、改作者三个维度自由搭配——例如git commit --amend --author... --no-edit表示只改作者、保留原 message。3.2 底层原理为什么改作者会导致 SHA-1 改变Git 提交对象commit object的内容包括tree 哈希、父提交哈希、author 信息、committer 信息、时间戳与 message。任何一个字段发生变化提交对象的 SHA-1 校验和就会整体重算——这正是本文文档中反复强调的caveats的第一条。也就是说无论你用的是--amend -m、--amend --no-edit还是--amend --author新提交的哈希必然与旧提交不同因此任何对 HEAD 的 amend 本质上都是重写历史后续所有依赖原哈希的操作如已推送的远程分支、其他协作者基于旧提交拉取的分支都会受到影响。4. 注意事项与安全推送Caveats本文文档明确列出了三个关键注意事项实操前必须逐一确认4.1 SHA-1 重写 → 需要强制推送修改作者或任何 amend 操作会改变提交的 SHA-1 校验和。如果该提交已经推送到远程仓库本地与远程历史出现分叉普通git push会被拒绝必须强制推送更新后的提交到远程git push --force # 强制推送覆盖远程分支上的冲突变更4.2 优先使用--force-with-lease而不是裸--force裸git push --force在共享分支上是危险的它会无条件覆盖远程内容可能抹掉他人刚推送的提交。30-seconds-of-code 在 force-push-better-alternative.md 中给出了更安全的替代品git push --force-with-lease # 仅当远程分支自上次 fetch 以来未被更新时才允许强制推送--force-with-lease会在推送前校验远程分支是否仍是你上次 fetch 到的状态如果有人在此期间推送了新提交强制推送会被拒绝从而避免误覆盖。唯一要注意的是它的自身陷阱若你恰好执行过git fetch它可能误以为分支已是最新而放行——总体而言它仍远优于裸--force。4.3 签名提交signed commits限制如果远程仓库配置为只接受签名提交如 GitHub 的分支保护规则 Require signed commits那么改写作者后你需要用原作者对应的 GPG 密钥重新签名否则提交可能被拒绝或无法通过验证。没有原作者的 GPG 私钥时此类改动将无法落地——这是以他人身份操作在安全策略下的硬边界。4.4--author无法添加多个作者--author只能指定一个作者它不能用来为一次提交附加多位作者。若需要记录协作贡献正确的做法是在提交 message 中追加Co-authored-by尾注trailer这正是 github-co-authors.md 所演示的方式$ git commit -m Refactor usability tests. Co-authored-by: name nameexample.com Co-authored-by: another-name another-nameexample.com使用Co-authored-by时需要注意必须使用与该贡献者 GitHub 账号绑定的邮箱提交才能被正确归因若对方邮箱设置为私密可使用 GitHub 提供的no-reply邮箱在Co-authored-by尾注之前保留一行最好两行空行。5. 完整工作流示例与自检清单把上述知识串起来一个创建 → 发现作者错误 → 修正 → 安全推送的完整工作流如下# 1. 以他人身份创建提交 git add . git commit -m Fix the network bug --authorDuck Quackers cool.duckqua.ck # 2. 检查提交历史确认 author 与 committer git log --authorDuck Quackers # 3. 发现作者邮箱拼写错误修正最近一次提交 git commit --amend --authorDuck Quackers cool.duckqua.ck # 4. 若该提交已推送使用带保护的强制推送 git push --force-with-lease操作前建议按以下清单自查检查项说明依据提交是否已推送已推送则需--force-with-lease覆盖远程force-push-better-alternative.md仓库是否要求签名提交需要原作者 GPG 密钥重新签名本文 4.3 节是否需要多作者署名改用Co-authored-by尾注github-co-authors.md是否只想改 message/内容用--amend -m/--amend --no-editupdate-commit-message-or-contents.md是否想同时改提交日期配合GIT_AUTHOR_DATE/GIT_COMMITTER_DATEcommit-different-date.md6. 小结git commit --author与git commit --amend --author是 Git 提交管理中身份控制的两把钥匙新建提交用--authorname email指定作者一次生效、不动全局配置修正 HEAD用--amend --authorname email可与-m、--no-edit自由组合任何 amend 都会重写提交的 SHA-1已推送时必须用git push --force-with-lease安全同步签名提交策略与多作者需求分别是 GPG 密钥与Co-authored-by尾注的适用范围。本文的全部命令与用法均来自 30-seconds-of-code 仓库的 Git 提交系列文档你可以继续阅读同目录下的 update-commit-message-or-contents.md、config-user.md 与 github-co-authors.md 获得更完整的提交管理能力。赞分享教程文档【免费下载链接】30-seconds-of-codeCoding articles to level up your development skills项目地址https://gitcode.com/gh_mirrors/30/30-seconds-of-code点击查看免费下载相关推荐es-toolkit/fp 的 compact()在 pipe 管道中过滤假值并利用惰性求值提前终止es toolkit/fp 的 compact 在 pipe 管道中过滤假值并利用惰性求值提前终止 导读 compact 是 es toolkit/fp 函教程文档30-seconds-of-code用 git commit --amend 修改最近提交的消息与内容30 seconds of code用 git commit amend 修改最近提交的消息与内容 提交commit之后才发现消息拼写错误、忘了把某个文件教程文档Spack 包管理器完全指南安装入门、Spec 语法与配置实战Spack 包管理器完全指南安装入门、Spec 语法与配置实战 Spack 是一个面向高性能计算HPC场景设计的灵活包管理器支持在一台机器上同时安装同一教程文档上一篇smsBomb 短信轰炸机快速上手指南从零背景到调参排障一次讲透下一篇League Akari 使用指南英雄联盟自动选将与客户端流程自动化创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考