不强制更改提交的名称

Change name of the commit without force

我正在寻找一种方法来更改已推送的提交的名称。 但我不能使用变基或用力推动。 可能吗?

您不能通过任何正常方式更改提交中的任何内容,无论它是否被推送。提交完成。

您可以做的,有时称为 'changing a commit',是复制提交的内容,以某种方式改变它,然后用改变的内容进行另一个提交。为了让它看起来像一个替代品, new-copy 必须正确地位于提交树中的同一位置,而不是作为旧提交的子项。假设 MyWork 是您的分支名称:

was:
old5-old4-old3-old2-old1[MyWork]

NOT just new commit:
old5-old4-old3-old2-old1-newCopyOf1[MyWork]

but rather, a 'brother' of old commit:
                   /-old1[MyWork]
old5-old4-old3-old2
                   \-newCopyOf1(not under old1, but not in MyWork either)

最简单的方法,如果它是 immediately-most-recent-commit,它只是 amend

当然,如果 'replaced' 的提交在历史中越靠后,就越难实现。这就是像 rebase 这样的工具有时可以提供帮助的地方。

复制提交并将其正确定位后,例如,您可以将新更改的提交推送到服务器,然后您可以命令服务器重新标记分支,以便 branch-of-your-interest 指向那个新的提交而不是它之前指向的地方。

                   /-old1[<deletemeplease?>]
old5-old4-old3-old2
                   \-newCopyOf1[MyWork]

这可能是您想要实现的目标。

取决于 new-altered 提交是否是目标分支的前一个提示的子项,或者它是否是分支的前一个提示的 not-a-child,这样的操作可以通过“正常推”或“用力推”。

做一个变基归结为相同的基本事情,只是工作流程有点不同,更多的选项可以自动执行一些任务。

如果您不能执行 pushforce/rebase,则您无法将目标分支更新为不是该分支当前状态的子分支的提交。服务器将检查提交是否“横向”增长而不是“进一步”增长,并在检测到它时阻止您。

但是,可能有一些间接的方法可以得到相同的结果。不过,它仍然需要您进行新的、更改的提交。基本的东西没有任何变化。

例如,如果您只想撤销一些更改,您可以只使用revert。它不会改变历史,旧的提交仍然可见,所以这可能不是你想要的。

比如,你能不能……自由创建分支?然后只需进行更改并将其作为新分支推送,忘记代码错误的旧分支,现在在新分支名称下工作并继续工作。

                   /-old1[MyWork]
old5-old4-old3-old2
                   \-newCopyOf1[myNewBrach]

是的,这并不完美。但是现在,另一件事:你可以随意删除一个分支吗?有时服务器拒绝你 push+force,但允许删除分支。然后,将更改后的版本作为新分支推送,并删除旧版本。如果没有其他人足够快地下载它或在其上开始新的 work/branch,它就会丢失。

                   /-old1
old5-old4-old3-old2
                   \-newCopyOf1[myNewBrach]

如果你可以 create/delete 分支,那么你也可以对其进行编排,以便最终得到与以前相同的分支名称,只需稍微调整一下分支名称即可。

                   /-old1(still there, but now invisible)
old5-old4-old3-old2
                   \-newCopyOf1[MyWork] (it's new branch, but old name, who cares!)

但这可能是尽可能多的。这完全取决于服务器允许您做什么。

而且,我要再次声明,如果任何人基于那个 old1 提交做了任何事情,并且如果任何人已经在他们的历史中拥有它,那么它就更难了,因为你必须同步与他们一起并在他们的本地历史中做 cleanups/rewrites 以及消除任何克隆到其他人的工作副本中的 old1 的幽灵.. 这就是为什么所有那些关于 not-amending 提交的说法已经被推送.

I'm looking for a way for change a name of commit which is pushed. But I can't use rebase or push with force. Is it possible ?

不,这是不可能的。 “更改”有关提交的任何内容的唯一方法是制作更改后的副本(有时称为“重写”提交),然后如果您希望该副本(而不是原始副本)成为分支的一部分,则该分支必须用力推。

如果您不能强制推送 - 并且您可能无法这样做的充分理由 - 那么您将无法从分支历史记录中删除错误。听起来错误出在提交元数据中而不是实际内容中,因此即使进行新的提交也可能无济于事。那你能做什么?

您可以在提交中添加注释或带注释的标签来解释问题所在。

https://git-scm.com/docs/git-notes https://git-scm.com/docs/git-tag