分支合并后重新措辞提交会影响原始分支吗?

问题描述

比方说,我有一个名为dev/feature的分支,该分支具有一些提交并被推送到一个远程服务器。现在,我将dev/feature合并到我的计算机上的master中,但随后我意识到我想用dev/feature重写其中一个提交。

只要我没有将master上的新(合并)提交推送到远程,这样做是否安全?还是我可以通过重新措辞dev/feature上的提交来为已经拉过master的其他人搞砸?

我想我要问的是,合并到master的提交是否仍以某种方式“连接”到dev/feature

解决方法

这是一个小的“证明”,用于像您建议的那样修改不公开(尚未推送)的提交的安全性。假设我们有一个commit 39e761和两个本地存储库,它们具有相同的远程地址:“ origin”。

/mnt/d/dev/git/change-history-1 [master]
20:35 $ git ls -1
39e7616 (HEAD -> master) Change to test

我们可以看到两个存储库.git\refs\remotes\origin\master的远程源引用文件都指向以下对象:

39e7616f7f5b7658829b795ff8e4f1d70f508be9

现在让我们合并一些东西,或在存储库1中本地创建一个新的提交,然后“重新编码”,或对其进行修改(成为bd9d987):

/mnt/d/dev/git/change-history-1 [master]
bd9d987 (HEAD -> master) Amend: Change to some new,local commit 
39e7616 Change to test

您可以看到,远程引用指向原点的哈希值包含的哈希值远低于母版历史记录。由于您没有修改此对象,因此可以安全地进行推送,并在此过程中为每个人(当​​他们获取时)更新远程引用。如果您要进行顽皮的操作并且需要“强制”推动,Git也会通知您,因为您实际上是在“改变历史”。

如果您正在更改历史记录,那么您当然需要:

git push --force

或更安全:

git push --force-with-lease