我们的项目已经使用Git了一个星期左右,现在,我们都享受了很多(在紧密协作组使用它原来是一个完全不同的混帐的经验)。 为了让事情尽可能的简单,我们不做任何重定基或历史的修改。 但是,我们确实做的第一周犯了一些错误。 一些提交所做的不应该做的,我们设法一个特性分支合并到错误的集成分支(1.1而不是1.0)。 而且,我们也没有发现这些事情,直到他们长到我们的历史。
现在我看到很多关于改写历史的警告,但我真的不知道我了解所涉及的危险。 我们使用一个共享的裸库,与各分公司都进行备份推那里。
我希望,如果你改写历史(比如删除提交),随后提交的完整列表,将“失去”该承诺(也许不是编译/工作)。 我也期待,如果出现这种情况我居然可以选择在历史上解决这一问题(和刚刚离开那段历史非编译)。
- 如果我改写历史(一切编译所有受影响的分支/工作),我的同事需要做任何特殊的命令)? (换句话说,将他们“知道,我已经做到了,”如果我做到了呢?)
- 将用我不知道有资格上的git拉合并失败本地更改任何用户?
- 我错过了什么重要的吗?
到文章任何引用/关于这个主题的教程也将是非常好的。
必读是与重写历史问题 Git的用户手册中的
如果我改写历史(一切编译所有受影响的分支/工作),我的同事需要做任何特殊的命令(例如将他们“知道,我已经做到了,”如果我做得很好?)?
他们就知道了,Git会告诉他们毫不含糊, 什么是错。 他们将获得意外的错误消息,并且可能在试图解决导致合并冲突的过程中,无意中恢复以前的提交。 这个问题创建一个真正的消息,如果你很好奇,看看会发生什么,你总是可以尝试在你的资料库的临时副本。
将用我不知道有资格上的git拉合并失败本地更改任何用户?
当然,见上面。
我错过了什么重要的吗?
避免在(几乎)所有的成本,改写历史!
正如在其他的答案评论中提到,在实践中每一个提交都是独特的,重写历史将作出新的提交。
你可以把它看作切断分支的树,然后瞬间增长新的。 他们甚至可能看起来相同,但都没有。 是的,巫术。 在这个比喻中, 需要恢复的是几乎像支持下降分支有日志,因此它会增加它的方式,没有倒下。
这导致我们几个很好的理由改写历史 :
- 瘦下来上市前的私人仓库:例如,创建一个新的本地私有分支,测试,测试,改写,推。
- 在上市之前,从私人回购删除敏感数据。
那些已经揭示了什么格雷格已经说过:改写历史将有可能搞砸了大家 ,如果存储库是公共的(被推送的提交)。 之所以我也主张在避免甚至在私人回购一切代价这样做,只是为了保持良好的习惯:所以重写历史应该不惜一切代价避免 (这意味着在这样做之前,只是给予足够的考虑:体重可达利弊和缺点!)
而至少有另一种哲学和忽视的原因: 改写历史的数据丢失 。 诚然,有一个git历史revert
看起来混乱比reset
之一。 但是,如果正确地编写,所有的“烂摊子”,可以在分离的分支隐藏起来,而我们仍然可以在复归做什么点正是看到。 甚至与理由或证据,为什么它做。
回到树的比喻,即使你删除了支撑日志,并将还原后的分支将显示蜿蜒成长曲线,它是美丽的!