Git :如何重置与项目关联的所有存储库的历史记录?



我们是两个开发者,使用BitBucket上的中央存储库进行项目。

有时我想将历史记录重置为特定修订版(我知道这会丢失信息):

git.exe reset --mixed 0e827d5fcb7d9b
git.exe push --all --force

这会正确地将历史记录重置为我想要的修订版。但是,如果第二个开发人员不做同样的事情,如果他不重置自己的本地存储库,那么他将要进行的下一次推送将添加回我在重置时删除的所有提交

当项目中只有两个开发人员时,情况还不错。我可能会要求其他开发人员在其本地存储库上运行相同的重置,并且 BitBucket 上的历史记录将保留为我想要的。但是我想知道是否有办法强制重置与该项目关联的所有存储库的历史记录?一种强制第二个开发人员将其本地存储库重置为我的存储库的方法,然后才能再次推送到 BitBucket?

或者也许我错过了一些明显的东西(我不是 Git 大师)......

您可以简单地重置创建一个单独的分支。

git checkout -b newBranch 0e827d5fcb7d9b
git push -u origin newBranch

推送新分支将允许您拥有自己的分支来重置和强制推送,而无需打扰第二个开发人员。

但是,如果要强制第二个开发人员在推回之前重置他/她自己的工作区,则应:

  • 重置(就像您正在做的那样)
  • 修改提交(强制提交 0e827d5fcb7d9b 具有新的 SHA1)

    git commit --amend -m "reset branch"
    
  • 力推

然后,来自其他开发人员的任何推送都将默认被拒绝,因为它是非快进的。
他们需要获取,要么在origin/master之上重新定位自己的分支。或者将自己的工作树重置为新upstream/master

使用您当前所有开发人员对"中央"存储库具有写入访问权限的模型,这是不可能的。

但是,对于太多开发人员来说,整个工作流无法很好地扩展。你可能要考虑存储库的另一个拓扑,其中每个开发人员都有一个专用存储库和一个公共存储库。所有开发人员都对自己的公共存储库 (SSH) 具有写入访问权限,并对其他人的公共存储库 (HTTP?) 具有只读访问权限。

每个开发人员都将他的更改推送到他自己的公共存储库中,并要求独裁者从中提取。独裁者反过来从开发人员的公共存储库获取到他自己的本地存储库中,并检查分支。如果它基于以前删除的提交,他会拒绝它。

这假设项目中有一个独裁者,他负责合并其他人的东西。独裁者的origin远程将指向他自己的公共存储库,并且他将有其他远程指向他的开发人员的公共存储库。其他开发人员也将有一个额外的遥控器,最好称为upstream,指向独裁者的公共存储库,以获取项目的官方状态。

不,没有办法强迫其他开发人员做任何事情。

如果您了解git中的分支没有任何实质内容,这会有所帮助。它只是简单地从字面上看只是一个指向提交的字符串。它没有结构,也没有其他东西。

这意味着git push --all --force除了更新远程上的所有分支"便笺"以指向您在本地存储库中指向的任何提交之外,没有任何特殊之处。

要让其他开发人员接受您的更改,您必须与他们沟通并告诉他们做一些类似git fetch ; git branch -D somebranch ; git checkout somebranch的事情,这将具有删除他们自己的somebranch便笺并将其替换为您的(他们刚刚从远程获取的)的效果。somebranch可以master,因为master分支根本没有任何魔力,它也只是一个指向某个提交的便签。

如果你按照你说的去做,即一个reset然后是强制推送,无论如何你已经对其他开发人员造成了严重破坏;他们基本上只能选择要么按原样接受你的更改,要么在同一个法辛中覆盖它们;合并或其他事情几乎是不可能的,因为它们最终可能会陷入混乱。

最新更新