Git 推式提交的更改是否会导致问题?

Git 推式提交的更改是否会导致问题?,git,git-commit,git-extensions,Git,Git Commit,Git Extensions,我正在使用Git扩展,我的情况如下: 如您所见,我的目标提交不是最后一个。它已经被分支的其他用户推拉。我读了一些关于通过git bash使用不同命令来完成一些工作的文章,但在这里我找到了一种更简单的方法——我右键单击目标提交>操纵提交>修复提交,然后弹出另一个窗口。然后,我可以更改提交消息(绿色部分),显然可以推动更改,但我还没有做任何事情,因为据我所知,这将在将来给分支的其他用户带来问题 这些“问题”可能是什么?我如何修复提交+避免将来出现任何问题?解决这个问题的几种方法,(imho)最干净

我正在使用
Git扩展
,我的情况如下:

如您所见,我的目标提交不是最后一个。它已经被分支的其他用户推拉。我读了一些关于通过git bash使用不同命令来完成一些工作的文章,但在这里我找到了一种更简单的方法——我右键单击目标提交>操纵提交>修复提交,然后弹出另一个窗口。然后,我可以更改提交消息(绿色部分),显然可以推动更改,但我还没有做任何事情,因为据我所知,这将在将来给分支的其他用户带来问题


这些“问题”可能是什么?我如何修复提交+避免将来出现任何问题?

解决这个问题的几种方法,(imho)最干净的方法是在原始主机上重新设置提交的基础

这可以以交互方式完成,如下所示:

git rebase -i origin/master

解决这个问题的几种方法,(imho)最干净的是在原始主机上重新设置提交的基础

这可以以交互方式完成,如下所示:

git rebase -i origin/master

重写已经推送的历史记录的问题是,其他用户已经拥有“原始”历史记录,您重写的历史记录将不再兼容。因此,如果您更改下一次到最后一次提交(并且提交消息中的更改足以做到这一点,因为该消息是提交哈希计算的一部分)并将其强制推送到服务器,则其他人基于该提交的旧版本或任何更新版本已经完成的任何工作都将不再适用(因为它在分支中不再具有有效的祖先)

对其他人基于其工作的分支进行重定基址(或任何其他形式的重写)是一个坏主意:该分支下游的任何人都必须手动修复其历史记录

如果您要修复的提交是最近的,并且其他人基于此做了大量工作的可能性很低,请执行交互式重新基址、git push--force到服务器,并告诉git pull--force的其他贡献者他们是否可以不做本地更改。有关基于重写的提交重新基址现有工作的信息,请参阅接受的answer此处:

这不是一个一站式的解决方案,因为重写已发布的历史是设计上的麻烦。如果不是绝对必要的,就不要这样做

备选方案: 我不知道您的错误提交消息有多严重(完全混乱、错误、不完整?),但如果您只需要澄清一些事情,您可以这样做

git notes add -m"<Comment or clarification>" [commit-id-if-not-HEAD]
git notes add-m”“[commit id if notes HEAD]

注释单独保存,以后可以更改/添加/删除,而不会影响历史记录。

重写已推送的历史记录的问题是,其他用户已经拥有“原始”历史记录,您重写的历史记录将不再兼容。因此,如果您更改“下一个到最后一个提交”(commit message中的更改足以做到这一点,因为该消息是commit散列计算的一部分)并强制将其推送到服务器,其他人基于该commit的旧版本或任何更新版本已经完成的任何工作都将不再适用(因为它在分支中不再有有效的祖先)

对其他人基于其工作的分支进行重定基址(或任何其他形式的重写)是一个坏主意:该分支下游的任何人都必须手动修复其历史记录

如果您要修复的提交是最近的,并且其他人基于此做了大量工作的可能性很低,请执行交互式重新基址、git push--force到服务器,并告诉git pull--force的其他贡献者他们是否可以不做本地更改。有关基于重写的提交重新基址现有工作的信息,请参阅接受的answer此处:

这不是一个一站式的解决方案,因为重写已发布的历史是设计上的麻烦。如果不是绝对必要的,就不要这样做

备选方案: 我不知道您的错误提交消息有多严重(完全混乱、错误、不完整?),但如果您只需要澄清一些事情,您可以这样做

git notes add -m"<Comment or clarification>" [commit-id-if-not-HEAD]
git notes add-m”“[commit id if notes HEAD]

注释是单独保存的,可以在以后更改/添加/删除,而不会影响历史记录。

注意:我不使用这些GUI,有时它们会做一些有点出乎意料的事情。但在这种情况下,我希望它只做我期望的事情(因为它是:-))

基本上,git从来不会在提交中实际更改任何内容。如果您执行“修改”操作,即使您没有首先备份分支中的一个或两个提交,git下面要做的就是进行新的提交,将旧的提交保留在repo中

例如,您的提交链如下所示。我所做的只是以水平形式重写垂直图形版本(更适合文本)

现在可以进行提交
p
并将其复制。(您仍然无法更改它这是git提交的一个功能。git提交被永久冻结:它们的SHA-1“真实名称”是您作为提交作者的姓名、提交的时间戳、提交文本、提交的父级提交以及提交中的所有文件和目录的加密校验和;如果更改提交中的任何位置,则会更改SHA-1,从而更改“真实名称”我们调用
P
(父项更改为
D
E
的副本:

... - M - B - C - P   <-- master, origin/master
    /       \
...           D - E   <-- HEAD

…-M-B-C-P

注意:我不使用这些GUI,有时它们会做一些出乎意料的事情。但在这种情况下,我希望它只做我期望的事情(实际上是:-))

从根本上说,git在提交过程中从不实际更改任何内容。如果您执行“修改”操作,即使您没有首先备份分支中的一个或两个提交,git下面要做的就是进行新的提交,