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

时间:2016-12-14 20:42:55

标签: git bitbucket

我们是两个在项目上工作的开发人员,使用BitBucket上的中央存储库。

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

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

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

当项目中只有两个开发人员时,情况就不那么糟了。我可能会要求另一个开发人员在其本地仓库上运行相同的重置,并且BitBucket上的历史记录将保持原样。但我想知道是否有办法强制重置与该项目相关的所有存储库的历史记录?在他再次推送到BitBucket之前,迫使第二个开发人员将其本地仓库重置为我的方法?

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

3 个答案:

答案 0 :(得分:4)

您只需重置创建一个单独的分支。

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

推动新的分支将允许您拥有自己的分支重置并强制推送而不会打扰第二个开发人员。

但是如果你想在推回之前强迫第二个开发者重置他/她自己的工作区,你应该:

  • 重置(正如您所做)
  • 修改提交(强制提交0e827d5fcb7d9b以获得新的SHA1)

    git commit --amend -m "reset branch"
    
  • 强制推送

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

答案 1 :(得分:1)

使用您当前所有开发人员的模型,可以对中心"回购,这是不可能的。

但是,对于太多的开发人员来说,整个工作流程并不能很好地扩展。您可能想要考虑另一个repos拓扑,其中每个dev都有私有和公共repo。所有开发人员都拥有对自己的公共仓库(SSH)的写访问权限,以及对其他人的只读访问权限。 public repos(HTTP?)。

每个开发者都将他的变化推向他自己的公共回购,并要求独裁者撤离它。独裁者反过来从开发公共仓库进入他自己的当地公司,并检查分支机构。如果它基于先前删除的提交,则拒绝它。

这假设在项目中有一个负责合并他人的独裁者'东西。独裁者的origin遥控器将指向他自己的公共回购,并且他将有其他遥控器给他的同伴开发者'公共回购拉动。其他开发者也会有一个额外的远程,最好叫upstream,指向独裁者的公共回购,以获取该项目的官方状态。

答案 2 :(得分:0)

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

如果你理解git中的一个分支没有实质内容,那会很有帮助。它简直就是一个指向提交的字符串。它没有任何结构,也没有别的东西。

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

要让其他开发者接受您的更改,您必须与他们沟通并告诉他们执行类似git fetch ; git branch -D somebranch ; git checkout somebranch的操作,这样可以删除他们自己的somebranch便利贴并替换它与你的(他们刚刚从遥控器取出)。 somebranch可以是master,因为master分支根本没有什么神奇之处,它也只是指向某个提交的粘滞便笺。

如果按照你所说的那样做,即reset然后强制推动,你就会对其他开发者造成严重破坏;他们基本上只能选择按原样进行更改,或者将它们覆盖在同一个fashin中;合并或其他事情几乎是不可能的,因为它们可能最终会陷入混乱。