git push

时间:2017-03-09 20:22:52

标签: git

我需要编辑提交消息。除此之外还有一些提交。有没有办法只编辑一个特定的提交消息?

尝试重新绑定并重新提交提交消息。但它不允许我推动。

抱怨 -

远程:为了防止您丢失历史记录,拒绝了非快进更新

2 个答案:

答案 0 :(得分:1)

你不能安全地做你想做的事。

我将解释如何推动您的更改,但如果您使用该回购做其他所有人,则必须采取其他步骤进行恢复。 (有关进一步说明,请参阅git rebase文档;通常,您不应重新推送已推送到远程的提交。)

首先,为什么会这样?

它与git如何存储和寻址内容以及检测更改有关。每个提交都有一个唯一的ID,它是提交的SHA1哈希值。假设你从这开始:

A --- B --- C --- D <--(master)(origin/master)

如果更改B上的提交消息,则计算的哈希值必须更改 - 因此就git而言,您有一个新提交(比如B')与旧提交非常相似。

A --- B --- C --- D <--(master)(origin/master)
 \
  B'

嗯,C的数据包括其父哈希(B,而不是B'),因此要提交父项为B'的提交意味着您拥有用新提交C替换C'。这将一直持续到HEAD。

A --- B --- C --- D <--(origin/master)
 \
  B' --- C' --- D' <--(master)

现在,git不会默认让您将origin/master表单D移动到D',因为它会破坏从{{1}克隆的任何其他存储库中所做的假设}}

你可以通过说

强制它让你推动你的改变
origin

但如果你这样做:

1)之后你需要仔细检查在git push -f 之后没有其他任何人提交任何东西。如果他们这样做,您将不得不将这些更改重新定义到D

2)其他人必须采取额外措施,使用D'重新分配其分支机构,并且必须将他们计划推送到origin的任何本地更改重新绑定。 (如果他们反而强迫他们推,那么他们会将远程ref移回旧行 - 在master恢复原始提交消息 - 你将处于破碎状态。你和任何正确切换的人到B可能会丢失更改。如果允许这样做,这可能会非常混乱;因此您需要确保整个团队都采用正确的方式进行恢复来自上游的rebase。)

如果值得改变信息,那就是你做的。

答案 1 :(得分:0)

将提交推送到远程存储库后,编辑或删除该提交是一个坏主意,因为它会破坏之前从该遥控器中提取的任何人。如果您坚持这样做,git push -f将覆盖此检查(除非远程存储库设置为禁止此操作)。