任何现有提交中的数据都不能更改,甚至一个位也不能更改。
只要承诺
39c31f5aebe43cdddbe00432207e4bb2cc6a777e
存在于您的存储库中,它将继续具有相同的信息。(请注意,这是
你表现出的承诺。您没有显示提交本身的实际哈希ID,因此我无法使用该ID。)
在Git GUI的非常特殊的情况下(
git-gui.sh
,我从未使用过),从
source
好像有一个功能,使用“修正”可以读取
HEAD
提交的作者信息并复制它。一般来说
应该
不应该
不修改时请执行此操作。与命令行不同
git commit
,似乎没有Git GUI旋钮可以在不保留作者的情况下进行修改。如果它意外地将作者保留应用于
全新的
更多信息,请继续阅读。
背景
每一次承诺都会有一些结果
元数据
与之相关的。原始提交对象中有两个相关的元数据行,称为
作者
提交者
. 从Git存储库中针对Git本身的各种提交中可以看出,这两个文件通常是相同的,但不一定是相同的。例如:
$ git cat-file -p 5d826e972970a784bd7a7bdf587512510097b8c7
tree c790c47fe551d5ed812cfefdac243eb972c1fde3
parent b5796d9a3263b26a8ef32eeca76b3c1d62fcedc5
author Junio C Hamano <gitster pobox.com> 1544328981 +0900
committer Junio C Hamano <gitster pobox.com> 1544328981 +0900
Git 2.20
Signed-off-by: Junio C Hamano <gitster pobox.com>
(我换了
@
具有
尽可能减少垃圾邮件收集)。但是:
$ git cat-file -p 6fcbad87d476d7281832af843dd448c94673fbfc
tree aa05bc7af6e92f3db5d5d738adf0d0b1b3dd23b6
parent b00bf1c9a8dd5009d5102aef7af9e2b886b1e5ad
author Johannes Sixt <j6t kdbg.org> 1543858489 +0100
committer Junio C Hamano <gitster pobox.com> 1543891852 +0900
rebase docs: fix incorrect format of [... snip]
请注意,这两个字段中的每个字段实际上有三个部分:全名、电子邮件地址<尖括号>,和带区域偏移的时间戳。
当您使用
git提交
,吉特
通常将author和committer设置为相同的三个字符串
而不是
作者
作为参考,作者保存提交复制命令的
git提交
和两个人中的任何一个
--amend
-c
/
-C
选择权;
git cherry-pick
git rebase
. 这个
git am
该命令旨在将通过电子邮件发送的修补程序转换为提交:它需要的不是
犯罪
作为它的输入,所以我们可以说它保留了作者,但是我们必须定义我们所说的
作者
. 在这种情况下,,
吉特阿姆
通过解析邮箱格式的邮件来猜测作者信息。
每个领域的机制
只有一个底层Git命令,
git commit-tree
不
git提交树
可以从某处获取默认值。
由于每个作者和提交人都有六个部分名称、电子邮件地址和时间戳,所以有六个地方可以获得具体的指令,而很多地方这次不是六个!获取默认值。首先,让我们列举一下小学六年级。
而不是使用命令行选项,
环境变量
,如中所述
the documentation
:
GIT_AUTHOR_NAME
GIT_AUTHOR_EMAIL
GIT_AUTHOR_DATE
GIT_COMMITTER_NAME
GIT_COMMITTER_EMAIL
GIT_COMMITTER_DATE
如果你设定
任何或全部
在这些变量中,设置将进入的值
所有后续的新提交
(直到您取消设置变量或您与此环境的会话过期为止,请取消设置变量)。
如果(某些)环境变量未设置,则
信息取自配置项user.name和
user.email,或环境变量email(如果不存在),或
邮件(摘自
/etc/mailname
回到完全合格的状态
这是一个善意的谎言,因为实际的代码路径取决于编译时选项,所以不同的Git安装可以有不同的自定义默认值。但总体思路是正确的:Git将使用
user.name
和
user.email
当然,默认时间戳只是您自己的计算机对当前时间的理解。相对较新的
user.useConfigOnly
设置告诉现代Git不要这样做
猜测
在
用户名
和/或
user.email
git提交树
和
只会失败并显示一条错误消息,说它不知道你是谁。
这个
git提交
前端命令也需要
--author
和
--date
GIT_AUTHOR_*
变量。
当使用
前端带有
--修正
尽管它的名字,但实际上并不是
改变
而不是
当前的一个,所有这些意味着
--reset-author
标志告诉前端不要保留原始提交的作者信息。
结论
如果
新的
提交是指获得了错误的作者,而获得了正确的提交者,必须是以下两种情况之一:
如果您有一些现有的提交,并且您正试图用一个新的和改进的提交来替换
git commit --amend
. 当然,这只适用于命令行。如果你正在使用其他东西,看看它是否有类似的选项。
现有的
那个
这显然取决于其他用户的固执程度,以及提交的位置。
位于分支顶端且不在任何其他分支上的提交,使用
修改最后一次提交
. 历史上更远的提交更为困难:您可以使用交互式重基,或者
git replace
,或在特别丑陋的情况下,
git filter-branch
,以替换它们(有时结合这些技术)。对旧提交的任何“更改”都必然会通过设计影响到其所有后代,
1.
因此,这种变化可能具有相当大的破坏性。然而,如果它正在“改变”其他人从未见过的历史,那么它就足够安全了。
1.
“坏”提交的直接子项包含坏提交的父哈希ID。因此,要让子项引用替换项,我们必须
他们的