重写GIT历史的实际后果是什么?

我们的项目现在一直在使用git一个星期左右,我们都很享受它(在一个紧密的合作团队中使用它变成了完全不同的git体验)。 为了让事情尽可能简单,我们不做任何重塑或历史修改。 但是我们在第一周确实犯了一些错误。 有些提交不应该完成,我们设法将一个功能分支合并到错误的集成分支(1.1而不是1.0)中。 直到他们进入我们的历史之前,我们才发现这些事情。

现在我看到很多关于重写历史的警告,但我不确定我是否了解涉及的危险。 我们使用共享裸仓库,并将所有分支推送到那里进行备份。

我希望如果你重写历史记录(比如说删除提交),后续提交的完整列表将“失去”那个提交(也可能不是编译/工作)。 我也希望如果发生这种情况,我实际上可以选择将其固定在历史的顶部(并且将历史的那部分作为非编译)。

  • 如果我重写历史记录(并且所有受影响分支中的所有内容都可以编译/运行),我的同事是否需要执行任何特殊命令)? (换句话说,如果我做得好,他们会“知道我已经做到了吗?”)
  • 具有我不知道的本地更改的任何用户是否有资格在git pull上发生合并失败?
  • 我在这里错过了什么?
  • 任何关于这个主题的文章/教程的引用也将非常好。


    必需的阅读是在Git用户手册中重写历史记录时遇到的问题。

    如果我重写历史(并且所有受影响的分支都编译/工作),我的同事是否需要执行任何特殊命令(即,如果我做得好,他们是否“知道我已经完成了”)?

    他们会知道,Git会毫不含糊地告诉他们有什么问题。 他们会得到意想不到的错误消息,并可能在试图解决所产生的合并冲突的过程中,无意中恢复先前的提交。 这个问题产生了一个真实的信息,如果你想知道发生了什么,你总是可以试试它的临时版本库。

    具有我不知道的本地更改的任何用户是否有资格在git pull上发生合并失败?

    绝对如上所述。

    我在这里错过了什么?

    避免重写历史(几乎)所有成本!


    正如其他答案评论中提到的那样,实际上每个提交都是唯一的,重写历史记录会提交新的提交。

    你可以把它看作是切掉一棵树的树枝,然后立即增长新树。 他们甚至可能看起来一样但不是。 是的,巫术魔法。 在这个比喻中,回复几乎就像支持一个日志下降的分支一样,所以它会在不下降的情况下增长。

    这导致我们有几个很好的理由来重写历史:

  • 在上市之前削减一个私有存储库:例如,创建一个新的本地私有分支,测试,测试,重写和推送。
  • 上市前从私人回购中删除敏感数据。
  • 那些已经揭示了格雷格已经说过的话:如果存储库是公开的(推送提交),重写历史记录将潜在地破坏每个人。 我为什么还主张避免在私人回购中不惜一切代价去做,只是为了保持良好的习惯:所以应该不惜一切代价来避免重写历史 (这意味着在做之前就给予足够的考虑:权衡利弊和利弊!)

    至少有另一个哲学和被忽视的原因: 重写历史是数据丢失 。 诚然, revert的git历史看起来可能比重reset混乱。 但是,如果写得好,所有这些“烂摊子”都可以隐藏在分开的分支中,而且我们仍然可以准确地看到回复完成的位置。 甚至有理由或证据证明为什么这样做。

    回到树的类比,即使你删除支持日志,恢复的分支将显示曲折的曲线,它很漂亮!

    链接地址: http://www.djcxy.com/p/16981.html

    上一篇: What are the practical consequences of rewriting GIT history?

    下一篇: Rollback a Git merge